zoukankan      html  css  js  c++  java
  • 牛客练习赛29 B 列队

    【题解】

      把某一行或某一列有4个1的都统计出来,然后首尾接上尽量长的,注意首尾不能选上同一个矩阵,要维护前缀、后缀1最大值和次大值。

      还要注意维护矩阵内连续1的长度,因为可能有 0 0 0 0 这种情况。

                             0 1 1 0

                             0 1 1 0

                             0 0 0 0

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<algorithm>
      4 #define LL long long
      5 #define rg register
      6 #define N 200010
      7 using namespace std;
      8 int n,m,b[4][4],ans[2][4],f[4],pos,pos2,Mx;
      9 bool v[2][4];
     10 struct rec{
     11     int l,r;
     12 }s[N][2][4];
     13 inline int read(){
     14     int k=0,f=1; char c=getchar();
     15     while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
     16     while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
     17     return k*f;
     18 }
     19 int main(){
     20     n=read();
     21     for(rg int i=1;i<=n;i++){
     22         memset(v,0,sizeof(v));
     23         for(rg int j=0;j<4;j++)
     24             for(rg int k=0;k<4;k++) b[j][k]=read();
     25         if(b[1][1]||b[1][2]){
     26             int tmp=1;
     27             if(b[1][1]&&b[1][2]) tmp++;
     28             Mx=max(Mx,tmp);
     29         }
     30         if(b[2][1]||b[2][2]){
     31             int tmp=1;
     32             if(b[2][1]&&b[2][2]) tmp++;
     33             Mx=max(Mx,tmp);
     34         }
     35         if(b[1][1]||b[2][1]){
     36             int tmp=1;
     37             if(b[1][1]&&b[2][1]) tmp++;
     38             Mx=max(Mx,tmp);
     39         }
     40         if(b[1][2]||b[2][2]){
     41             int tmp=1;
     42             if(b[1][2]&&b[2][2]) tmp++;
     43             Mx=max(Mx,tmp);
     44         }
     45         for(rg int j=0;j<4;j++){
     46             bool ok=1;
     47             for(rg int k=0;k<4;k++)if(!b[j][k]) ok=0;
     48             if(ok) ans[0][j]+=4,v[0][j]=1;
     49         }
     50         for(rg int j=0;j<4;j++){
     51             bool ok=1;
     52             for(rg int k=0;k<4;k++)if(!b[k][j]) ok=0;
     53             if(ok) ans[1][j]+=4,v[1][j]=1;
     54         }
     55         for(rg int j=0;j<4;j++){
     56             if(v[0][j]) continue;
     57             for(rg int k=0;k<4;k++)if(b[j][k]){
     58                 s[i][0][j].l++;
     59             }
     60             else break;
     61             for(rg int k=3;k>=0;k--)if(b[j][k]){
     62                 s[i][0][j].r++;
     63             }
     64             else break;
     65         }
     66         for(rg int j=0;j<4;j++){
     67             if(v[1][j]) continue;
     68             for(rg int k=0;k<4;k++)if(b[k][j]){
     69                 s[i][1][j].l++;
     70             }
     71             else break;
     72             for(rg int k=3;k>=0;k--)if(b[k][j]){
     73                 s[i][1][j].r++;
     74             }
     75             else break;
     76         }
     77 //        for(rg int j=0;j<4;j++) printf("-%d ",s[i][0][j].l); puts("l");
     78 //        for(rg int j=0;j<4;j++) printf("-%d ",s[i][0][j].r); puts("r");
     79 //        for(rg int j=0;j<4;j++) printf("+%d ",s[i][1][j].l); puts("l");
     80 //        for(rg int j=0;j<4;j++) printf("+%d ",s[i][1][j].r); puts("r");
     81     }
     82     for(rg int j=0;j<2;j++){
     83         for(rg int k=0;k<4;k++){
     84             int mx=0,mx2=0,pos=0,pos2=0,mx3=0,mx4=0;
     85             for(rg int i=1;i<=n;i++){
     86                 if(s[i][j][k].l>mx){
     87                     mx=s[i][j][k].l;
     88                     pos=i;
     89                 }
     90             }
     91             for(rg int i=1;i<=n;i++){
     92                 if(s[i][j][k].l>mx2&&i!=pos) mx2=s[i][j][k].l;
     93             }
     94             for(rg int i=1;i<=n;i++){
     95                 if(s[i][j][k].r>mx3){
     96                     mx3=s[i][j][k].r;
     97                     pos2=i;
     98                 }
     99             }
    100             for(rg int i=1;i<=n;i++){
    101                 if(s[i][j][k].r>mx4&&i!=pos2) mx4=s[i][j][k].r;
    102             }
    103             if(pos!=pos2) ans[j][k]+=mx+mx3;
    104             else ans[j][k]+=max(mx+mx4,mx2+mx3);
    105 //            printf("[%d %d %d %d]
    ",mx,mx2,mx3,mx4);
    106         }
    107     }
    108     for(rg int i=0;i<2;i++)
    109         for(rg int j=0;j<4;j++) Mx=max(Mx,ans[i][j]);
    110     printf("%d
    ",Mx);
    111     return 0;
    112 }
  • 相关阅读:
    HDU 4757 Tree 可持久化字典树 trie
    BZOJ 4198: [Noi2015]荷马史诗 哈夫曼树 k叉哈夫曼树
    BZOJ 3253 Fence Repair 哈夫曼树 水题
    BZOJ 3572: [Hnoi2014]世界树 虚树 树形dp
    2-SAT的一些题目
    二分图相关定理 最小点覆盖 最小路径覆盖 最大独立集 最小覆盖集
    POJ 1469 COURSES 二分图最大匹配 二分图
    快速排序
    排序算法:希尔排序
    霍夫曼编码实现
  • 原文地址:https://www.cnblogs.com/DriverLao/p/9820620.html
Copyright © 2011-2022 走看看