题目大意:

http://www.lydsy.com/JudgeOnline/problem.php?id=3221

题解

啊呀。。。这是昨天的考试题啊。。。直接就粘了。。

4515: [Sdoi2016]游戏类似,还更简单了一些。

(考场上因为没开long long爆了25分)

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(ll &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
const ll maxn = 100010;
struct Edge{
ll to,next;
}G[maxn<<1];
ll head[maxn],cnt;
void add(ll u,ll v){
G[++cnt].to = v;
G[cnt].next = head[u];
head[u] = cnt;
}
#define v G[i].to
ll fa[maxn],dfn[maxn],top[maxn],dep[maxn],siz[maxn];
ll son[maxn],dfs_clock,seq[maxn],sum[maxn];
void dfs(ll u){
siz[u] = 1;
for(ll i = head[u];i;i=G[i].next){
if(v == fa[u]) continue;
fa[v] = u;
dep[v] = dep[u] + 1;
dfs(v);
siz[u] += siz[v];
if(siz[son[u]] < siz[v]) son[u] = v;
}
}
void dfs(ll u,ll tp){
top[u] = tp;dfn[u] = ++dfs_clock;
seq[dfs_clock] = u;
if(son[u]) dfs(son[u],tp);
for(ll i = head[u];i;i=G[i].next){
if(v == son[u] || v == fa[u]) continue;
dfs(v,v);
}
}
#undef v
inline ll lca(ll u,ll v){
while(top[u] != top[v]){
if(dep[top[u]] < dep[top[v]]) swap(u,v);
u = fa[top[u]];
}return dep[u] < dep[v] ? u : v;
} struct Node{
Node *ch[2];
ll sum,k,b;
ll dep_sum;
void update(){
dep_sum = ch[0]->dep_sum + ch[1]->dep_sum;
sum = ch[0]->sum + ch[1]->sum;
}
}*null,*root[maxn],*rt;
Node mem[25001001],*it;
inline void init(){
it = mem;
null = it++;null->ch[0] = null->ch[1] = null;
null->sum = null->k = null->b = 0;null->dep_sum = 0;
root[0] = null;
}
inline Node *newNode(){
Node *p = it++;p->ch[0] = p->ch[1] = null;
p->sum = p->k = p->b = p->dep_sum = 0;
return p;
}
ll L,R,K,B,n,T;
Node *change(Node *rt,ll l,ll r){
Node *p = newNode();*p = *rt;
if(L <= l && r <= R){
p->k += K;p->b += B;
p->sum += K*p->dep_sum + B*(r-l+1);
return p;
}ll mid = (l+r) >> 1;
if(L <= mid) p->ch[0] = change(p->ch[0],l,mid);
if(R > mid) p->ch[1] = change(p->ch[1],mid+1,r);
p->update();p->sum += p->dep_sum*p->k + (r-l+1)*p->b;
return p;
}
void change(ll u,ll v,ll a,ll b){
ll lc = lca(u,v);
K = -b;B = (a+dep[u]*b);
while(top[u] != top[lc]){
L = dfn[top[u]];R = dfn[u];
rt = change(rt,1,n);
u = fa[top[u]];
}
L = dfn[lc];R = dfn[u];
rt = change(rt,1,n);
K = b;B -= 2*dep[lc]*b;
while(top[v] != top[lc]){
L = dfn[top[v]];R = dfn[v];
rt = change(rt,1,n);
v = fa[top[v]];
}
L = dfn[lc];R = dfn[v];
if(L == R) return;++L;
rt = change(rt,1,n);
}
ll query(Node *p,ll l,ll r,ll L,ll R){
if(L <= l && r <= R){
return p->sum;
}
ll ret = (sum[min(r,R)] - sum[max(l,L)-1])*p->k + p->b*(min(r,R) - max(l,L) + 1);
ll mid = (l+r) >> 1;
if(L <= mid) ret += query(p->ch[0],l,mid,L,R);
if(R > mid) ret += query(p->ch[1],mid+1,r,L,R);
return ret;
}
inline ll query(ll u,ll v){
ll ret = 0;
while(top[u] != top[v]){
if(dep[top[u]] < dep[top[v]]) swap(u,v);
ret += query(rt,1,n,dfn[top[u]],dfn[u]);
u = fa[top[u]];
}if(dep[u] > dep[v]) swap(u,v);
ret += query(rt,1,n,dfn[u],dfn[v]);
return ret;
}
Node *build(ll l,ll r){
Node *p = newNode();
if(l == r){
p->dep_sum = dep[seq[l]];
p->sum = 0;
return p;
}
ll mid = (l+r) >> 1;
p->ch[0] = build(l,mid);
p->ch[1] = build(mid+1,r);
p->update();return p;
}
char s[10];
int main(){
init();
ll last = 0,total = 0;
ll m;read(n);read(m);
for(ll i=1,u,v;i<n;++i){
read(u);read(v);
add(u,v);add(v,u);
}dfs(1);dfs(1,1);root[0] = build(1,n);
sum[0] = 0;
for(ll i=1;i<=n;++i) sum[i] = sum[i-1] + dep[seq[i]];
rt = root[0];
ll u,v,a,b,w;
while(m--){
scanf("%s",s);
if(*s == 'c'){
read(u);read(v);read(a);read(b);
u ^= last;v ^= last;
change(u,v,a,b);
root[++total] = rt;
}else if(*s == 'q'){
read(u);read(v);
u ^= last;v ^= last;
printf("%lld\n",last = query(u,v));
}else{
read(w);w ^= last;
rt = root[w];
}
}
getchar();getchar();
return 0;
}

bzoj 3221: Obserbing the tree树上询问 树链剖分+线段树的更多相关文章

  1. BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )

    BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...

  2. 【POJ3237】Tree(树链剖分+线段树)

    Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...

  3. POJ3237 Tree 树链剖分 线段树

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ3237 题意概括 Description 给你由N个结点组成的树.树的节点被编号为1到N,边被编号为1 ...

  4. BZOJ.1036 [ZJOI2008]树的统计Count ( 点权树链剖分 线段树维护和与最值)

    BZOJ.1036 [ZJOI2008]树的统计Count (树链剖分 线段树维护和与最值) 题意分析 (题目图片来自于 这里) 第一道树链剖分的题目,谈一下自己的理解. 树链剖分能解决的问题是,题目 ...

  5. BZOJ 3672[NOI2014]购票(树链剖分+线段树维护凸包+斜率优化) + BZOJ 2402 陶陶的难题II (树链剖分+线段树维护凸包+分数规划+斜率优化)

    前言 刚开始看着两道题感觉头皮发麻,后来看看题解,发现挺好理解,只是代码有点长. BZOJ 3672[NOI2014]购票 中文题面,题意略: BZOJ 3672[NOI2014]购票 设f(i)f( ...

  6. Spoj Query on a tree SPOJ - QTREE(树链剖分+线段树)

    You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, ...

  7. Water Tree CodeForces 343D 树链剖分+线段树

    Water Tree CodeForces 343D 树链剖分+线段树 题意 给定一棵n个n-1条边的树,起初所有节点权值为0. 然后m个操作, 1 x:把x为根的子树的点的权值修改为1: 2 x:把 ...

  8. Aizu 2450 Do use segment tree 树链剖分+线段树

    Do use segment tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.bnuoj.com/v3/problem_show ...

  9. bzoj 4196 [Noi2015]软件包管理器 (树链剖分+线段树)

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2852  Solved: 1668[Submit][Sta ...

随机推荐

  1. python 深复制与浅复制------copy模块

    模块解读: 浅复制: x = copy.copy(y)深复制: x = copy.deepcopy(y)(注:模块特有的异常,copy.Error) 深copy与浅copy的差别主要体现在当有混合对象 ...

  2. ASP.NET中指定自定义HTTP响应标头

    新建一个类HideServerHeaderHelper,继承 IHttpModule,然后重写 OnPreSendRequestHeaders,Dispose,Init方法,如下代码所示 using ...

  3. EasyDSS+EasyNVR实现幼儿园直播/工地直播等分权限观看直播视频的功能

    在EasyNVR互联网直播服务器使用说明书中有关于EasyNVR分组的介绍: "EasyNVR的功能定位就是为视频应用层输出视频设备接入/标准视频输出的能力平台层,只做基础的视频通道接入.视 ...

  4. Ajax之基础总结

    一.Ajax 简介 Ajax 由 HTML.JavaScript技术.DHTML 和 DOM 组成,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用程序.在详细探讨 Ajax 是 ...

  5. vs05字节对齐问题又一不小心就弄去了我一个下午的时间

    由于一字节的对齐问题,我调一个库调了我基本一个下午..... 犯错其实并不可怕, 可怕的是你一犯再犯...... 这也算得上是难能可贵... /Zp (Struct Member Alignment) ...

  6. JavaScript 中 onload 事件绑定多个方法的优化建议

    页面加载完毕时会触发 onload 事件.基于内容(HTML)要与行为(JavaScript)分离的编码思想,我们需要将一些对页面的初始化操作写在方法内,并通过window.onload = func ...

  7. fkwの题目(祝松松生日快乐!)

    麓山国际实验学校 傅少,匡哥和巨夫出的题目(共3道) 一.题目概况 题目名称 打地铺 泡妹子 开房间 题目类型 传统 传统 传统 可执行文件名 deeeep soccer room 输入文件名 dee ...

  8. Django利用form进行显示

    form的显示部分主要分为2部分:1.统一显示(表单里的所有字段): a.{{form.as_table}} b.{{form.as_p}}2.显示部分字段: {{ field.label_tag } ...

  9. Js自定义异常

    function MyError(msg){ this.name="MyError"; this.message = msg || "自定义异常的默认消息";} ...

  10. zabbix监控入门初步

    1.Zabbix是什么? Zabbix是一个基于Web界面的分布式系统监控的企业级开源软件.可以监视各种系统与设备的参数,保障服务器及设备的安全运营. 2.Zabbix的功能和特性 (1)安装与配置简 ...