[COGS 2434]暗之链锁

题目

传说中的暗之连锁被人们称为Dark。<!--more-->Dark是人类内心的黑暗的产物,古今中外的勇者们都试图打倒它。经过研究,你发现Dark呈现无向图的结构,图中有N个节点和两类边,一类边被称为主要边,而另一类被称为附加边。Dark有N – 1条主要边,并且Dark的任意两个节点之间都存在一条只由主要边构成的路径。另外,Dark还有M条附加边。
你的任务是把Dark斩为不连通的两部分。一开始Dark的附加边都处于无敌状态,你只能选择一条主要边切断。一旦你切断了一条主要边,Dark就会进入防御模式,主要边会变为无敌的而附加边可以被切断。但是你的能力只能再切断Dark的一条附加边。现在你想要知道,一共有多少种方案可以击败Dark。
注意,就算你第一步切断主要边之后就已经把Dark斩为两截,你也需要切断一条附加边才算击败了Dark。

INPUT

第一行包含两个整数N和M。
之后N – 1行,每行包括两个整数A和B,表示A和B之间有一条主要边。
之后M行以同样的格式给出附加边。

OUTPUT

输出一个整数表示答案。

SAMPLE

INPUT

4 1
1 2
2 3
1 4
3 4

OUTPUT

3

解题报告

第一眼看这题,还以为要用每个点的度来做= =
正经的解法:
求出每条正经的边被多少条附加边(不正经的边?(雾))所覆盖,设其为x
然后对每一条正经的边询问,只有x==0||x==1时,这条边才能被砍(正确性显然,因为如果x>1,你就算砍了它,再砍一条覆盖它的附加边,也没啥用,无法使其不连通)
当x==0时,m条边随便砍,故对答案的贡献为m
当x==1时,只有砍了覆盖它的那条附加边才有用,故对答案的贡献为1
那么问题来了,咋求这个x呢?
显然正经的边形成的是一棵树,那么我们就可以将边权下放到点权(为啥?好算啊= =),这样除了根,每个点都会有点权值,我们就可以用差分的思想来解决这个问题,dfs序跑一遍,修改时LCA-2,两端点+1(想想为什么?差分这东西,就是靠正负的抵消与修改后对区间和的影响来搞的,这样做的目的也就很明显了),那么该点权值自然就为从dfs序左端点到右端点的区间和。剩下的就十分简单了,乱搞出奇迹= =
 
  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. using namespace std;
  5. inline int read(){
  6. int sum();
  7. char ch(getchar());
  8. while(ch<''||ch>'')
  9. ch=getchar();
  10. while(ch>=''&&ch<=''){
  11. sum=sum*+ch-'';
  12. ch=getchar();
  13. }
  14. return sum;
  15. }
  16. int n,m;
  17. struct edge{
  18. int s,e,n;
  19. }a[];
  20. int pre[],tot;
  21. inline void insert(int s,int e){
  22. a[++tot].s=s;
  23. a[tot].e=e;
  24. a[tot].n=pre[s];
  25. pre[s]=tot;
  26. }
  27. int fa[],dep[],size[],son[];
  28. inline void dfs1(int u){
  29. son[u]=;
  30. for(int i=pre[u];i!=-;i=a[i].n){
  31. int e(a[i].e);
  32. if(e!=fa[u]){
  33. fa[e]=u;
  34. dep[e]=dep[u]+;
  35. dfs1(e);
  36. size[u]+=size[e];
  37. if(size[e]>size[son[u]])
  38. son[u]=;
  39. }
  40. }
  41. }
  42. int cnt;
  43. int r[];
  44. int top[],id[],pos[];
  45. inline void dfs2(int u,int rt){
  46. top[u]=rt;
  47. id[u]=++cnt;
  48. pos[cnt]=u;
  49. if(son[u])
  50. dfs2(son[u],rt);
  51. for(int i=pre[u];i!=-;i=a[i].n){
  52. int e(a[i].e);
  53. if(e!=fa[u]&&e!=son[u])
  54. dfs2(e,e);
  55. }
  56. r[u]=cnt;
  57. }
  58. int sum[];
  59. inline int lowbit(int x){
  60. return x&-x;
  61. }
  62. inline void update(int pos,int c){
  63. while(pos<=n){
  64. sum[pos]+=c;
  65. pos+=lowbit(pos);
  66. }
  67. }
  68. inline int su(int pos){
  69. int ret();
  70. while(pos){
  71. ret+=sum[pos];
  72. pos-=lowbit(pos);
  73. }
  74. return ret;
  75. }
  76. inline int query(int l,int r){
  77. return su(r)-su(l-);
  78. }
  79. inline void swp(int &a,int &b){
  80. a^=b;
  81. b^=a;
  82. a^=b;
  83. }
  84. inline int LCA(int x,int y){
  85. while(top[x]^top[y]){
  86. if(dep[top[x]]<dep[top[y]])
  87. swp(x,y);
  88. x=fa[top[x]];
  89. }
  90. return dep[x]<dep[y]?x:y;
  91. }
  92. inline void change(int x,int y){
  93. int lca(LCA(x,y));
  94. update(id[lca],-);
  95. update(id[x],);
  96. update(id[y],);
  97. }
  98. inline int Q(int x){
  99. return query(id[x],r[x]);
  100. }
  101. typedef long long L;
  102. L ans();
  103. inline L get(int x){
  104. if(x==)
  105. return m;
  106. if(x==)
  107. return ;
  108. else
  109. return ;
  110. }
  111. inline int gg(){
  112. freopen("yam.in","r",stdin);
  113. freopen("yam.out","w",stdout);
  114. memset(pre,-,sizeof(pre));
  115. n=read(),m=read();
  116. for(int i=;i<n;i++){
  117. int x(read()),y(read());
  118. insert(x,y);
  119. insert(y,x);
  120. }
  121. dfs1();
  122. dfs2(,);
  123. for(int i=;i<=m;i++){
  124. int x(read()),y(read());
  125. change(x,y);
  126. }
  127. for(int i=;i<=n;i++){
  128. int ret(Q(i));
  129. ans+=get(ret);
  130. }
  131. printf("%d",ans);
  132. }
  133. int K(gg());
  134. int main(){;}
ps:树状数组比线段树lazy快一万倍= =

[补档][COGS 2434]暗之链锁的更多相关文章

  1. COGS 2434 暗之链锁 题解

    [题意] 给出一个有n个点的无向图,其中有n-1条主要边且这些主要边构成一棵树,此外还有m条其他边,求斩断原图的一条主要边和一条其他边使得图不连通的方案数. 注意,即使只斩断主要边就可以使得原图不连通 ...

  2. COGS 2437 暗之链锁 II 题解

    [题意] 给出一个有n个点的无向图,其中有n-1条主要边且这些主要边构成一棵树,此外还有m条其他边,求斩断原图的一条主要边和k条其他边使得图不连通的方案数mod109+7的值. 注意,就算你切断一条主 ...

  3. [补档][COGS 426]血帆海盗

    [COGS 426]血帆海盗 题目 传送门:http://cogs.pro/cogs/problem/problem.php?pid=426 随着资本的扩大,藏宝海湾贸易亲王在卡利姆多和东部王国大陆各 ...

  4. STL 补档

    STL 补档 1.vector 作用:它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据. vector在C++标准模板库中的部分内容,它是 ...

  5. 图论补档——KM算法+稳定婚姻问题

    突然发现考前复习图论的时候直接把 KM 和 稳定婚姻 给跳了--emmm 结果现在刷训练指南就疯狂补档.QAQ. KM算法--二分图最大带权匹配 提出问题 (不严谨定义,理解即可) 二分图 定义:将点 ...

  6. 【COGS 2434】 暗之链锁 树上差分+LCA

    差分就是把一个值拆成许多差的和如 1 2 4 6 9 那么 把这个东西拆成 1 1 2 2 3 就是了,当然也可以理解为对一个问题分解为多个子问题并对其进行操作来得到原问题的答案. 树上差分就更玄妙了 ...

  7. [补档] 大假期集训Part.1

    新博客搭起来先补一发档... 那就从大假期集训第一部分说起好了QwQ 自己还是太菜掉回了2016级水平 day1: day1的时候来得有点晚(毕竟准高一)然后进机房发现早就开考了还没有给我题面于是搞了 ...

  8. 软件安装配置笔记(三)——ArcGIS系列产品安装与配置(补档)(附数据库连接及数据导入)

    在前两篇安装配置笔记之后,就忘记把其他安装配置笔记迁移过来了,真是失误失误!趁现在其他文档需要赶紧补上. 目录: 一.ArcMap 二.ArcMap连接数据库并导入数据 三.Arcgis Pro 四. ...

  9. [补档]暑假集训D7总结

    刷题 上午刷了一上午的网络流 (md建图快建吐了),然后就搞了一个网络流的索引= = (实在看不下去那篇大长文了啊喂),然后发现都是水题= =,我还瞎××乱刷 下午--听说我要刷平衡树? Blog 日 ...

随机推荐

  1. Go 从入门到精通(三)字符串,时间,流程控制,函数

    一.strings和strconv的使用 strings strings.HasPrefix(s string,preffix string) bool:判断字符串s是否以prefix开头 stirn ...

  2. JS如何实现真正的对象常量

    前言 众所周知ES6新增的const关键字可以用来声明常量,但是它只对基本数据类型生效(Number.String.Boolean等),那如果我们想声明一个常量对象呢?该如何实现,Object内置对象 ...

  3. php中的date函数

    一.带零 echo date('Y-m-d');2012-08-08二.不带零 echo date('Y-n-j');2012-8-8

  4. phpexcl导出数据

    <?php public function export_do_one(){ //excel 导出数据 import('ORG.Util.Page_new');// 导入分页类 ,修改了原来的P ...

  5. Git操作简介

    一 概述 1.什么是Git? Git是分布式版本控制系统. 2.集中式与分布式对比 在集中式版本控制系统中,版本库集中在中央服务器上,每次工作时都需要先从中央服务器获取最新版本,修改后,再推送到中央服 ...

  6. 机器学习之分类问题实战(基于UCI Bank Marketing Dataset)

    导读: 分类问题是机器学习应用中的常见问题,而二分类问题是其中的典型,例如垃圾邮件的识别.本文基于UCI机器学习数据库中的银行营销数据集,从对数据集进行探索,数据预处理和特征工程,到学习模型的评估与选 ...

  7. create groups 和 create folder reference

      当将文件拖入工程中的时候会出现这个对话框,这个对话框中在Added folders中有两种选择:Create groups 和 Create folder references   这两种的区别是 ...

  8. 我的学习之路_第二十五_javaScript

    Javascript 作用:可以对表单数据进行校验,可以对页面实现一些动态效果 定义: JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型. 它的解释器被称为 ...

  9. isNAN()的使用

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  10. 第三章:3.3 post 请求

    1. 在 from表单中将 属性 methtod="post‘ 改变成post 2. 访问主页地址:http://localhost:8000/index 3. 以上出现的错误. 查资料发现 ...