Submission #5995

#TimeUsernameProblemLanguageResultExecution timeMemory
5995model_code즐거운 채소 기르기 (JOI14_growing)C++98
100 / 100
324 ms12220 KiB
#include <cstdio> #include <cstdlib> #include <algorithm> int N; int segt[2250000]; void add(int id,int lf,int rg,int plc) { if(lf>plc||rg<plc) return; if(lf==rg&&lf==plc) { segt[id]=1; return; } int hf=(lf+rg)/2; add(id*2+1,lf,hf,plc); add(id*2+2,hf+1,rg,plc); segt[id]=segt[id*2+1]+segt[id*2+2]; } int calc(int id,int lf,int rg,int callf,int calrg) { if(lf>calrg||rg<callf) return 0; if(callf<=lf&&calrg>=rg) return segt[id]; int hf=(lf+rg)/2; return calc(id*2+1,lf,hf,callf,calrg)+calc(id*2+2,hf+1,rg,callf,calrg); } typedef struct { int vl; int plc; }plts; plts plt[300002]; /* int cmp(const void *ka,const void *kb) { plts *a=(plts *)ka; plts *b=(plts *)kb; if(a->vl!=b->vl) return b->vl-a->vl; return a->plc-b->plc; }*/ int cmp(const plts &a,const plts &b) { if(a.vl!=b.vl) return a.vl > b.vl; return a.plc < b.plc; } int getmin(int a,int b) { if(a>b) return b; return a; } int main() { scanf("%d",&N); for(int i=0;i<2250000;i++) segt[i]=0; for(int i=0;i<N;i++) { scanf("%d",&plt[i].vl); plt[i].plc=i+1; } //qsort(plt,N,sizeof(plts),cmp); std::sort(plt, plt+N, cmp); long long sol=0; int nw=0; while(nw<N) { int nvl=plt[nw].vl; int nwb=nw; while(nw<N) { if(plt[nw].vl!=nvl) break; sol+=getmin(calc(0,1,N,1,plt[nw].plc),calc(0,1,N,plt[nw].plc,N)); nw++; } while(nwb<nw) { add(0,1,N,plt[nwb].plc); nwb++; } } printf("%lld\n",sol); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...