CF1061E Politics E. Politics

考虑利用树的性质,因为是子树问题,所以放到dfs序上。

只考虑一个树,问题是每个区间选恰好\(k\)个。因为区间其实是子树,所以区间要么包含,要么不交。

所以可以把区间拆开,拆开很多个互相独立的区间。

问题就变成了有若干个,从每个集合中选择\(k_i\)个数字,最大化权。

考虑两棵树的情况,每个点选择或者不选择,又恰好只有两颗树,考虑费用流

\(s\)连每个条件的虚点,流量为\(k_i\),边权为\(0\),这个虚点连可以选择的点集的每个点,流量\(1\),边权\(0\)

然后另一个集合同理连\(t\)

点自己拆一下点就可以了。


Code:

  1. #include <cstdio>
  2. #include <cctype>
  3. #include <cstring>
  4. #include <vector>
  5. #include <algorithm>
  6. const int SIZE=1<<21;
  7. char ibuf[SIZE],*iS,*iT;
  8. //#define gc() (iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,SIZE,stdin),iS==iT?EOF:*iS++):*iS++)
  9. #define gc() getchar()
  10. template <class T>
  11. void read(T &x)
  12. {
  13. int f=0;x=0;char c=gc();
  14. while(!isdigit(c)) f|=c=='-',c=gc();
  15. while(isdigit(c)) x=x*10+c-'0',c=gc();
  16. if(f) x=-x;
  17. }
  18. const int N=2020,M=5010;
  19. int n,m,q0,q1,s,t,x,y;
  20. int head[N],to[M],Next[M],edge[M],cost[M],cnt=1;
  21. void add(int u,int v,int w,int c)
  22. {
  23. to[++cnt]=v,edge[cnt]=w,cost[cnt]=c,Next[cnt]=head[u],head[u]=cnt;
  24. to[++cnt]=u,edge[cnt]=0,cost[cnt]=-c,Next[cnt]=head[v],head[v]=cnt;
  25. }
  26. int q[N*N],pre[N],dis[N],l,r;
  27. bool spfa()
  28. {
  29. memset(dis,-0x3f,sizeof dis);
  30. dis[q[l=r=1]=s]=0;
  31. while(l<=r)
  32. {
  33. int now=q[l++];
  34. for(int v,i=head[now];i;i=Next[i])
  35. if(edge[i]&&dis[v=to[i]]<dis[now]+cost[i])
  36. {
  37. dis[v]=dis[now]+cost[i];
  38. pre[q[++r]=v]=i;
  39. }
  40. }
  41. return dis[t]!=dis[0];
  42. }
  43. int sta[N],tot,id[N],siz[N],ned[N],eu[N],ev[N],toki;
  44. std::vector <int> E[N];
  45. void dfs1(int now,int fa)
  46. {
  47. sta[++tot]=now;
  48. for(int v,i=0;i<E[now].size();i++)
  49. if((v=E[now][i])!=fa)
  50. dfs1(v,now),siz[now]+=siz[v];
  51. if(id[now])
  52. {
  53. if(ned[now]-siz[now]<0) toki=1;
  54. add(s,id[now],ned[now]-siz[now],0);
  55. siz[now]=ned[now];
  56. int k;
  57. do
  58. {
  59. k=sta[tot--];
  60. add(id[now],k,1,0);
  61. }while(k!=now);
  62. }
  63. }
  64. void dfs2(int now,int fa)
  65. {
  66. sta[++tot]=now;
  67. for(int v,i=0;i<E[now].size();i++)
  68. if((v=E[now][i])!=fa)
  69. dfs2(v,now),siz[now]+=siz[v];
  70. if(id[now])
  71. {
  72. if(ned[now]-siz[now]<0) toki=1;
  73. add(id[now],t,ned[now]-siz[now],0);
  74. siz[now]=ned[now];
  75. int k;
  76. do
  77. {
  78. k=sta[tot--];
  79. add(k+n,id[now],1,0);
  80. }while(k!=now);
  81. }
  82. }
  83. int main()
  84. {
  85. read(n),read(x),read(y);
  86. for(int w,i=1;i<=n;i++) read(w),add(i,i+n,1,w);
  87. m=2*n,s=++m,t=++m;
  88. for(int u,v,i=1;i<n;i++) read(u),read(v),E[u].push_back(v),E[v].push_back(u);
  89. for(int i=1;i<n;i++) read(eu[i]),read(ev[i]);
  90. read(q0);
  91. int mx;
  92. for(int a,i=1;i<=q0;i++)
  93. {
  94. read(a),read(ned[a]);
  95. id[a]=++m;
  96. if(a==x) mx=ned[a];
  97. }
  98. dfs1(x,0);
  99. memset(ned,0,sizeof ned);
  100. memset(id,0,sizeof id);
  101. memset(siz,0,sizeof siz);
  102. for(int i=1;i<=n;i++) E[i].clear();
  103. for(int i=1;i<n;i++) E[eu[i]].push_back(ev[i]),E[ev[i]].push_back(eu[i]);
  104. read(q1);
  105. for(int a,i=1;i<=q1;i++)
  106. {
  107. read(a),read(ned[a]);
  108. id[a]=++m;
  109. if(a==y&&mx!=ned[a]) toki=1;
  110. }
  111. dfs2(y,0);
  112. if(toki)
  113. {
  114. puts("-1");
  115. return 0;
  116. }
  117. int flow=0,ans=0;
  118. while(spfa())
  119. {
  120. ++flow;
  121. ans+=dis[t];
  122. int now=t;
  123. while(now!=s)
  124. {
  125. --edge[pre[now]];
  126. ++edge[pre[now]^1];
  127. now=to[pre[now]^1];
  128. }
  129. }
  130. if(flow==mx) printf("%d\n",ans);
  131. else puts("-1");
  132. return 0;
  133. }

2019.6.1

CF1061E Politics E. Politics 解题报告的更多相关文章

  1. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  2. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  3. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

  4. 习题:codevs 2822 爱在心中 解题报告

    这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...

  5. 习题:codevs 1035 火车停留解题报告

    本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...

  6. 习题: codevs 2492 上帝造题的七分钟2 解题报告

    这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...

  7. 习题:codevs 1519 过路费 解题报告

    今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...

  8. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

  9. LeetCode 解题报告索引

    最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中......                        ...

随机推荐

  1. 抽象abstract

    1):一个类如果有抽象方法,这个类一定是抽象类.抽象类不一定有抽象方法.抽象方法是以分号结束.不是以{}. 抽象方法也不提供实现代码. 2):任何拓展抽象类的类都必须实现超类的所有抽象方法.除非子类也 ...

  2. JavaScript中的回调地狱及解决方法

    1.回调地狱 在使用JavaScript时,为了实现某些逻辑经常会写出层层嵌套的回调函数,如果嵌套过多,会极大影响代码可读性和逻辑,这种情况也被成为回调地狱.比如说你要把一个函数 A 作为回调函数,但 ...

  3. k-近邻算法(kNN)测试算法:作为完整程序验证分类器

    #测试算法:作为完整程序验证分类器 def datingClassTest(): hoRatio = 0.10 #设置测试集比重,前10%作为测试集,后90%作为训练集 datingDataMat,d ...

  4. [CSP-S模拟测试]:v(hash表+期望DP)

    题目背景 $\frac{1}{4}$遇到了一道水题,又完全不会做,于是去请教小$D$.小$D$看了$0.607$眼就切掉了这题,嘲讽了$\frac{1}{4}$一番就离开了.于是,$\frac{1}{ ...

  5. JS 中的offset、scroll、client总结

    经常碰到offset.scroll.client这几个关键字,每次都要各种实验,这里总结一下. 两张图镇楼,随时翻阅 1. offset offset 指偏移,包括这个元素在文档中占用的所有显示宽度, ...

  6. Leaflet-Leafletv0.7使用leaflet-bing-layer

    digidem/leaflet-bing-layer: Bing Maps Layer for Leaflet v1.0.0:从标题就可以看出要Leaflet v1.0.0才能用.其实leaflet ...

  7. idea下web工程的编译和输出设置

    公司的一个项目,别人用的eclipse,我这边用IDEA,路径上出了点问题,现在大概有点头绪了,记录下来. 打开project structure后,看到如下设置,最重要的是Modules和Artif ...

  8. 指针的value

    全局变量的默认初始化值为0,char为空字符——'\0',string为"\0 " char c; string s; ; int main() { cout << p ...

  9. linux shell assemble PDF文件

      daniel@daniel-mint ~/latex/linux/itext/daniel $ cat asm.sh header_start=0 header_len=15 xref_start ...

  10. Cocos2d-x之MessageBox

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. 在cocos2d-x中使用的对话框为MessageBox,因为cocos2d-x已经包装好了:但是在一般的游戏设置中,我们不会使用coco ...