方法很简单,树剖,把区间提取出来,打翻转标记,再放回去。本来以为写起来也很简单T_T

注:由于某种原因,我写的是把题目中的r忽略掉的一般情况,否则写起来简单得多。

#include<bits/stdc++.h>
#define N 50005
#define M (s+t>>1)
#define L(t)(t)->c[0]
#define R(t)(t)->c[1]
#define Z(t)(L(t)->s+1)
using namespace std;
typedef long long ll;
struct edge{
int v;
edge*s;
}e[N*2];
edge*back=e,*h[N];
void add(int u,int v){
*back={v,h[u]};
h[u]=back++;
*back={u,h[v]};
h[v]=back++;
}
typedef int arr[N];
arr d,p,num,size,son,top;
void dfs1(int u){
d[u]=d[p[u]]+1;
size[u]=1;
int s=0;
for(edge*i=h[u];i;i=i->s)
if(i->v!=p[u]){
p[i->v]=u;
dfs1(i->v);
size[u]+=size[i->v];
if(s<size[i->v])
s=size[son[u]=i->v];
}
}
void dfs2(int u){
static int tot;
num[u]=++tot;
if(size[u]!=1){
top[son[u]]=top[u];
dfs2(son[u]);
}
for(edge*i=h[u];i;i=i->s)
if(i->v!=p[u]&&i->v!=son[u])
dfs2(top[i->v]=i->v);
}
struct node{
ll a[3];
int s,u,v;
bool rev;
node*c[2];
}mem[N];
node*last=mem,null[1]={0,1<<30},*root;
ll Sum(ll u,ll v){
return u+v;
}
ll Min(ll u,ll v){
return u<v?u:v;
}
ll Max(ll u,ll v){
return u<v?v:u;
}
ll(*f[3])(ll,ll)={
Sum,Min,Max
};
int devolve(node*t){
if(t==null)
return 0;
if(t->rev){
L(t)->rev^=1;
R(t)->rev^=1;
t->rev=0;
swap(L(t),R(t));
}
if(int u=t->u){
t->u=0;
L(t)->u+=u;
R(t)->u+=u;
t->a[1]+=u;
t->a[2]+=u;
t->v+=u;
t->a[0]+=u*t->s;
}
return Z(t);
}
node*update(node*t){
devolve(L(t));
devolve(R(t));
for(int i=0;i!=3;++i)
t->a[i]=f[i](f[i](L(t)->a[i],R(t)->a[i]),t->v);
t->s=R(t)->s+Z(t);
return t;
}
void link(bool i,node*&t,node*&s){
node*d=t->c[i];
t->c[i]=s;
s=update(t),t=d;
}
node*splay(int v,node*&t=root){
node*d[]={
null,null
};
while(v!=devolve(t)){
bool i=v>Z(t);
v-=i*Z(t);
if(v!=devolve(t->c[i])&&i==v>Z(t->c[i])){
v-=i*Z(t->c[i]);
link(i,t,t->c[i]->c[i^1]);
}
link(i,t,d[i]);
}
for(int i=0;i!=2;++i){
node*s=t->c[i^1];
while(d[i]!=null)
link(i,d[i],s);
t->c[i^1]=s;
}
return update(t);
}
node*&splay(int s,int t){
splay(s);
return L(splay(t-s+2,R(root)));
}
node*build(int s,int t){
if(s<=t){
node*i=last++;
L(i)=build(s,M-1);
R(i)=build(M+1,t);
return update(i);
}
return null;
}
struct vec{
int u,v,a;
vec(){}
vec(int u,int v):u(u),v(v),a(u){}
int size(){
return v-u+1;
}
}u[N],v[N];
int solve(int i,int j,vec*&u,vec*&v){
vec**s=&u,**t=&v;
for(;top[i]!=top[j];i=p[top[i]]){
if(d[top[i]]<d[top[j]])
swap(i,j),swap(s,t);
*(*s)++=vec(num[top[i]],num[i]);
}
if(d[i]<d[j])
swap(i,j),swap(s,t);
*(*s)++=vec(num[j],num[i]);
return num[j];
}
void amend(int p,int q,int j){
vec*s=u,*t=v;
solve(p,q,s,t);
while(s--!=u)
splay(s->u,s->v)->u+=j;
while(t--!=v)
splay(t->u,t->v)->u+=j;
}
ll query(int p,int q,int i){
ll j=i^1?0:1<<30;
vec*s=u,*t=v;
solve(p,q,s,t);
while(s--!=u)
j=f[i](j,splay(s->u,s->v)->a[i]);
while(t--!=v)
j=f[i](j,splay(t->u,t->v)->a[i]);
return j;
}
void invert(int p,int q){
node*j=null;
vec*s=u,*t=v;
solve(p,q,s,t);
vec*e=s;
while(t--!=v)
*e++=*t;
for(vec*i=u;i!=e;++i){
node*&a=splay(i->u,i->v);
a->rev=i<s;
L(splay(1,a))=j;
update(j=a);
a=null;
for(vec*z=u;z!=e;++z)
if(i->a<z->a){
z->u-=i->size();
z->v-=i->size();
}
}
j->rev=1;
for(vec*i=u;i!=e;++i){
node*&a=splay(i->u,i->u-1);
a=j;
j=R(splay(i->size(),a));
a->rev=i<s;
R(a)=null;
update(a);
for(vec*z=u;z!=e;++z)
if(i->a<z->a){
z->u+=i->size();
z->v+=i->size();
}
}
}
int main(){
int n,m,s,t,u;
char a[10];
scanf("%d%d%*d",&n,&m);
root=build(0,n+1);
for(int i=1;i!=n;++i){
scanf("%d%d",&s,&t);
add(s,t);
}
dfs1(1);
dfs2(top[1]=1);
while(m--){
scanf("%s%d%d",a,&s,&t);
if(a[2]=='v')
invert(s,t);
else if(a[2]=='c'){
scanf("%d",&u);
amend(s,t,u);
}else
printf("%lld\n",query(s,t,a[2]=='j'?2:a[2]!='m'));
}
}

BZOJ3159: 决战的更多相关文章

  1. BZOJ3159决战——树链剖分+非旋转treap(平衡树动态维护dfs序)

    题目描述 输入 第一行有三个整数N.M和R,分别表示树的节点数.指令和询问总数,以及X国的据点. 接下来N-1行,每行两个整数X和Y,表示Katharon国的一条道路. 接下来M行,每行描述一个指令或 ...

  2. bzoj3159决战 码农题 树剖套splay

    最近沉迷码农题无法自拔 首先有一个暴力的想法:对于每个重链维护一个splay,需要翻转的连起来,翻转,接回去 然后发现这样没问题... 一条链只能跨log个重链,也就只有log个splay的子树参与重 ...

  3. BZOJ3159: 决战(FHQ Treap)

    传送门: 解题思路: 算是补坑了,这题除了Invert以外就可以树剖线段树解决了. 考虑Invert操作,延续先前树链剖分的做法,考虑先前算法的瓶颈. 最暴力的方法是暴力交换权值,然而这种方法忽略了当 ...

  4. 2017-12 CDQZ集训(已完结)

    从联赛活了下来(虽然分数倒一……),接下来要去CDQZ集训啦…… DAY -2 2017-12-16 被老师安排负责一部分同学的住宿以及安排…… 抓紧时间继续学习,LCT真好玩啊真好玩…… 晚上放假了 ...

  5. CDQZ集训DAY2 日记

    依然很爆炸. T1上来有50分暴力分,打完后注意到了后50分的随机数据,开始想怎么去对付他.然后就开始思考随机数据意味着什么.想了想,想打一个扫描线或者分治.决策了一下还是打了一个扫描线+链表.然而只 ...

  6. 决战JS(二)

    紧接着上次的<决战JS>,分析总结一些比较实用的DEMO与新手分享,望大神拍砖. demo5.点击隐藏: 要实现这个功能只需要知道在onclick事件中加入对父节点的样式dislay设置为 ...

  7. 决战JS

    经过这几日的学习,测试和摸索,算是了解了一些关于javascript 的相关知识吧.学习过程中做出了一些小DEMO,现总结一下实现这些DEMO的基本思路,如有不妥或更为简便的方法,还希望大神拍砖,共同 ...

  8. 决战大数据之三-Apache ZooKeeper Standalone及复制模式安装及测试

    决战大数据之三-Apache ZooKeeper Standalone及复制模式安装及测试 [TOC] Apache ZooKeeper 单机模式安装 创建hadoop用户&赋予sudo权限, ...

  9. 决战大数据之二:CentOS 7 最新JDK 8安装

    决战大数据之二:CentOS 7 最新JDK 8安装 [TOC] 修改hostname # hostnamectl set-hostname node1 --static # reboot now 重 ...

随机推荐

  1. P和NP问题

    1. 通俗详细地讲解什么是P和NP问题 http://blog.sciencenet.cn/blog-327757-531546.html   NP----非定常多项式(英语:non-determin ...

  2. JavaScript学习笔记-new Date() 与 Date() 的区别

    var today1 = Date() //返回一个字符串(string),没有getDate等日期对象方法,内容为当前时间 var today2 = new Date() //返回一日期对象,内容为 ...

  3. 给li设置float浮动属性之后,无法撑开外层ul的问题。(原址:http://www.cnblogs.com/cielzhao/p/5781462.html)

    最近在项目中有好几次遇到这个问题,感觉是浮动引起的,虽然用<div style="clear:both"></div>解决了,但自己不是特别明白,又在网上查 ...

  4. Andriod ADB开启Activity、Service以及BroadCast(包括参数的传递)

    /*****************开启Activity  并传递参数*******************/ 使用am命令启动Activity并传递参数的方法,也能用作C层与Java进行数据传递的一 ...

  5. vmware 在NAT模式下连接上外网

    文章: http://www.2cto.com/os/201504/389011.html

  6. 创建mysql 存储过程

    CREATE PROCEDURE `test_insert_stu`() BEGIN DECLARE num INT; SET num = 0; WHILE (num<10) DO insert ...

  7. 学习Spring(三) 设置Bean作用域

    Spring中几种不同的作用域 Singleton     每个Spring IoC容器中创建一个Bean实例 Prototype    每次请求时创建一个新的Bean实例 Request     为 ...

  8. 【BZOJ 2693】jzptab

    莫名其妙地又卡在long long上了,我果然又在同一个地方犯逗. 在“在路上,同梦行”群里闹了个大笑话QAQ #include<cstdio> #include<cstring&g ...

  9. flex布局无法自动适应的bug以及实现textarea根据内容自适应

    -webkit-box布局无法自动适应高度的bug css3的新属性display:-webkit-box带来了前端开发自动适应布局的春天 ,但是我发现这个布局有个问题, 而且这个问题我无法解决: 描 ...

  10. 01python算法--算法和数据结构是什么鬼?

    我不想直接拷贝google 上面所有对算法的解释.所以我想怎么说就怎么说了,QAQ 1:什么是程序? 解决问题的范式 2:什么是问题? 程序输入与输出之间的联系 3:什么是算法: 算法就是解决问题的思 ...