제출 #986386

#제출 시각아이디문제언어결과실행 시간메모리
986386Pyqe팀들 (IOI15_teams)C++17
77 / 100
942 ms437872 KiB
#include "teams.h" #include <bits/stdc++.h> using namespace std; #define mp make_pair #define fr first #define sc second int n,nsg=0,nn,fq[500069],la[10000069],ra[10000069],sma[10000069],pa[10000069][2],sg[500069],inf=1e9; pair<int,int> a[2][500069],sk[200069]; void bd(int ix,int lh,int rh) { la[ix]=lh; ra[ix]=rh; sma[ix]=0; if(la[ix]!=ra[ix]) { int ii,md=(la[ix]+ra[ix])/2; for(ii=0;ii<2;ii++) { nsg++; pa[ix][ii]=nsg; bd(nsg,!ii?la[ix]:md+1,!ii?md:ra[ix]); } } } void ud(int ix,int x,int w) { if(la[ix]>=x&&ra[ix]<=x) { sma[ix]+=w; } else { int ii,jj,p; for(ii=0;ii<2;ii++) { p=pa[ix][ii]; if(la[p]<=x&&ra[p]>=x) { nsg++; la[nsg]=la[p]; ra[nsg]=ra[p]; sma[nsg]=sma[p]; for(jj=0;jj<2;jj++) { pa[nsg][jj]=pa[p][jj]; } pa[ix][ii]=nsg; ud(nsg,x,w); } } sma[ix]=sma[pa[ix][0]]+sma[pa[ix][1]]; } } int qr(int ix,int lh,int rh,int sr) { if(la[ix]>rh||ra[ix]<lh) { return 0; } else if(la[ix]>=lh&&ra[ix]<=rh) { return sma[ix]-sma[sr]; } else { return qr(pa[ix][0],lh,rh,pa[sr][0])+qr(pa[ix][1],lh,rh,pa[sr][1]); } } int bl(int ix,int x,int sr) { if(la[ix]==ra[ix]) { return la[ix]; } else { int ii,p,p2; for(ii=0;ii<2;ii++) { p=pa[ix][ii]; p2=pa[sr][ii]; if(x<=sma[p]-sma[p2]) { return bl(p,x,p2); } x-=sma[p]-sma[p2]; } return -1; } } void init(int on,int laa[],int raa[]) { int i,ii,k,l; n=on; for(i=1;i<=n;i++) { k=laa[i-1]; l=raa[i-1]; a[0][i]={k,l}; } sort(a[0]+1,a[0]+n+1); for(i=1;i<=n;i++) { l=a[0][i].sc; fq[l]++; a[1][i]={l,fq[l]}; } sort(a[1]+1,a[1]+n+1); for(i=n;i;i--) { l=a[0][i].sc; a[0][i].sc=lower_bound(a[1]+1,a[1]+n+1,mp(l,fq[l]))-a[1]; fq[l]--; } nsg++; sg[0]=nsg; bd(nsg,1,n); for(i=1;i<=n;i++) { l=a[0][i].sc; nsg++; la[nsg]=la[sg[i-1]]; ra[nsg]=ra[sg[i-1]]; sma[nsg]=sma[sg[i-1]]; for(ii=0;ii<2;ii++) { pa[nsg][ii]=pa[sg[i-1]][ii]; } sg[i]=nsg; ud(nsg,l,1); } } int can(int sz,int qq[]) { int i,k,l,w,sm; sort(qq,qq+sz); nn=0; for(i=0;i<sz;i++) { sm=qq[i]; k=upper_bound(a[0]+1,a[0]+n+1,mp(sm,inf))-a[0]-1; l=lower_bound(a[1]+1,a[1]+n+1,mp(sm,0))-a[1]-1; for(;nn;nn--) { w=qr(sg[k],l+1,sk[nn].sc-1,sg[sk[nn].fr]); if(w>sm) { break; } l=max(l,sk[nn].sc); sm-=w; } l=bl(sg[k],qr(sg[k],1,l,sg[sk[nn].fr])+sm,sg[sk[nn].fr]); if(l==-1) { return 0; } nn++; sk[nn]={k,l}; } return 1; }

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

teams.cpp: In function 'void init(int, int*, int*)':
teams.cpp:124:54: warning: conversion from 'long int' to 'int' may change value [-Wconversion]
  124 |   a[0][i].sc=lower_bound(a[1]+1,a[1]+n+1,mp(l,fq[l]))-a[1];
      |              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
teams.cpp: In function 'int can(int, int*)':
teams.cpp:155:49: warning: conversion from 'long int' to 'int' may change value [-Wconversion]
  155 |   k=upper_bound(a[0]+1,a[0]+n+1,mp(sm,inf))-a[0]-1;
      |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
teams.cpp:156:47: warning: conversion from 'long int' to 'int' may change value [-Wconversion]
  156 |   l=lower_bound(a[1]+1,a[1]+n+1,mp(sm,0))-a[1]-1;
      |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...