제출 #17983

#제출 시각아이디문제언어결과실행 시간메모리
17983comet코끼리 (Dancing Elephants) (IOI11_elephants)C++98
26 / 100
133 ms23216 KiB
#include <cstdio> #include <algorithm> using namespace std; int N,M,L; int B=400; void renewal(); struct group{ int sz,p[710],cnt[710],nxt[710]; group():sz(0){} void init(){ int id=sz-1; for(int i=sz-1;i>=0;i--){ if(p[sz-1]-p[i]<=L)cnt[i]=1,nxt[i]=p[i]+L+1; else{ while(p[id]-p[i]>L)id--; cnt[i]=cnt[id+1]+1; nxt[i]=nxt[id+1]; } } } void push(int x){ int id=0; while(p[id]<=x&&id<sz)id++; sz++; for(int i=sz-1;i>id;i--)p[i]=p[i-1]; p[id]=x; init(); if(sz>700)renewal(); } void pop(int x){ int id=0; while(p[id]<=x)id++; for(int i=id;i<sz;i++)p[i-1]=p[i]; sz--; init(); if(sz==0)renewal(); } }a[500]; struct elephant{ int p,group_id,id; bool operator<(const elephant& r)const{ return p<r.p; } }b[150010]; int ID[150010]; void renewal(){ sort(b,b+N); for(int i=0;i<N;i++){ ID[b[i].id]=i; a[i/B].p[a[i/B].sz++]=b[i].p; b[i].group_id=i/B; M=max(M,i/B+1); } for(int i=0;i<M;i++){ a[i].init(); } /* for(int i=0;i<N;i++)printf("%d ",ID[i]); for(int i=0;i<N;i++)printf("%d ",b[i].group_id); puts(""); for(int i=0;i<M;i++){ for(int j=0;j<a[i].sz;j++){ printf("(%d,%d,%d) ",a[i].p[j],a[i].cnt[j],a[i].nxt[j]); } puts(""); } */ } void init(int N_, int L_, int X[]){ N=N_; L=L_; for(int i=0;i<N;i++)b[i]=elephant{X[i],i/B,i}; renewal(); } int findGroup(int x){ if(a[0].p[0]>x)return 0; for(int i=0;i<M;i++) if(a[i].p[0]<=x&&a[i].p[a[i].sz-1]>=x) return i; return M-1; } int calc(){ int x=0,ret=0; for(int i=0;i<M;i++){ int id=lower_bound(a[i].p,a[i].p+a[i].sz,x)-a[i].p; if(id==a[i].sz)continue; ret+=a[i].cnt[id]; x=a[i].nxt[id]; } return ret; } int update(int i, int y){ int id=b[ID[i]].group_id; a[id].pop(b[ID[i]].p); b[ID[i]].p=y; id=b[i].group_id=findGroup(y); a[id].push(b[ID[i]].p); /* for(int i=0;i<N;i++)printf("%d ",ID[i]); for(int i=0;i<N;i++)printf("%d ",b[i].group_id); puts(""); for(int i=0;i<M;i++){ for(int j=0;j<a[i].sz;j++){ printf("(%d,%d,%d) ",a[i].p[j],a[i].cnt[j],a[i].nxt[j]); } puts(""); } */ return calc(); }
#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...