Submission #1306728

#TimeUsernameProblemLanguageResultExecution timeMemory
1306728KhoaDuyPairs (IOI07_pairs)C++20
100 / 100
51 ms8324 KiB
#include<bits/stdc++.h> using namespace std; #define endl '\n' #define ll long long struct fenwick{ vector<int> bit; void build(int n){ bit.assign(n+1,0); } void update(int i,int x){ for(;i<bit.size();i+=(i&(-i))){ bit[i]+=x; } } int query(int i){ int curr=0; for(;i;i-=(i&(-i))){ curr+=bit[i]; } return curr; } int range(int l,int r){ l=max(l,1); r=min(r,(int)bit.size()-1); if(l>r){ return 0; } return (query(r)-query(l-1)); } }; struct presum{ int pre[151][151]; void build(vector<pair<int,int>> v){ memset(pre,0,sizeof(pre)); for(int i=0;i<v.size();i++){ assert(1<=v[i].first&&v[i].first<=150); assert(1<=v[i].second&&v[i].second<=150); pre[v[i].first][v[i].second]++; } for(int i=1;i<=150;i++){ for(int j=1;j<=150;j++){ pre[i][j]=(pre[i][j]+pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1]); } } } int query(int x,int y){ if(x<=0||y<=0){ return 0; } x=min(x,150),y=min(y,150); return pre[x][y]; } int range(int x1,int y1,int x2,int y2){ return (query(x2,y2)-query(x1-1,y2)-query(x2,y1-1)+query(x1-1,y1-1)); } }; signed main(){ if(fopen("input.txt","r")){ freopen("input.txt","r",stdin); } ios_base::sync_with_stdio(false); cin.tie(NULL); int b,n,d,m; cin >> b >> n >> d >> m; if(b==1){ vector<int> v(n); for(int i=0;i<n;i++){ cin >> v[i]; } sort(v.begin(),v.end()); int ptr=-1; ll ans=0; for(int i=0;i<n;i++){ while(ptr+1<i&&v[i]-v[ptr+1]>d){ ptr++; } ans+=(i-1-ptr); } cout << ans << endl; return 0; } if(b==2){ vector<pair<int,int>> v(n); for(int i=0;i<n;i++){ cin >> v[i].first >> v[i].second; v[i]={v[i].first-v[i].second,v[i].first+v[i].second}; } fenwick bit; bit.build(2*m); sort(v.begin(),v.end()); int ptr=-1; ll ans=0; for(int i=0;i<n;i++){ while(ptr+1<n&&v[i].first-v[ptr+1].first>d){ ptr++; bit.update(v[ptr].second,-1); } ans+=bit.range(v[i].second-d,v[i].second+d); bit.update(v[i].second,1); } cout << ans << endl; return 0; } ll ans=0; vector<vector<pair<int,int>>> group(m+1); for(int i=0;i<n;i++){ int x,y,z; cin >> x >> y >> z; group[z].push_back({x-y+m,x+y}); } presum pre[m+1]; for(int i=1;i<=m;i++){ vector<pair<int,int>> v=group[i]; fenwick bit; bit.build(2*m); sort(v.begin(),v.end()); int ptr=-1; n=v.size(); for(int i=0;i<n;i++){ while(ptr+1<n&&v[i].first-v[ptr+1].first>d){ ptr++; bit.update(v[ptr].second,-1); } ans+=bit.range(v[i].second-d,v[i].second+d); bit.update(v[i].second,1); } pre[i].build(v); } for(int z=1;z<=m;z++){ for(pair<int,int> &bruh:group[z]){ int x=bruh.first,y=bruh.second; for(int z2=z-1;z2>=1&&z-z2<=d;z2--){ int limit=d-(z-z2); ans+=pre[z2].range(x-limit,y-limit,x+limit,y+limit); } } } cout << ans << endl; }

Compilation message (stderr)

pairs.cpp: In function 'int main()':
pairs.cpp:59:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   59 |         freopen("input.txt","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...