1. 程式人生 > >CDQZ集訓DAY10 日記

CDQZ集訓DAY10 日記

math gpo 痛苦 %d body pan hid lap pen

  又一次跪了,跪在了神奇的數據範圍上。

  T1上來打完暴力之後覺得是數據結構題,像三維偏序,於是開始往各種數據結構上想,主席樹,線段樹+calc,平衡樹,樹套樹,CDQ……最終在經過一番思考之後選擇去打CDQ,打完之後自己拍了一下,發現我的想法是錯的,考慮了一下轉場。T2好像又是原題,打完暴力之後開始回憶,只記得答案和期望無關,XYZ講過,卡區間去做,然而細節記不住了。T3一開始還以為是子串,覺得還挺容易,結果一看是子序列,打完暴力就跪了。糾結了一下去打T1,又用了半個小時打了一整套線段樹套SPLAY,打完調完發現也行不通,痛苦ing……最後憋住勁查出來了vector沒調庫……

  下午發現分少的可憐,T1暴力65分,我雖然打了,但是由於我當時不知道該不該放那個CDQ的錯解騙分,只將暴力限定在了2000以內,然而題目描述裏小於2000的只有30分啊,雖然常數小但是沒這麽坑人的啊!

  講課仍然不錯,聽的還是挺明白的,除了四邊形不等式優化。

  晚上接著打插頭DP,然而感到了收殺頭DP支配的恐懼……一晚上打一道插頭DP都沒調完。話說3進制到底怎麽玩??

技術分享圖片
 1 #include<iostream>
 2 #include<cmath>
 3 #include<vector>
 4 #include<cstdio>
 5 #include<cstdlib>
 6 #include<cstring>
 7 #include<algorithm>
 8 #define N 9
 9 #define
M 105 10 using namespace std; 11 int n,m; 12 int ma[M][M],b[M]; 13 int f[M][N][3000]; 14 int zt[3000][15],xp[M]; 15 int main() 16 { 17 scanf("%d%d",&m,&n); 18 for(int i=1;i<=n;i++) 19 { 20 for(int j=1;j<=m;j++) 21 { 22 scanf("%d",&ma[i][j]); 23 }
24 } 25 xp[0]=1; 26 for(int i=1;i<=m+1;i++) 27 { 28 xp[i]=xp[i-1]*3; 29 } 30 for(int i=0;i<xp[m+1];i++) b[i]=i%3; 31 int ans=-0x7fffffff; 32 for(int i=1;i<=n;i++) 33 { 34 for(int j=1;j<=m;j++) 35 { 36 int x=xp[j-1],y=xp[j]; 37 for(int k=0;k<xp[m+1];k++) 38 { 39 int p=b[k/x],q=b[k/y],t=k-x*p-y*q; 40 if(!p&&!q) 41 { 42 f[i][j][k]=max(f[i][j-1][k],f[i][j][k]); 43 f[i][j][k+x+(y<<1)]=max(f[i][j][k+x+(y<<1)],f[i][j-1][k]+ma[i][j]); 44 } 45 else if((!p&&q==1)||(!q&&p==1)) 46 { 47 f[i][j][t+x]=max(f[i][j][t+x],f[i][j-1][k]+ma[i][j]); 48 f[i][j][t+y]=max(f[i][j][t+y],f[i][j-1][k]+ma[i][j]); 49 } 50 else if((!p&&q==2)||(!q&&p==2)) 51 { 52 f[i][j][t+(x<<1)]=max(f[i][j][t+(x<<1)],f[i][j-1][k]+ma[i][j]); 53 f[i][j][t+(y<<1)]=max(f[i][j][t+(y<<1)],f[i][j-1][k]+ma[i][j]); 54 } 55 else if(p==1&&q==2&&!t&&ans<f[i][j-1][k]+ma[i][j]) ans=f[i][j-1][k]+ma[i][j],cout<<i<< <<j<< <<ans<<endl; 56 else if(p==2&&q==1) f[i][j][t]=max(f[i][j][t],f[i][j-1][k]+ma[i][j]); 57 else if(p==1&&q==1) 58 { 59 int u,tmp; 60 for(tmp=0,u=j+1;u<=m&&tmp>=0;tmp+=(b[t/xp[u]]==1)-(b[t/xp[u]]==2),u++); 61 u--; 62 f[i][j][t-xp[u]]=max(f[i][j][t-xp[u]],f[i][j-1][k]+ma[i][j]); 63 } 64 else if(p==2&&q==2) 65 { 66 int u,tmp; 67 for(tmp=0,u=j-2;u>=0&&tmp>=0;tmp+=(b[t/xp[u]]==2)-(b[t/xp[u]]==1),u--); 68 u++; 69 f[i][j][t+xp[u]]=max(f[i][j][t+xp[u]],f[i][j-1][k]+ma[i][j]); 70 } 71 } 72 } 73 for(int j=0;j<xp[m];j++) if(b[j]==0)f[i+1][0][j/3]=f[i][m][j]; 74 } 75 printf("%d\n",ans); 76 return 0; 77 }
存一個代碼

CDQZ集訓DAY10 日記