• CDQZ集训DAY10 日记


      又一次跪了,跪在了神奇的数据范围上。

      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
    ",ans);
    76     return 0;
    77 }
    存一个代码
  • 相关阅读:
    bzoj2959
    学习笔记::lct
    bzoj3203
    bzoj1319
    bzoj3625
    bzoj3992
    bzoj1565
    bzoj3513
    平常练习动归(1.胖男孩)———最长公共子序列
    2016 noip 复赛 day2
  • 原文地址:https://www.cnblogs.com/liutianrui/p/8137915.html
Copyright © 2020-2023  润新知