CodeChef submission 130297 (C++ 4.0.0-8) plaintext list. Status: WA, problem J7, contest NOV09. By balakrishnan_v (Balakrishnan Varadarajan), 2009-11-11 04:47:56.
#include <stdio.h> #include <math.h> #include <stdlib.h> #include <time.h> int D,S; int B[502]; bool M[502][502]; int T[502]; int l[501][502]; int dl[501][502]; int nextl[501][502]; int nextdl[501][502]; bool nextthere[501][502]; int gains[501][502]; bool there[501][502]; int optswaps[501][502]; int numexts[501]; int totgains[502]; int satis[502*501]; int kval[502*501]; int swapval[502*501]; bool answer[502]; int likes[502]; int dislikes[502]; int width; int kcurr; bool diff[90][90][502]; int distance[90][90]; int max(int a,int b){return a>b?a:b;} int min(int a,int b){return a<b?a:b;} int main() { for(int i=0;i<D;i++) for(int i=0;i<D;i++) for(int j=0;j<S;j++) for(int i=0;i<D;i++) { l[0][i]=0; dl[0][i]=0; } for(int i=0;i<S;i++) there[0][i]=0; satis[0]=0; swapval[0]=-1; width=500; kcurr=1; int maxsatis=-1; for(int iters=1;iters<=30;iters++) { if(iters==2) width=400; if(iters>2) width=50; for(int i=0;i<=D;i++) totgains[i]=0; if(iters>=4) { for(int i=0;i<kcurr;i++) for(int j=0;j<kcurr;j++) { distance[i][j]=0; for(int k=0;k<S;k++) { diff[i][j][k]=there[i][k]^there[j][k]; distance[i][j]+=there[i][k]^there[j][k]; } } } for(int i=0;i<kcurr;i++) { //printf("%d\n",iters); // printf("%d %d %d %d %d\n",there[i][0],there[i][1],there[i][2],there[i][3],there[i][4]); //printf("%d %d %d %d\n",l[i][0],l[i][1],l[i][2],l[i][3]); //printf("%d %d %d %d\n",dl[i][0],dl[i][1],dl[i][2],dl[i][3]); // printf("------------------\n"); for(int j=0;j<S;j++) { gains[i][j]=1000; if(j==swapval[i]) continue; if(iters==2 && swapval[i]>j) continue; bool repeat=0; if(iters>=4) { for(int k=0;k<i;k++) { if(distance[i][k]==2 && diff[i][k][j]) { repeat=1; //printf("sdfsdf\n"); break; } } } if(repeat) continue; gains[i][j]=satis[i]; for(int k=0;k<D;k++) { if(there[i][j])//going to remove { if(M[k][j] && l[i][k]==1 && dl[i][k]<B[k]) gains[i][j]--; if(!M[k][j] && l[i][k]>0 && dl[i][k]==B[k]) gains[i][j]++; } else//going to add { if(M[k][j] && l[i][k]==0 && dl[i][k]<B[k]) gains[i][j]++; if(!M[k][j] && l[i][k]>0 && dl[i][k]==B[k]-1) gains[i][j]--; } } //printf("%d %d %d %d %d swapping %d initial=%d g=%d ,%d %d,iters=%d\n",there[i][0],there[i][1],there[i][2],there[i][3],there[i][4],j,satis[i],gains[i][j],dl[i][0],l[i][0],iters); totgains[D-gains[i][j]]++; } } //gains can be from 0 to +D for(int i=1;i<=D;i++) { //printf("%d %d\n",i,totgains[i]); totgains[i]+=totgains[i-1];//cumulative frequency } int size=totgains[D]; //printf("size=%d\n",size); for(int i=0;i<kcurr;i++) { for(int j=0;j<S;j++)//bucket sort { if(gains[i][j]>D) continue; //else // { // printf("%d %d\n",i,j); // } satis[totgains[D-gains[i][j]]-1]=gains[i][j]; kval[totgains[D-gains[i][j]]-1]=i; swapval[--totgains[D-gains[i][j]]]=j; } } int up=min(width,size)-1; //printf("%d %d\n",up,totgains[D-satis[up]+1]-1); //up=min(totgains[D-satis[up]+1]-1,40); for(int i=0;i<=up;i++) { for(int j=0;j<S;j++) { nextthere[i][j]=there[kval[i]][j]; //printf("%d,",there[kval[i]][j]); } int j=swapval[i]; for(int k=0;k<D;k++) { nextl[i][k]=l[kval[i]][k]; nextdl[i][k]=dl[kval[i]][k]; } for(int k=0;k<D;k++) { if(nextthere[i][j] && M[k][j]) nextl[i][k]=l[kval[i]][k]-1; if(nextthere[i][j] && !M[k][j]) nextdl[i][k]=dl[kval[i]][k]-1; if(!nextthere[i][j] && M[k][j]) nextl[i][k]=l[kval[i]][k]+1; if(!nextthere[i][j] && !M[k][j]) nextdl[i][k]=dl[kval[i]][k]+1; } nextthere[i][j]=!nextthere[i][j]; } for(int i=0;i<=up;i++) { for(int j=0;j<S;j++) there[i][j]=nextthere[i][j]; for(int k=0;k<D;k++) { l[i][k]=nextl[i][k]; dl[i][k]=nextdl[i][k]; } if(satis[i]>maxsatis) { for(int j=0;j<S;j++) answer[j]=there[i][j]; for(int j=0;j<D;j++) { likes[j]=l[i][j]; dislikes[j]=dl[i][j]; } maxsatis=satis[i]; } } kcurr=up-1; } int tot=0; for(int i=0;i<S;i++) { tot+=answer[i]; } for(int i=0;i<D;i++) { T[i]=1+max(0,tot-B[i]); } int S1[600]; int S2[600]; int val=maxsatis; for(int iters=1;iters<=0;iters++) { int inival=val; int S1size=0; for(int i=0;i<D;i++) if(likes[i]==T[i]-1) S1[S1size++]=i; int maxcount=-1; int iopt=-1; for(int i=0;i<S;i++) { if(!answer[i]) { int count=0; for(int j=0;j<S1size;j++) { if(M[S1[j]][i]) { count++; } } if(count>maxcount) { iopt=i; maxcount=count; } } } if(iopt==-1) break; answer[iopt]=1; //printf("--%d %d\n",maxcount,iopt); val+=maxcount; for(int j=0;j<D;j++) { if(M[j][iopt]) likes[j]++; } int S2size=0; for(int i=0;i<D;i++) if(likes[i]==T[i]) S2[S2size++]=i; iopt=-1; maxcount=3000; for(int i=0;i<S;i++) { if(answer[i]) { int count=0; for(int j=0;j<S2size;j++) { if(M[S2[j]][i]) count++; } if(count<maxcount) { iopt=i; maxcount=count; } } } if(iopt==-1) break; answer[iopt]=0; for(int j=0;j<D;j++) { if(M[j][iopt]) likes[j]--; } //printf("^^%d\n",maxcount); val-=maxcount; //printf("%d %d\n",val,inival); if(val==inival) break; } for(int i=0;i<S;i++) if(answer[i]) //printf("satis=%d\n",maxsatis); /*int val=0; for(int i=0;i<D;i++) { int likes=0; int dislikes=0; //printf("error %d\n",l[i]); for(int j=0;j<S;j++) { if(answer[j]) { if(M[i][j]) likes++; else dislikes++; } } //if(likes!=l[i]) //printf("error %d %d %d\n",i,likes,l[i]); if(likes>0 && dislikes<B[i]) val++; } printf("%d\n",val);*/ }
Comments

