Submission #500306

#TimeUsernameProblemLanguageResultExecution timeMemory
500306MilosMilutinovicSails (IOI07_sails)C++14
100 / 100
581 ms4748 KiB
#include <bits/stdc++.h> using namespace std; const int N=100050; const int M=2*N; int n,h[N],k[N],ord[N]; int root,tsz,ls[M],rs[M],st[M]; void Set(int&c,int ss,int se,int qs,int qe,int x){ if(!c)c=++tsz; if(ss>se||ss>qe||se<qs)return; if(qs<=ss&&se<=qe){st[c]+=x;return;} int mid=ss+se>>1; Set(ls[c],ss,mid,qs,qe,x); Set(rs[c],mid+1,se,qs,qe,x); } int Get(int c,int ss,int se,int qi){ if(!c||ss>se||se<qi||ss>qi)return 0; if(ss==se)return st[c]; int mid=ss+se>>1; return Get(ls[c],ss,mid,qi)+Get(rs[c],mid+1,se,qi)+st[c]; } int FindL(int v,int mx){ int l=1,r=mx,pos=mx; while(l<=r){ int mid=l+r>>1; if(Get(root,1,N,mid)<=v)pos=mid,r=mid-1; else l=mid+1; } assert(pos!=-1); return pos; } int FindR(int v,int mx){ int l=1,r=mx,pos=mx; while(l<=r){ int mid=l+r>>1; if(Get(root,1,N,mid)>=v)pos=mid,l=mid+1; else r=mid-1; } assert(pos!=-1); return pos; } int main(){ scanf("%i",&n); for(int i=1;i<=n;i++)scanf("%i %i",&h[i],&k[i]),ord[i]=i; sort(ord+1,ord+1+n,[&](int i,int j){return h[i]<h[j];}); for(int i=1;i<=n;i++){ int j=ord[i]; int v=Get(root,1,N,h[j]-k[j]+1); int L=FindL(v,h[j]),R=FindR(v,h[j]); if(R==h[j]){ Set(root,1,N,L,L+k[j]-1,1); }else{ Set(root,1,N,R+1,h[j],1); k[j]-=(h[j]-R); Set(root,1,N,L,L+k[j]-1,1); } } long long ans=0; for(int i=1;i<=N;i++){ long long c=Get(root,1,N,i); ans+=c*(c-1)/2; } printf("%lld",ans); return 0; }

Compilation message (stderr)

sails.cpp: In function 'void Set(int&, int, int, int, int, int)':
sails.cpp:11:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   11 |  int mid=ss+se>>1;
      |          ~~^~~
sails.cpp: In function 'int Get(int, int, int, int)':
sails.cpp:18:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   18 |  int mid=ss+se>>1;
      |          ~~^~~
sails.cpp: In function 'int FindL(int, int)':
sails.cpp:24:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   24 |   int mid=l+r>>1;
      |           ~^~
sails.cpp: In function 'int FindR(int, int)':
sails.cpp:34:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   34 |   int mid=l+r>>1;
      |           ~^~
sails.cpp: In function 'int main()':
sails.cpp:42:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   42 |  scanf("%i",&n);
      |  ~~~~~^~~~~~~~~
sails.cpp:43:28: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   43 |  for(int i=1;i<=n;i++)scanf("%i %i",&h[i],&k[i]),ord[i]=i;
      |                       ~~~~~^~~~~~~~~~~~~~~~~~~~~
#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...