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
  • 相关阅读:
    CodeForces 7B
    CodeForces 4D
    离散化
    线段树入门
    洛谷 P3951 小凯的疑惑(赛瓦维斯特定理)
    Codeforces 1295D Same GCDs (欧拉函数)
    Codeforces 1295C Obtain The String (二分)
    Codeforces 1295B Infinite Prefixes
    Codeforces 1295A Display The Number(思维)
    Codeforces 1294F Three Paths on a Tree(树的直径,思维)
  • 原文地址:https://www.cnblogs.com/hehe54321/p/9802055.html
Copyright © 2011-2022 走看看