牛客IOI周賽20-普及組-D 夾縫中求和(線性優化)
輸入
5 2 4
1 4 2 2 1
輸出
6
題意很簡單。
思路:最簡單的直接暴力O(n^2)直接T飛
正解:x-ai<=aj<=y-ai二分查詢aj最小pos和最大pos,然後累加,時間複雜度O(nlogn)
//這個學習別人的解法
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+10;
int main(){
ll a, x, y;
cin >> a >> x >> y;
vector<ll>v(a);
for (int i = 0; i < a; i++) cin >> v[i];
sort(v.begin(), v.end());
ll ans = 0;
//x-ai<=aj<=y-ai
for(int i=0;i<v.size();i++){
int S = lower_bound(v.begin() + i + 1, v.end(), x - v[i])-v.begin();
int E = upper_bound(v.begin() + i + 1, v.end(), y - v[i]) - v.begin();
ans += (E - S);
}
cout << ans << endl;
return 0;
}
隊友寫法,感覺更優秀,省去了一些不必要的計算:隊友真強
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
ll n,x,y,a[N],ans1,ans2;
int main(){
scanf("%lld%lld%lld",&n,&x,&y);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
sort(a+1,a+1+n);
ll l=1,r=n;
while(l<r){
while(l<r&&a[l]+a[r]>=x)r--;
if(l<r)ans1+=r-l;
l++;
}
l=1,r=n;
while(l<r){
while(l<r&&a[l]+a[r]>y)r--;
if(l<r)ans2+=r-l;
l++;
}
cout<<ans2-ans1<<endl;
return 0;
}
相關文章
- 牛客周賽 Round 65(D)
- 牛客周賽48
- 牛客小白周賽9
- 牛客周賽 Round 40
- 牛客周賽 Round 38
- 牛客周賽 Round 57
- 牛客周賽 Round 56
- 牛客周賽 Round 47
- 牛客周賽Ronud 46
- 牛客周賽 Round 8
- 牛客周賽 Round 63
- 牛客周賽 Round 1
- 牛客周賽 Round 3
- 牛客周賽 Round 7
- 牛客周賽 Round 67 F
- 牛客周賽 Round 67 A~F
- 牛客周賽 Round 66 G
- “現代汽車中國前瞻軟體賽杯” 牛客周賽 Round 43 D、E
- 【牛客訓練記錄】牛客周賽 Round 69
- 【牛客訓練記錄】牛客周賽 Round 70
- 牛客周賽 Round 66 題解
- 牛客小白月賽104(A~D)
- 牛客小白月賽98 A~D
- 牛客周賽 Round 62 全部題解
- 牛客周賽 Round 70 A~G 題解
- 牛客周賽 Round 36 (小白練習記)
- 牛客周賽47 (待補F和思路)
- 2020牛客NOIP賽前集訓營-普及組(第一場) 牛牛的跳跳棋
- 牛客周賽Round 67 個人題解(A~F)
- 牛客練習賽73 D題:離別
- 牛客周賽 Round 50 D[小紅的因式分解] 超級無敵大暴力
- 牛客周賽49 F 嚶嚶不想找最小喵
- 2020牛客NOIP賽前訓練營-普及組第一場牛牛的跳跳棋題解
- P2671 [NOIP2015 普及組] 求和
- 【10.24 牛客普及(四)】 卡片 題解
- 【10.22 牛客普及(三)】 牛半仙的妹子gcd 題解GC
- 牛客練習賽
- 牛客周賽 Round 40 (小白醬的被虐之旅嗚嗚嗚)