zoukankan      html  css  js  c++  java
  • bzoj 1791 [Ioi2008]Island 岛屿

    https://www.lydsy.com/JudgeOnline/problem.php?id=1791

    基环树模板题

    原来的代码:(本机AC)

      1 #include<cstdio>
      2 #include<algorithm>
      3 #include<cstring>
      4 #include<vector>
      5 using namespace std;
      6 #define fi first
      7 #define se second
      8 #define mp make_pair
      9 #define pb push_back
     10 typedef long long ll;
     11 typedef unsigned long long ull;
     12 typedef pair<int,int> pii;
     13 struct E
     14 {
     15     int to,nxt,d;
     16 }e[2000100];
     17 int f1[1000100],ne=1;
     18 void me(int x,int y,int z)
     19 {
     20     e[++ne].to=y;e[ne].nxt=f1[x];f1[x]=ne;e[ne].d=z;
     21     e[++ne].to=x;e[ne].nxt=f1[y];f1[y]=ne;e[ne].d=z;
     22 }
     23 int n;
     24 ll dd[1000100][2],ans=-0x3f3f3f3f3f3f3f3f;
     25 bool vis[1000100],oncir[1000100];//ll sh;
     26 void dfs(int u,int fa)
     27 {
     28     dd[u][0]=dd[u][1]=0;
     29     for(int v,k=f1[u];k;k=e[k].nxt)
     30         if(e[k].to!=fa&&!oncir[e[k].to])
     31         {
     32             v=e[k].to;
     33             dfs(v,u);
     34             if(dd[v][0]+e[k].d>=dd[u][0])
     35             {
     36                 dd[u][1]=dd[u][0];
     37                 dd[u][0]=dd[v][0]+e[k].d;
     38             }
     39             else if(dd[v][0]+e[k].d>=dd[u][1])
     40                 dd[u][1]=dd[v][0]+e[k].d;
     41         }
     42     ans=max(ans,dd[u][0]+dd[u][1]);
     43 }
     44 int cir[2000100];ll w[2000100],d0[2000100];
     45 int qq[2000100],ql,qr;
     46 int ff[1000100],fd[1000100];
     47 bool vv[1000100];
     48 ll anss;
     49 void dfs1(int u,int lst)
     50 {
     51     vis[u]=1;
     52     for(int v,k=f1[u];k;k=e[k].nxt)
     53         if((k!=(lst^1))&&(k!=lst))
     54         {
     55             v=e[k].to;
     56             if(vis[v])//可以证明此时v一定是u的祖先
     57             {
     58                 cir[++cir[0]]=v;
     59                 oncir[v]=1;
     60                 w[cir[0]+1]=e[k].d;
     61                 for(;!oncir[u];u=ff[u])
     62                 {
     63                     cir[++cir[0]]=u;
     64                     oncir[u]=1;
     65                     w[cir[0]+1]=fd[u];
     66                 }
     67             }
     68             else
     69             {
     70                 ff[v]=u;fd[v]=e[k].d;
     71                 dfs1(v,k);
     72             }
     73             if(cir[0])  return;
     74         }
     75 }
     76 void dfs0(int u)
     77 {
     78     vv[u]=1;
     79     for(int k=f1[u];k;k=e[k].nxt)
     80         if(!vv[e[k].to])
     81             dfs0(e[k].to);
     82 }
     83 int main()
     84 {
     85     int i,j,k,x,y;
     86     scanf("%d",&n);
     87     for(i=1;i<=n;i++)
     88     {
     89         scanf("%d%d",&x,&y);
     90         me(i,x,y);
     91     }
     92     for(k=1;k<=n;k++)
     93         if(!vv[k])
     94         {
     95             //printf("1t%d
    ",k);
     96             cir[0]=0;ans=-0x3f3f3f3f3f3f3f3f;
     97             dfs1(k,0);
     98             for(i=1;i<=cir[0];i++)
     99                 cir[i+cir[0]]=cir[i];
    100             for(i=1;i<=cir[0];i++)
    101                 dfs(cir[i],0);
    102             for(i=2;i<=cir[0];i++)
    103                 w[i+cir[0]]=w[i];
    104             for(i=1;i<=2*cir[0];i++)
    105                 d0[i]=dd[cir[i]][0];
    106             for(i=2;i<=2*cir[0];i++)
    107                 w[i]+=w[i-1];
    108             /*
    109             for(i=1;i<=2*cir[0];i++)
    110                 printf("%d ",cir[i]);
    111             puts("1t");
    112             for(i=1;i<=2*cir[0];i++)
    113                 printf("%lld ",w[i]);
    114             puts("2t");
    115             for(i=1;i<=2*cir[0];i++)
    116                 printf("%lld ",d0[i]);
    117             puts("3t");
    118             */
    119             //sh=w[cir[0]+1];
    120             for(i=1,j=1,ql=1,qr=0;i<=2*cir[0];i++)
    121             {
    122                 while(j<i&&i-j>=cir[0])
    123                 {
    124                     if(ql<=qr&&qq[ql]==j)    ++ql;
    125                     ++j;
    126                 }
    127                 if(j<i)  ans=max(ans,w[i]+d0[i]-w[qq[ql]]+d0[qq[ql]]);
    128                 //printf("3t%d %d %lld
    ",i,j,ans);
    129                 while(ql<=qr&&-w[qq[qr]]+d0[qq[qr]]<=-w[i]+d0[i])
    130                     --qr;
    131                 qq[++qr]=i;
    132             }
    133             anss+=ans;
    134             //printf("2t%lld
    ",ans);
    135             dfs0(k);
    136         }
    137     printf("%lld",anss);
    138     return 0;
    139 }
    View Code

    然而毒瘤卡空间。。A不掉

    卡了一个小时,全部改成bfs就A掉了

    错误记录:91~93行没有用边判

      1 #include<cstdio>
      2 #include<algorithm>
      3 #include<cstring>
      4 #include<vector>
      5 #include<queue>
      6 using namespace std;
      7 #define fi first
      8 #define se second
      9 #define mp make_pair
     10 #define pb push_back
     11 typedef long long ll;
     12 typedef unsigned long long ull;
     13 typedef pair<int,int> pii;
     14 struct E
     15 {
     16     int to,nxt,d;
     17 }e[2000100];
     18 int f1[1000100],ne=1;
     19 void me(int x,int y,int z)
     20 {
     21     e[++ne].to=y;e[ne].nxt=f1[x];f1[x]=ne;e[ne].d=z;
     22     e[++ne].to=x;e[ne].nxt=f1[y];f1[y]=ne;e[ne].d=z;
     23 }
     24 int n;
     25 ll dd[1000100][2],ans=-0x3f3f3f3f3f3f3f3f;
     26 bool oncir[1000100];//ll sh;
     27 int t1[1000100];
     28 bool vv[1000100],v1[1000100],v2[1000100];
     29 int ff[1000100];
     30 queue<int> q;
     31 void dfs(int s)
     32 {
     33     int v,k,u,i;
     34     t1[0]=0;
     35     q.push(s);
     36     while(!q.empty())
     37     {
     38         u=q.front();q.pop();
     39         t1[++t1[0]]=u;
     40         for(k=f1[u];k;k=e[k].nxt)
     41             if(!v2[e[k].to]&&!oncir[e[k].to])
     42             {
     43                 ff[e[k].to]=u;
     44                 v2[e[k].to]=1;
     45                 q.push(e[k].to);
     46             }
     47     }
     48     for(i=t1[0];i>=1;i--)
     49     {
     50         u=t1[i];
     51         dd[u][0]=dd[u][1]=0;
     52         for(k=f1[u];k;k=e[k].nxt)
     53             if(e[k].to!=ff[u]&&!oncir[e[k].to])
     54             {
     55                 v=e[k].to;
     56                 if(dd[v][0]+e[k].d>=dd[u][0])
     57                 {
     58                     dd[u][1]=dd[u][0];
     59                     dd[u][0]=dd[v][0]+e[k].d;
     60                 }
     61                 else if(dd[v][0]+e[k].d>=dd[u][1])
     62                     dd[u][1]=dd[v][0]+e[k].d;
     63             }
     64         ans=max(ans,dd[u][0]+dd[u][1]);
     65     }
     66 }
     67 int cir[2000100];ll w[2000100],d0[2000100];
     68 int qq[2000100],ql,qr;
     69 ll anss;
     70 void dfs1(int s)
     71 {
     72     int k,j,u,lst;bool fl;
     73     q.push(s);v1[s]=1;
     74     while(!q.empty())
     75     {
     76         u=q.front();q.pop();
     77         for(k=f1[u];k;k=e[k].nxt)
     78             if(!v1[e[k].to])
     79             {
     80                 v1[e[k].to]=1;
     81                 q.push(e[k].to);
     82             }
     83     }
     84     //printf("9t%d
    ",s);
     85     for(j=s,lst=0;;)
     86     {
     87         //printf("8t%d
    ",j);
     88         cir[++cir[0]]=j;
     89         v2[j]=1;
     90         fl=0;
     91         for(k=f1[j];k;k=e[k].nxt)
     92             if(oncir[e[k].to]&&!v2[e[k].to]
     93                 &&(k!=lst)&&(k!=(lst^1)))
     94             {
     95                 fl=1;
     96                 j=e[k].to;
     97                 w[cir[0]+1]=e[k].d;
     98                 lst=k;
     99                 break;
    100             }
    101         if(!fl)
    102         {
    103             for(k=f1[j];k;k=e[k].nxt)
    104                 if(e[k].to==s&&(k!=lst)&&(k!=(lst^1)))
    105                 {
    106                     w[cir[0]+1]=e[k].d;
    107                     break;
    108                 }
    109             break;
    110         }
    111     }
    112 }
    113 int in[1000100];
    114 int main()
    115 {
    116     int i,j,k,x,y,u;
    117     scanf("%d",&n);
    118     for(i=1;i<=n;i++)
    119     {
    120         scanf("%d%d",&x,&y);
    121         me(i,x,y);++in[i];++in[x];
    122     }
    123     for(i=1;i<=n;i++)
    124         oncir[i]=1;
    125     for(i=1;i<=n;i++)
    126         if(in[i]<=1)
    127         {
    128             oncir[i]=0;
    129             q.push(i);
    130         }
    131     while(!q.empty())
    132     {
    133         u=q.front();q.pop();
    134         for(k=f1[u];k;k=e[k].nxt)
    135         {
    136             --in[e[k].to];
    137             if(in[e[k].to]<=1&&oncir[e[k].to])
    138             {
    139                 oncir[e[k].to]=0;
    140                 q.push(e[k].to);
    141             }
    142         }
    143     }
    144     /*
    145     for(i=1;i<=n;i++)
    146         if(oncir[i])
    147             printf("6t%d
    ",i);/
    148     */
    149     for(k=1;k<=n;k++)
    150         if(oncir[k]&&!v1[k])
    151         {
    152             //printf("1t%d
    ",k);
    153             cir[0]=0;ans=-0x3f3f3f3f3f3f3f3f;
    154             dfs1(k);
    155             for(i=1;i<=cir[0];i++)
    156                 cir[i+cir[0]]=cir[i];
    157             for(i=1;i<=cir[0];i++)
    158                 dfs(cir[i]);
    159             for(i=2;i<=cir[0];i++)
    160                 w[i+cir[0]]=w[i];
    161             for(i=1;i<=2*cir[0];i++)
    162                 d0[i]=dd[cir[i]][0];
    163             for(i=2;i<=2*cir[0];i++)
    164                 w[i]+=w[i-1];
    165             /*
    166             for(i=1;i<=2*cir[0];i++)
    167                 printf("%d ",cir[i]);
    168             puts("1t");
    169             for(i=1;i<=2*cir[0];i++)
    170                 printf("%lld ",w[i]);
    171             puts("2t");
    172             for(i=1;i<=2*cir[0];i++)
    173                 printf("%lld ",d0[i]);
    174             puts("3t");
    175             */
    176             //sh=w[cir[0]+1];
    177             for(i=1,j=1,ql=1,qr=0;i<=2*cir[0];i++)
    178             {
    179                 while(j<i&&i-j>=cir[0])
    180                 {
    181                     if(ql<=qr&&qq[ql]==j)    ++ql;
    182                     ++j;
    183                 }
    184                 if(j<i)  ans=max(ans,w[i]+d0[i]-w[qq[ql]]+d0[qq[ql]]);
    185                 //printf("3t%d %d %lld
    ",i,j,ans);
    186                 while(ql<=qr&&-w[qq[qr]]+d0[qq[qr]]<=-w[i]+d0[i])
    187                     --qr;
    188                 qq[++qr]=i;
    189             }
    190             anss+=ans;
    191             //printf("2t%lld
    ",ans);
    192         }
    193     printf("%lld",anss);
    194     return 0;
    195 }
    View Code
  • 相关阅读:
    atom 安装插件列表
    django学习
    windows 安装 python3
    python3 监控代码变化 自动重启 提高开发效率
    git无法pull仓库refusing to merge unrelated histories
    python 项目部署virtualenv
    python 多线程并发threading & 任务队列Queue
    python logging 日志使用
    jupyter 教程
    mysql 替换数据库字段内容
  • 原文地址:https://www.cnblogs.com/hehe54321/p/9802055.html
Copyright © 2011-2022 走看看