제출 #66627

#제출 시각아이디문제언어결과실행 시간메모리
66627zetapi코끼리 (Dancing Elephants) (IOI11_elephants)C++14
26 / 100
9071 ms4276 KiB
//#include<elephants.h> #include <bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair #define ll long long #define itr ::iterator typedef pair<int,int> pii; const int MAX=6e6; const int ROOT=50; vector<pii> blocks; ll dp[MAX],BlockNumber[MAX],Index[1100][1100]; ll N,K,qcnt,ptr,start,pos[MAX],nxt[MAX],pre[MAX],arr[MAX]; void recalculate(ll idx) { for(int A=1;Index[idx][A]>0;A++) Index[idx][A]=0; ll start_=blocks[idx].first,end_=blocks[idx].second,lol=start_,lop=1; pre[start_]=0; Index[idx][1]=start_; for(int A=nxt[start_];A!=nxt[end_];A=nxt[A]) { pre[A]=lol; lol=A; Index[idx][++lop]=A; } ll cov=end_,cnt=1; for(int A=end_;A>0;A=pre[A]) { if(arr[cov]-arr[A]>K) { cov=A; ++cnt; } dp[A]=cnt; } /*cout<<arr[end_]<<"\n"; for(int A=start;A>0;A=nxt[A]) cout<<arr[A]<<" "; cout<<"\n";*/ return ; } void build() { blocks.clear(); ll lol=0; for(int A=0;A<=ROOT;A++) for(int B=0;Index[A][B]>0;B++) Index[A][B]=0; for(int A=start;A>0;A=nxt[A]) { BlockNumber[A]=blocks.size(); Index[BlockNumber[A]][++lol]=A; if(lol==ROOT or nxt[A]==0) { blocks.pb(mp(Index[BlockNumber[A]][1],A)); lol=0; } } for(int A=0;A<blocks.size();A++) recalculate(A); return ; } void remove(ll idx,ll val) { if(idx==start) { start=nxt[start]; blocks[0].first=start; recalculate(BlockNumber[idx]); return ; } for(int A=start;nxt[A]>0;A=nxt[A]) { if(nxt[A]==idx) { nxt[A]=nxt[nxt[A]]; if(idx==blocks[BlockNumber[idx]].first) blocks[BlockNumber[idx]].first=nxt[A]; else if(idx==blocks[BlockNumber[idx]].second) blocks[BlockNumber[idx]].second=A; break; } } recalculate(BlockNumber[idx]); return ; } void insert(ll idx,ll val) { if(val<=arr[start]) { nxt[idx]=start; start=idx; BlockNumber[idx]=0; blocks[0].first=start; recalculate(BlockNumber[idx]); } else { ll lol=start; for(int A=start;A>0;A=nxt[A]) if(val>=arr[A]) lol=A; nxt[idx]=nxt[lol]; nxt[lol]=idx; BlockNumber[idx]=BlockNumber[lol]; if(lol==blocks[BlockNumber[lol]].second) blocks[BlockNumber[lol]].second=idx; recalculate(BlockNumber[idx]); } return ; } ll count(int f,int s) { int cop=start,res=1; for(int A=start;A>0;A=nxt[A]) { if(arr[A]-arr[cop]>K) { cop=A; ++res; } } return res; } void init(int n,int l,int X[]) { N=n; K=l; ptr=n; start=1; for(int A=1;A<=N;A++) { pos[A]=A; nxt[A]=A+1; arr[A]=X[A-1]; } nxt[N]=0; build(); return ; } int update(int i,int y) { if(N==1) return 1; ++i; ++ptr; ++qcnt; remove(pos[i],y); pos[i]=ptr; arr[ptr]=y; insert(pos[i],y); // if(qcnt%ROOT==0) // { // qcnt=0; // build(); // } for(int A=0;A<blocks.size()-1;A++) assert(nxt[blocks[A].second]==blocks[A+1].first); int cur=start; for(int A=0;A<blocks.size();A++) { recalculate(A); for(int B=1;Index[A][B]>0;B++) { assert(Index[A][B]==cur and arr[Index[A][B]]>=arr[Index[A][B-1]]); cur=nxt[cur]; } } assert(cur==0); return count(0,-1); }

컴파일 시 표준 에러 (stderr) 메시지

elephants.cpp: In function 'void build()':
elephants.cpp:69:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int A=0;A<blocks.size();A++)
              ~^~~~~~~~~~~~~~
elephants.cpp: In function 'int update(int, int)':
elephants.cpp:172:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int A=0;A<blocks.size()-1;A++)
                ~^~~~~~~~~~~~~~~~
elephants.cpp:175:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int A=0;A<blocks.size();A++)
                ~^~~~~~~~~~~~~~
#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...