兩個機房又和在一起考試
開場看了看T1,感覺挺水的,過。
T2,這個式子有點奇怪,暫時沒什么思路,過
T3,好像保留最后幾位換個根處理一下就行了,過,先去打T1
於是T1大概打了0.5h,連暴力帶正解帶對拍,碼完之后感覺挺穩的,就過了。去看T3。
T3換個根就沒事了,但是我一開始狀態設置的有問題,一拍就爆炸了。
調調調,調過了T3,拍上了,感覺很穩,就交了一下T3和T1,此時過了兩個小時
去把T2的式子化簡了一下,發現只與前面所有數的和有關,好像是個很簡單的dp,就碼出來了。
不太會打暴力,於是碼了個dfs,拍上了,很穩。
然后我去上了個廁所
然后碰見了DeepinC
然后他問我:“你切了幾個?”
然后我感覺不太對勁,他都用“切”了,說明。。。。。。他AK了?
然后我決定回答:3個(這句話目的在於給DeepinC壓力,使他不會過早頹廢)
出分了,T2T3都A了,T1爆炸了
T1.
注意這題不保證b是有序的,需要自己手動sort,不這么干會變成20分,別問我怎么知道的。
然而我打對拍時智障地認為輸入保證有序,於是我將所有數生成了出來,然后sort了一遍,然后輸出
然后錯失了人生第一個AK
T2.
把式子化簡了,考慮每個點的貢獻就沒了。

1 #include<bits/stdc++.h> 2 using namespace std; 3 int f[32][32][3005],t; 4 int n,m,a[35][35],ans; 5 int main(){ 6 scanf("%d",&t); 7 while(t--){ 8 ans=0x7fffffff; 9 memset(f,0x3f,sizeof(f)); 10 scanf("%d%d",&n,&m); 11 for(int i=1;i<=n;i++) 12 for(int j=1;j<=m;j++) 13 scanf("%d",&a[i][j]); 14 f[1][1][a[1][1]]=(n+m-2)*a[1][1]*a[1][1]; 15 for(int i=1;i<=n;i++) 16 for(int j=1;j<=m;j++){ 17 if(i==1&&j==1)continue; 18 for(int k=1;k<=(i+j)*30;k++){ 19 int sum=(n+m-2)*a[i][j]*a[i][j]-k*a[i][j]*2; 20 int mi=min(f[i-1][j][k],f[i][j-1][k]); 21 if(mi==0x3f3f3f3f)continue; 22 mi+=sum; 23 f[i][j][k+a[i][j]]=min(f[i][j][k+a[i][j]],mi); 24 if(i==n&&j==m)ans=min(ans,f[i][j][k+a[i][j]]); 25 } 26 } 27 printf("%d\n",ans); 28 } 29 return 0; 30 }
T3.
換根dp,考慮每個數二進制最后4位,統計答案即可。
注意m!=0時不能算自己到自己的貢獻。

1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,fi[100005],ne[200005],to[200005],ans,dis[100005],w[200005],tot; 4 int res[100005],sum[100005][16],siz[100005],ss[100005][16]; 5 inline void add(int x,int y,int z){ 6 ne[++tot]=fi[x]; 7 fi[x]=tot; 8 to[tot]=y; 9 w[tot]=z; 10 } 11 void dfs(int x,int fa){ 12 siz[x]=1;ss[x][0]=1; 13 for(int i=fi[x];i;i=ne[i]){ 14 int y=to[i]; 15 if(y!=fa){ 16 dis[y]=dis[x]+w[i]; 17 ans+=dis[y]^m; 18 res[1]+=dis[y]; 19 dfs(y,x); 20 siz[x]+=siz[y]; 21 for(int j=0;j<=15;j++) 22 ss[x][(j+w[i])&15]+=ss[y][j]; 23 } 24 } 25 } 26 void dfs2(int x,int fa){ 27 for(int i=fi[x];i;i=ne[i]){ 28 int y=to[i]; 29 if(y!=fa){ 30 res[y]=res[x]+(n-2*siz[y])*w[i]; 31 for(int j=0;j<=15;j++){ 32 sum[y][(j+w[i])&15]+=sum[x][j]-ss[y][(j-(w[i]&15)+16)&15]; 33 sum[y][j]+=ss[y][j]; 34 } 35 dfs2(y,x); 36 } 37 } 38 } 39 int main(){ 40 scanf("%d%d",&n,&m); 41 for(int i=1,x,y,z;i<n;i++) 42 scanf("%d%d%d",&x,&y,&z),add(x,y,z),add(y,x,z); 43 dfs(1,0); 44 printf("%d\n",ans); 45 for(int i=0;i<=15;i++) 46 sum[1][i]=ss[1][i]; 47 dfs2(1,0); 48 for(int i=2;i<=n;i++){ 49 sum[i][0]--; 50 for(int j=0;j<=15;j++) 51 res[i]=res[i]-j*sum[i][j]+(m^j)*sum[i][j]; 52 printf("%d\n",res[i]); 53 } 54 return 0; 55 }