제출 #939088

#제출 시각아이디문제언어결과실행 시간메모리
939088vjudge1Job Scheduling (CEOI12_jobs)C++17
0 / 100
1102 ms65536 KiB
#include<stdio.h> #include<stdlib.h> int hi(int a,int b){return a>b?a:b;} unsigned X=12345;int rand_(){return(X*=3)>>1;} #define N 1<<20 int alc,A[N],B[N],L[N],R[N],S[N]; int tt(int x) { int p=++alc; A[p]=x; B[p]=rand_(); L[p]=R[p]=0; S[p]=1; return p; } void ts(int v,int*l,int*r,int k) { if(!v){*l=*r=0;return;} if(S[L[v]]+1<=k) { ts(R[v],R+v,r,k-S[L[v]]-1); *l=v; } else { ts(L[v],l,L+v,k); *r=v; } S[v]=S[L[v]]+S[R[v]]+1; } void tm(int*v,int l,int r) { if(!l||!r){*v=l^r;return;} if(B[l]>B[r]) { tm(L+r,l,L[r]); *v=r; } else { tm(R+l,R[l],r); *v=l; } S[*v]=S[L[*v]]+S[R[*v]]+1; } int to(int v,int k) { if(!v)return 0; if(A[v]<=k)return 1+S[L[v]]+to(R[v],k); return to(L[v],k); } int n,m,d,a[1<<20],ao,b[1<<20],*eh[N],eo[N]; void append(int i,int j) { int o=eo[i]++; if(o>=2&&(o&(o-1))==0)eh[i]=(int*)realloc(eh[i],2*o*sizeof**eh); eh[i][o]=j; } void tp(int v) { if(!v)return; tp(L[v]); printf(" %d ", A[v]); tp(R[v]); } int main() { scanf("%d%d%d",&n,&d,&m); for (int i=1;i<N;++i)eh[i]=(int*)malloc(2*sizeof**eh); for (int i=1;i<=m;++i)scanf("%d",b+i),append(b[i],i); for(int i=1;i<=n-d;++i)for(int j=0;j<eo[i];++j)a[ao++]=eh[i][j]; int l=1,r=m; while(l<=r) { int o=(l+r)>>1,ok=1,t=alc=0; for (int i=1;i<=o;++i)tm(&t,t,tt(1)); for(int i=1;ok&&i<=n-d;++i) { //if(o==2) { printf(" Day %d (%d)\n",i,eo[i]); } for(int j=0;ok&&j<eo[i];++j) { int ded=i+d; int t1,t2,t3,t4,cc=to(t,ded); if(cc==0){ok=0;break;} ts(t,&t3,&t4,cc); ts(t3,&t2,&t1,cc-1); if(A[t1]<i)A[t1]=i; ++A[t1]; tm(&t3,t2,t4); int dd=to(t3,A[t1]); ts(t3,&t2,&t4,dd); tm(&t3,t2,t1); tm(&t,t3,t4); //if(o==2) { tp(t); puts(""); } } } if(ok) r=o-1; else l=o+1; } alc=0; int t=0; for(int i=1;i<=r+1;++i)tm(&t,t,tt(1)); for(int i=1;i<=n-d;++i) { for(int j=0;j<eo[i];++j) { int ded=d+i,t1,t2,t3,t4,cc=to(t,ded); ts(t,&t3,&t4,cc); ts(t3,&t2,&t1,cc-1); if(A[t1]<i)A[t1]=i; //printf(" : %d AT %d\n",eh[i][j],A[t1]); append(100001+(A[t1]++),eh[i][j]); tm(&t3,t2,t4); int dd=to(t3,A[t1]); ts(t3,&t2,&t4,dd); tm(&t3,t2,t1); tm(&t,t3,t4); } } printf("%d\n",r+1); for(int i=1;i<=n;++i) { //printf("%d",eo[i+100001]); for (int j = 0; j < eo[i+100001];++j)printf("%d ",eh[i+100001][j]); puts("0"); } } /* 8 2 12 1 2 4 2 1 3 5 6 2 3 6 4 */

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

jobs.cpp: In function 'int main()':
jobs.cpp:76:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   76 |     scanf("%d%d%d",&n,&d,&m);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~
jobs.cpp:78:32: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   78 |     for (int i=1;i<=m;++i)scanf("%d",b+i),append(b[i],i);
      |                           ~~~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...