| ||||||||||
Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
自己YY了一个很NB的算法,官方数据全秒不过 程序没有判定 无解的情况(还要继续YY),保证有解的情况全部正确,官方所有数据都是有解的。。(最后几组 I don't know 不太清楚,有解的话程序跑出来应该 就没有错) #include<cstring> #include<stdio.h> #include<cmath> #include<algorithm> #include<cstdlib> #include<map> #include<iostream> #include<vector> #include<ctime> using namespace std; int dp[110000],neg,ans,inf=1000000000; struct pp { int id,value,ip; bool operator <(const pp &temp)const { if(value==temp.value) return ip<temp.ip; return value>temp.value; } }; pp maxi[110000],queue[100000][20],tbd[110000],nls[110000],now[110000]; int iden[1000000],nu[110000],size,cnt,num[110000],n,m,mat[110000][11],sum[110000][11],vv[110000],nc[110000],np[110000]; int pos[110000],num_tb,cnt_now,dl[110000],cnt_dl; void ins(int value,int id) { int i,j,s,p,q; if(cnt==0||maxi[0].value==value) { maxi[cnt].id=id; maxi[cnt++].value=value; return; } if(maxi[0].value>value) return; maxi[0].value=value; maxi[0].id=id; cnt=1; } void del(pp list[],int &cnt) { int i,j,s,p,q,nl=0; j=0; for(i=0;i<cnt;i++)//for(j=0;j<num_tb;j++) { if(j<num_tb&&list[i].id==tbd[j].id) j++; else nls[nl++]=list[i]; } cnt=nl; for(i=0;i<cnt;i++) list[i]=nls[i]; } int upper_bound(int id,int x,int y) { if(3*x+y>=neg) return x+y; if(3*(x+dp[id])+y<=neg) return x+dp[id]+neg-3*(x+dp[id]); return neg-2*x;//x+y+neg-3*x-y; } int lower_bound(int id,int x,int y) { if(3*x+y>=neg) return x+y; if(3*(x+dp[id])+y>=neg) return y+(neg-y+2)/3; return x+dp[id]+neg-3*(x+dp[id]); } void insert(int ie,int id,pp now) { int i,j,s,p,q,ip,px,py,nx,ny,x=now.value,y=ie-now.value; if(pos[id]>=0) ip=pos[id]; else { ip=size; iden[size]=now.ip; pos[id]=size++; } if(nu[ip]==0) queue[ip][nu[ip]++]=now; else { if(queue[ip][0].value>now.value) return ; if(queue[ip][0].value<now.value) { queue[ip][0]=now; nu[ip]=1; return; } queue[ip][nu[ip]++]=now; } } int solve() { int i,j,s,p,q,x,y,nx,ny,id,ip; bool ok; memset(pos,-1,sizeof(pos)); memset(nu,0,sizeof(nu)); queue[0][0].id=0; queue[0][0].value=0; queue[0][0].ip=0; iden[0]=0; pos[0]=0; nu[0]=1; size=1; ans=upper_bound(0,0,0); // printf("orz=%d\n",lower_bound(0,0,0)); // printf("dp[0]=%d,neg=%d\n",dp[0],neg); for(i=0;i<n;i++) { cnt_now=0; for(j=0;j<size;j++) { num_tb=0; ok=false; ip=iden[j]+1; for(s=0;s<nu[j];s++) { id=queue[j][s].id; x=queue[j][s].value; if(np[id]==np[i+1]||id==i) { if(id==i) { nx=x; ok=true; } else { int vx=sum[id][0]-sum[i+1][0]; for(p=1;p<m;p++) { if(vx<=sum[id][p]-sum[i+1][p]) break; } if(p>=m) { ok=true; nx=x+1; // if(i==77) // printf("x=%d\n",x); break; } if(lower_bound(i+1,x+1,i-x-ip)>=ans) { // if(x+1==2) // printf("ans=%d\n",ans); tbd[num_tb++]=queue[j][s]; } } } else tbd[num_tb++]=queue[j][s]; } x=nx-1; del(queue[j],nu[j]); //if(nu[j]==0) // puts("orz"); if(ok) { now[cnt_now].id=i+1; now[cnt_now].value=x+1; now[cnt_now].ip=ip; y=i-x-ip; if(y>=0) { ans=min(ans,upper_bound(i+1,x+1,y)); if(lower_bound(i+1,x+1,y)<ans) cnt_now++;// insert(i+1,j+1,now); } } } int nc=0; for(j=0;j<cnt_now;j++) { x=now[j].value; y=i+1-x-now[j].ip; if(lower_bound(i+1,x,y)<ans) now[nc++]=now[j]; } cnt_now=nc; int px,py; for(j=0;j<cnt_now;j++) { x=now[j].value; y=i+1-x-now[j].ip; if(j==0||py>y) { // printf("i=%d,x=%d,y=%d,ip=%d\n",i,x,y,now[j].ip); insert(i+1,now[j].ip,now[j]); px=x; py=y; } } } if(ans==inf) ans=-1; return ans; } int main() { int i,j,s,p,q,id,ww; // freopen("debug\\input.txt","r",stdin); // freopen("debug\\output.txt","w",stdout); scanf("%d%d",&n,&m); for(i=0;i<n;i++) for(j=0;j<m;j++) scanf("%d",&mat[i][j]); memset(dp,0,sizeof(dp)); memset(sum,0,sizeof(sum)); memset(nc,0,sizeof(nc)); memset(np,0,sizeof(np)); neg=0; for(i=n-1;i>=0;i--) { for(j=0;j<m;j++) sum[i][j]=sum[i+1][j]+mat[i][j]; for(j=1;j<m;j++) { if(mat[i][0]<=mat[i][j]) break; } if(j>=m) vv[i]=1; else vv[i]=-1; neg+=vv[i]; nc[i]=nc[i+1]; np[i]=np[i+1]; if(vv[i]<0) nc[i]++; else np[i]++; } if(neg>0) printf("0\n"); else { neg=-neg; neg++; memset(num,0,sizeof(num)); maxi[0].value=0; maxi[0].id=n; cnt=1; for(i=n-1;i>=0;i--) { num_tb=0; for(j=0;j<cnt;j++) { id=maxi[j].id; int vx=sum[i][0]-sum[id][0]; if(np[i]!=np[id]||id==i+1) { ww=0; if(np[i]!=np[id]) tbd[num_tb++]=maxi[j]; //puts("you"); } else//if(np[i]==np[id]) { for(s=1;s<m;s++) { if(vx<=sum[i][s]-sum[id][s]) break; } if(s>=m) ww=1; else ww=0; } if(dp[i]<maxi[j].value+ww) { dp[i]=maxi[j].value+ww; if(ww==1) break; } } del(maxi,cnt); // printf("i=%d,dp=%d,neg=%d\n",i,dp[i],neg); ins(dp[i],i); } // puts("orz"); printf("%d\n",solve()); } // system("pause"); return 0; } /* 5 4 3 0 4 0 5 6 1 0 7 0 0 9 2 0 3 0 4 5 0 0 */ Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator