• 【BZOJ】【2286】【SDOI2011】消耗战


    虚树+树形DP

      Orz ZYF……果然好神……

    建虚树先按dfn排序,再用一个单调栈来维护当前这条【链】,往里加边……说实话还没弄懂- -

    留个坑吧……

    RE的原因:这条链往出退的时候没写top--;在第112行……导致死循环了!

      1 /**************************************************************
      2     Problem: 2286
      3     User: Tunix
      4     Language: C++
      5     Result: Accepted
      6     Time:6616 ms
      7     Memory:60120 kb
      8 ****************************************************************/
      9  
     10 //BZOJ 2286
     11 #include<cstdio>
     12 #include<cstring>
     13 #include<cstdlib>
     14 #include<iostream>
     15 #include<algorithm>
     16 #define rep(i,n) for(int i=0;i<n;++i)
     17 #define F(i,j,n) for(int i=j;i<=n;++i)
     18 #define D(i,j,n) for(int i=j;i>=n;--i)
     19 using namespace std;
     20 inline int getint(){
     21     int v=0,sign=1; char ch=getchar();
     22     while(ch<'0'||ch>'9'){ if (ch=='-') sign=-1; ch=getchar();}
     23     while(ch>='0'&&ch<='9'){ v=v*10+ch-'0'; ch=getchar();}
     24     return v*=sign;
     25 }
     26 /******************tamplate*********************/
     27 const int N=250010;
     28 const long long INF=100000000000LL;
     29 typedef long long LL;
     30 int n,m,dfn[N],dfs_clock=0,dep[N],fa[N][20],g[N][20],a[N];
     31 LL dp[N];
     32 bool v[N];//标记资源点
     33  
     34 inline int LCA(int x,int y){
     35     if (dep[x]<dep[y]) swap(x,y);
     36     int t=dep[x]-dep[y];
     37     F(i,0,18) if(t&(1<<i)) x=fa[x][i];
     38     if(x==y) return x;
     39     D(i,18,0) if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
     40     return fa[x][0];
     41 }
     42 inline int dist(int x,int y){
     43     int t=dep[x]-dep[y],ans=1000000000;
     44     D(i,18,0) if(t&(1<<i)) ans=min(ans,g[x][i]),x=fa[x][i];
     45     return ans;
     46 }
     47  
     48 struct graph{
     49     int head[N],to[N<<1],next[N<<1],len[N<<1],cnt;
     50     void add(int x,int y,int l){
     51         to[++cnt]=y; next[cnt]=head[x]; head[x]=cnt;len[cnt]=l;
     52         to[++cnt]=x; next[cnt]=head[y]; head[y]=cnt;len[cnt]=l;
     53     }
     54     void add(int x,int y){
     55         to[++cnt]=y; next[cnt]=head[x]; head[x]=cnt;
     56     }
     57     void dfs(int x){
     58         dfn[x]=++dfs_clock;
     59         F(i,1,18)
     60             if(dep[x]>=(1<<i)){
     61                 fa[x][i]=fa[fa[x][i-1]][i-1];
     62                 g[x][i]=min(g[x][i-1],g[fa[x][i-1]][i-1]);
     63             }
     64             else break;
     65         for(int i=head[x];i;i=next[i])
     66             if(to[i]!=fa[x][0]){
     67                 fa[to[i]][0]=x;
     68                 g[to[i]][0]=len[i];
     69                 dep[to[i]]=dep[x]+1;
     70                 dfs(to[i]);
     71             }
     72     }
     73     void dfs(int x,int f){
     74         //dp[x]表示使x到不了任何一个后代的资源点的最小费用
     75         dp[x]=0;
     76         for(int i=head[x];i;i=next[i])
     77             if(to[i]!=f){
     78                 dfs(to[i],x);
     79                 dp[x]+=min(v[to[i]] ? INF : dp[to[i]],(LL)dist(to[i],x));
     80                 //如果这个子节点是能源点,则必须砍这条边
     81             }
     82         head[x]=0;
     83         //清空,为下个询问做预处理,反正每个节点只会访问一次……
     84     }
     85 }G1,G2;
     86 inline bool cmp(int a,int b){ return dfn[a]<dfn[b]; }
     87 int st[N],top=0;
     88 int main(){
     89     n=getint();
     90     int x,y,z;
     91     F(i,2,n){
     92         x=getint(); y=getint(); z=getint();
     93         G1.add(x,y,z);
     94     }
     95     dep[1]=1;
     96     G1.dfs(1);
     97     int T=getint();
     98     while(T--){
     99         m=getint();
    100         F(i,1,m) {a[i]=getint(); v[a[i]]=1;}
    101         sort(a+1,a+m+1,cmp);
    102         //栈维护建虚树
    103         st[top=1]=1; G2.cnt=0;
    104         F(i,1,m){
    105             int x=a[i],f=LCA(x,st[top]);
    106             while(dep[f]<dep[st[top]]){
    107                 if(dep[f]>=dep[st[top-1]]){
    108                     G2.add(f,st[top--]);
    109                     if (st[top]!=f) st[++top]=f;
    110                     break;
    111                 }
    112                 G2.add(st[top-1],st[top]);top--;
    113             }
    114             if(st[top]!=x) st[++top]=x;
    115         }
    116         while(--top) G2.add(st[top],st[top+1]);
    117         G2.dfs(1,0);
    118         printf("%lld
    ",dp[1]);
    119         F(i,1,m) v[a[i]]=0;
    120     }
    121     return 0;
    122 }
    View Code

    2286: [Sdoi2011消耗战

    Time Limit: 20 Sec  Memory Limit: 512 MB
    Submit: 1012  Solved: 350
    [Submit][Status][Discuss]

    Description

    在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达。现在,我军已经侦查到敌军的总部在编号为1的岛屿,而且他们已经没有足够多的能源维系战斗,我军胜利在望。已知在其他k个岛屿上有丰富能源,为了防止敌军获取能源,我军的任务是炸毁一些桥梁,使得敌军不能到达任何能源丰富的岛屿。由于不同桥梁的材质和结构不同,所以炸毁不同的桥梁有不同的代价,我军希望在满足目标的同时使得总代价最小。

    侦查部门还发现,敌军有一台神秘机器。即使我军切断所有能源之后,他们也可以用那台机器。机器产生的效果不仅仅会修复所有我军炸毁的桥梁,而且会重新随机资源分布(但可以保证的是,资源不会分布到1号岛屿上)。不过侦查部门还发现了这台机器只能够使用m次,所以我们只需要把每次任务完成即可。

    Input

    第一行一个整数n,代表岛屿数量。

    接下来n-1行,每行三个整数u,v,w,代表u号岛屿和v号岛屿由一条代价为c的桥梁直接相连,保证1<=u,v<=n且1<=c<=100000。

    第n+1行,一个整数m,代表敌方机器能使用的次数。

    接下来m行,每行一个整数ki,代表第i次后,有ki个岛屿资源丰富,接下来k个整数h1,h2,…hk,表示资源丰富岛屿的编号。

    Output

    输出有m行,分别代表每次任务的最小代价。

     

    Sample Input

    10

    1 5 13

    1 9 6

    2 1 19

    2 4 8

    2 3 91

    5 6 8

    7 5 4

    7 8 31

    10 7 9

    3

    2 10 6

    4 5 7 8 3

    3 9 4 6

    Sample Output


    12

    32

    22

    【数据规模和约定】

    对于10%的数据,2<=n<=10,1<=m<=5,1<=ki<=n-1

    对于20%的数据,2<=n<=100,1<=m<=100,1<=ki<=min(10,n-1)

    对于40%的数据,2<=n<=1000,m>=1,sigma(ki)<=500000,1<=ki<=min(15,n-1)

    对于100%的数据,2<=n<=250000,m>=1,sigma(ki)<=500000,1<=ki<=n-1


    HINT

    Source

    [Submit][Status][Discuss]
  • 相关阅读:
    JavaScript设计模式 Item 6 --单例模式Singleton
    把上个JDBC Request查询出来的结果当成下个JDBC Request查询的参数
    Jmeter连接数据库
    Jmeter 消息体使用csv参数化时编码问题
    在fiddler中设置断点修改数据(二)
    在fiddler中设置断点修改数据(一)
    抓包工具fiddler的安装与配置
    解决配置fiddler时信任证书报:Unable to configure Windows to Trust the Fiddler Root certificate.The LOG tab may contain more infor
    截图贴图神器Snipaste
    Jmeter 字符串拼接参数
  • 原文地址:https://www.cnblogs.com/Tunix/p/4266500.html
Copyright © 2020-2023  润新知