bzoj3589 动态树 求链并 容斥

bzoj3589 动态树

链接

bzoj

思路

求链并。
发现只有最多5条链子,可以容斥。
链交求法:链顶是两条链顶深度大的那个,链底是两个链底的\(lca\)
如果链底深度小于链顶,就说明两条链没有交集。
复杂度\(m*2^klog^2n\)
还有一种做法。
把所有链子都打上\(0/1tag\),只有\(1\)才能有贡献。
应该挺麻烦的,或者说都挺好写的。

代码

#include <bits/stdc++.h>
using namespace std;
const int _=4e5+7;
int read() {int x=0,f=1;char s=getchar();for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';return x*f;
}
int n,Q,S[6],T[6];
struct node {int v,nxt;}e[_<<1];
int head[_],tot;
void add(int u,int v) {e[++tot].v=v;e[tot].nxt=head[u];head[u]=tot;
}
namespace seg {#define ls rt<<1#define rs rt<<1|1struct node {int l,r,siz,tot,lazy;}e[_<<2];void build(int l,int r,int rt) {e[rt].l=l,e[rt].r=r,e[rt].siz=r-l+1;if(l==r) return;int mid=(l+r)>>1;build(l,mid,ls);build(mid+1,r,rs);}void pushdown(int rt) {if(e[rt].lazy) {e[ls].tot+=e[ls].siz*e[rt].lazy;e[rs].tot+=e[rs].siz*e[rt].lazy;e[ls].lazy+=e[rt].lazy;e[rs].lazy+=e[rt].lazy;e[rt].lazy=0;}}void modify(int L,int R,int ad,int rt) {if(L<=e[rt].l&&e[rt].r<=R) {e[rt].tot+=e[rt].siz*ad;e[rt].lazy+=ad;return;}int mid=(e[rt].l+e[rt].r)>>1;pushdown(rt);if(L<=mid) modify(L,R,ad,ls);if(R>mid) modify(L,R,ad,rs);e[rt].tot=e[ls].tot+e[rs].tot;}int query(int L,int R,int rt) {if(L<=e[rt].l&&e[rt].r<=R) return e[rt].tot;int mid=(e[rt].l+e[rt].r)>>1,ans=0;pushdown(rt);if(L<=mid) ans+=query(L,R,ls);if(R>mid) ans+=query(L,R,rs);return ans;}
}
int dep[_],f[_],siz[_],son[_],top[_],idx[_],cnt;
void dfs1(int u,int fa) {dep[u]=dep[fa]+1;siz[u]=1;f[u]=fa;for(int i=head[u];i;i=e[i].nxt) {int v=e[i].v;if(v==fa) continue;dfs1(v,u);siz[u]+=siz[v];if(siz[v]>siz[son[u]]) son[u]=v;}
}
void dfs2(int u,int topf) {idx[u]=++cnt;top[u]=topf;if(!son[u]) return;dfs2(son[u],topf);for(int i=head[u];i;i=e[i].nxt) {int v=e[i].v;if(!idx[v]) dfs2(v,v);}
}
int LCA(int x,int y) {while(top[x]!=top[y]) {if(dep[top[x]]<dep[top[y]]) swap(x,y);x=f[top[x]];} if(dep[x]>dep[y]) swap(x,y);return x;
}
int QQ(int x,int y) {int tot=0;while(top[x]!=top[y]) {if(dep[top[x]]<dep[top[y]]) swap(x,y);tot+=seg::query(idx[top[x]],idx[x],1);x=f[top[x]];}if(dep[x]>dep[y]) swap(x,y);tot+=seg::query(idx[x],idx[y],1);return tot;
}
void dsrrr(int &a,int &b,int x,int y) {a=dep[a]>dep[x]?a:x,b=LCA(b,y);if(dep[b]<dep[a]) a=-1,b=-1;
}
int calc(int x) {int s=0,t=0;for(int i=1;x;i++,x>>=1) {if(x&1) {if(!s&&!t) s=S[i],t=T[i];else dsrrr(s,t,S[i],T[i]);} if(s==-1&&t==-1) return 0;}return QQ(s,t);
}
int man[40];
int main() {n=read();for(int i=1,u,v;i<n;++i) {u=read(),v=read();add(u,v),add(v,u);}seg::build(1,n,1);dfs1(1,0),dfs2(1,1);Q=read();for(int i=1;i<(1<<5);++i)for(int j=0;j<5;++j)if(i&(1<<j)) man[i]++;while (Q --> 0) {int opt=read();if(!opt) {int u=read(),val=read();seg::modify(idx[u],idx[u]+siz[u]-1,val,1);} else {int k=read();for(int i=1;i<=k;++i) {S[i]=read(),T[i]=read();if(dep[S[i]]>dep[T[i]]) swap(S[i],T[i]);}int ans=0;for(int i=1;i<(1<<k);++i)ans+=(man[i]&1?1:-1)*calc(i);printf("%d\n",ans&2147483647);}}return 0;
}

转载于:https://www.cnblogs.com/dsrdsr/p/11405973.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363013.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NodeJS学习目录

前面的话 几年前&#xff0c;对于学习NodeJS可能还有所迟疑&#xff0c;怕分散了前端学习的精力。但到了现在&#xff0c;如果不学习nodeJS&#xff0c;前端的学习却可能无法再有所进展。技术的进步就是这么残酷。对新技术观望的时候&#xff0c;该技术已经大行其道了 小火柴将…

最佳加法表达式

题意&#xff1a;有一个由1..9组成的数字串.问如果将m个加号插入到这个数字串中,在各种可能形成的表达式中&#xff0c;值最小的那个表达式的值是多少。输入&#xff1a;5 31 2 3 4 5输出&#xff1a;24 1 #include<iostream>2 #include<algorithm>3 using namespa…

我最喜欢的IntelliJ IDEA功能

我已经是IntelliJ IDEA的长期用户&#xff08;和客户&#xff09;。 我想我是在2005年或2006年&#xff08;版本5.0&#xff09;左右开始使用它的。 那时我是Eclipse用户。 我的一些同事向我推荐了它&#xff0c;起初我没有被说服&#xff0c;但是在尝试之后我印象深刻。 现在…

[转载]PHP 计算时间差

我们常常在网站上看到某篇文章发表于“3天前”&#xff0c;“5个月前”&#xff0c;“4年前”。下面这个函数就提供了计算这个时间差的功能。 <?php/*** 时间差计算** param Timestamp $time* return String Time Elapsed* author Shelley Shyan* copyright http://phparch…

cd1101d 树形dp

cd1101d 简单dp 链接 codeforces 思路 所有数的质因数存下来&#xff0c;最多6个。 然后\(f[i][j][0/1]\)表示i子树内链gcd为j的i是否为链头。 暴力转移就行了 代码 #include <bits/stdc.h> using namespace std; const int _2e57,N2e5; int n,pri[_],vis[_],cnt; vector…

深入理解闭包系列第五篇——闭包的10种形式

前面的话 根据闭包的定义&#xff0c;我们知道&#xff0c;无论通过何种手段&#xff0c;只要将内部函数传递到所在的词法作用域以外&#xff0c;它都会持有对原始作用域的引用&#xff0c;无论在何处执行这个函数都会使用闭包。接下来&#xff0c;本文将详细介绍闭包的10种形式…

selenium 常见问题

启动selenium时报错如下异常&#xff1a; selenium.common.exceptions.WebDriverException: Message: geckodriver executable needs to be in PATH. 解决方式&#xff1a;需要下载geckodriver&#xff0c;并放在path的环境变量下&#xff0c;下载地址&#xff1a;https://gith…

通过示例了解挥发

我们已经花了几个月的时间来稳定Plumbr中的锁定检测功能 。 在此期间&#xff0c;我们遇到了许多棘手的并发问题。 许多问题是独特的&#xff0c;但是一种特殊类型的问题一直反复出现。 您可能已经猜到了–滥用volatile关键字。 我们已经发现并解决了许多问题&#xff0c;其中…

jQuery设计思想

前面的话 在深入了解jQuery的各个细节之前&#xff0c;需要对jQuery的设计思想有一个大致的了解。在遇到问题时&#xff0c; 知道应该使用jQuery的哪一个功能&#xff0c;然后迅速从手册中找到具体的用法。本文将详细介绍jQuery的设计思想 选择元素 jQuery的基本设计思想和主要…

sql性能优化二

1、IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂&#xff0c;这比较适合现代软件开发的风格。但是用IN的SQL性能总是比较低的&#xff0c;从Oracle执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别&#xff1a; ORACLE试图将其转换成多个表的连接&#xff0c;如果…

cf1039D 分块

cf1039D 链接 cf 思路 一次k可以贪心O(n)算。 对于\(≤\sqrt{n}\)的k&#xff0c;暴力算。 对于\(&#xff1e;\sqrt{n}\)的k&#xff0c;最多会有\(\sqrt{n}\)种答案&#xff0c;而且答案单调。 二分就行了。 复杂度\(O(nlognn\sqrt{n}logn)\) 递归会被卡&#xff0c;所以要记…

Source Insight 常用设置和快捷键大全

摘自&#xff1a;https://www.cnblogs.com/bluestorm/archive/2012/10/28/2743792.html Source Insight 4.0 文件类型、编码格式、tab转空格、tab键自动补全设置。。。http://www.cnblogs.com/bluestorm/p/6864540.html 1.括号配对高亮&#xff1a;“在前括号左侧&#xff0c;后…

JUnit中的参数化测试运行器

我们都有书面的单元测试&#xff0c;其中在一个测试中针对不同的可能的输入输出组合进行测试。 让我们以一个简单的斐波那契数列为例来看看它是如何完成的。 以下代码针对提到的元素数量计算斐波那契数列&#xff1a; import java.math.BigInteger; import java.util.ArrayLi…

HDU 1212 Big Number

题意&#xff1a;给一数字字符串s ( ns.size()<1000 ) 和数字m (<1e5) 求s%m 模拟除法&#xff0c; k初值0&#xff0c;按s[0]...累乘相加&#xff0c;把字符串还原成数字&#xff0c;比m大时-m&#xff0c;继续按位还原到s[n-1] 此时剩下的k再%m即为所求 #include<…

BOM之navigator对象和用户代理检测

前面的话 navigator对象现在已经成为识别客户端浏览器的事实标准&#xff0c;navigator对象是所有支持javascript的浏览器所共有的。本文将详细介绍navigator对象和用户代理检测 属性 与其他BOM对象的情况一样&#xff0c;每个浏览器中的navigator对象也都有一套自己的属性。下…

CF888G XOR-MST 最小异或生成树

CF888G XOR-MST 链接 CF888G 思路 trie上贪心&#xff0c;先左右两边连边&#xff0c;再用一条边的代价连起左右两颗树。因为内部的边一定比跨两棵树的边权笑&#xff0c;显然是对的。 代码自己瞎yy的。启发式合并 代码 #include <bits/stdc.h> #define ll long long usi…

页面事件的控制

1.设置默认焦点ASP.NET1.1中设置方法&#xff1a;<body onload"document.getElementById(TextBox1).focus();"><body onkeydown"document.all(TextBox1).focus();">ASP.NET2.0中设置方法&#xff1a;<form id"Form1"method"…

简而言之,JUnit:测试结构

尽管存在关于JUnit测试的书籍和文章&#xff0c;但我仍然经常遇到程序员&#xff0c;他们至多对这个工具及其正确用法都不甚了解。 因此&#xff0c;我想到了编写多部分教程的想法&#xff0c;从我的角度解释了要点。 也许在这个小型系列中采用的动手方法可能适合使一两个额外…

cf1207解题报告

cf1207解题报告 A 模拟 #include <bits/stdc.h> #define ll long long using namespace std; ll T,a,b,c,x,y; int main() {cin>>T;while(T --> 0) {cin>>a>>b>>c>>x>>y;ll ans0;if(x>y) {while(a>2&&b>1) ansx…

Oracle 用脚本安装第二个数据库

安装第二个数据库&#xff1a;登录oracle用户进入家目录&#xff0c;添加配置环境变量&#xff1a;vi .bash_profier ORACLE_SIDprod2临时环境变量&#xff1a;$export ORACLE_HOME/u01/app/oracle/product/11.2.0/db_1 $export ORACLE_SIDprod2创建第二个数据库文件目录&#…