【题解】SDOI2014旅行
大概是一道树链剖分的裸题。可以看出如果不是查询相同宗教的这一点,就和普通的树链剖分毫无两样了。所以针对每一个宗教都单独开一棵线段树,变成单点修改+区间查询。只不过宗教数目很多,空间消耗太大所以只能开一棵总的再动态开点。
#include <bits/stdc++.h>
using namespace std;
#define maxn 200500
#define maxm 2000000
int n, q, cnp = , cnt, tot, root[maxn], name[maxn], head[maxn], w[maxn], c[maxn];
struct node
{
int id, size, fa, dep, hson, gra;
}P[maxn]; struct edge
{
int to, last;
}E[maxn]; struct tree
{
int sum, ext, lson, rson;
}T[maxm]; int read()
{
int x = , k = ;
char c;
c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} void add(int x, int y)
{
E[cnp].to = y, E[cnp].last = head[x], head[x] = cnp ++;
} struct Segament_Tree
{
int query1(int p, int l, int r, int L, int R)
{
if(l <= L && r >= R) return T[p].sum;
if(l > R || r < L) return ;
int mid = (L + R) >> ;
return query1(T[p].lson, l, r, L, mid) + query1(T[p].rson, l, r, mid + , R);
} int query2(int p, int l, int r, int L, int R)
{
if(l <= L && r >= R) return T[p].ext;
if(l > R || r < L) return ;
int mid = (L + R) >> ;
return max(query2(T[p].lson, l, r, L, mid), query2(T[p].rson, l, r, mid + , R));
} void update(int &p, int L, int R, int x, int w)
{
if(!p) p = ++ cnt;
if(L == R)
{
T[p].sum = T[p].ext = w;
return;
}
int mid = (L + R) >> ;
if(x <= mid) update(T[p].lson, L, mid, x, w);
else update(T[p].rson, mid + , R, x, w);
T[p].sum = T[T[p].lson].sum + T[T[p].rson].sum;
T[p].ext = max(T[T[p].lson].ext, T[T[p].rson].ext);
} }ST[maxn]; struct Heavy_Light_Decomposition
{
int dfs(int u)
{
P[u].size = ;
for(int i = head[u]; i; i = E[i].last)
{
int v = E[i].to;
if(v == P[u].fa) continue;
P[v].dep = P[u].dep + , P[v].fa = u;
dfs(v);
P[u].size += P[v].size;
if(P[v].size > P[P[u].hson].size) P[u].hson = v;
}
} int dfs2(int u, int anc)
{
P[u].id = ++ tot, P[u].gra = anc, name[tot] = u;
if(P[u].hson) dfs2(P[u].hson, anc);
for(int i = head[u]; i; i = E[i].last)
{
int v = E[i].to;
if(v == P[u].hson || v == P[u].fa) continue;
dfs2(v, v);
}
} void update1(int x, int r)
{
ST[c[x]].update(root[c[x]], , tot, P[x].id, );
ST[r].update(root[r], , tot, P[x].id, w[x]);
c[x] = r;
} void update2(int x, int t)
{
ST[c[x]].update(root[c[x]], , tot, P[x].id, t);
w[x] = t;
} void query1(int x, int y)
{
int tx = P[x].gra, ty = P[y].gra;
int r = c[x];
int ans = ;
while(tx != ty)
{
if(P[tx].dep < P[ty].dep) swap(x, y), swap(tx, ty);
ans += ST[r].query1(root[r], P[tx].id, P[x].id, , tot);
x = P[tx].fa, tx = P[x].gra;
}
if(P[x].dep < P[y].dep) swap(x, y), swap(tx, ty);
ans += ST[r].query1(root[r], P[y].id, P[x].id, , tot);
printf("%d\n", ans);
} void query2(int x, int y)
{
int tx = P[x].gra, ty = P[y].gra;
int r = c[x];
int ans = ;
while(tx != ty)
{
if(P[tx].dep < P[ty].dep) swap(x, y), swap(tx, ty);
ans = max(ans, ST[r].query2(root[r], P[tx].id, P[x].id, , tot));
x = P[tx].fa, tx = P[x].gra;
}
if(P[x].dep < P[y].dep) swap(x, y), swap(tx, ty);
ans = max(ans, ST[r].query2(root[r], P[y].id, P[x].id, , tot));
printf("%d\n", ans);
} }HLD; int main()
{
n = read(), q = read();
for(int i = ; i <= n; i ++)
w[i] = read(), c[i] = read();
for(int i = ; i < n; i ++)
{
int x = read(), y = read();
add(x, y), add(y, x);
}
HLD.dfs(), HLD.dfs2(, );
for(int i = ; i < maxn; i ++) root[i] = ++ cnt;
for(int i = ; i <= n; i ++) ST[c[i]].update(root[c[i]], , tot, P[i].id, w[i]);
for(int i = ; i <= q; i ++)
{
string s;
cin >> s;
int x = read(), y = read();
if(s[] == 'C')
{
if(s[] == 'C') HLD.update1(x, y);
else HLD.update2(x, y);
}
else
{
if(s[] == 'S') HLD.query1(x, y);
else HLD.query2(x, y);
}
}
return ;
}
【题解】SDOI2014旅行的更多相关文章
- 【BZOJ3531】[Sdoi2014]旅行 树链剖分+动态开点线段树
[BZOJ3531][Sdoi2014]旅行 Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天 ...
- BZOJ 3531: [Sdoi2014]旅行 [树链剖分]
3531: [Sdoi2014]旅行 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1685 Solved: 751[Submit][Status] ...
- bzoj 3531 [Sdoi2014]旅行(树链剖分,线段树)
3531: [Sdoi2014]旅行 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 876 Solved: 446[Submit][Status][ ...
- [SDOI2014]旅行
洛谷 P3313 [SDOI2014]旅行 https://www.luogu.org/problem/show?pid=3313 题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接 ...
- B20J_3231_[SDOI2014]旅行_树链剖分+线段树
B20J_3231_[SDOI2014]旅行_树链剖分+线段树 题意: S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,城市信仰不同的宗教,为了方便,我们用不同的正整数代表各种宗教. S国 ...
- [luogu P3313] [SDOI2014]旅行
[luogu P3313] [SDOI2014]旅行 题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神 ...
- 洛谷 P3313 [SDOI2014]旅行 解题报告
P3313 [SDOI2014]旅行 题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教 ...
- bzoj 3531 [Sdoi2014]旅行 (树剖+线段树 动态开点)
3531: [Sdoi2014]旅行 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 2984 Solved: 1312[Submit][Status ...
- P3313 [SDOI2014]旅行
P3313 [SDOI2014]旅行 树链剖分+动态线段树(并不是lct) 显然的,我们对于每一个宗教都要维护一个线段树. (那么空间不是爆炸了吗) 在这里引入:动态开点线段树 就是需要的点开起来,不 ...
- 3531: [Sdoi2014]旅行
3531: [Sdoi2014]旅行 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 1731 Solved: 772 [Submit][Statu ...
随机推荐
- 【rip-基础配置】
配置rip,默认rip id为 1:rip有version1和version2两个版本;宣告与rip直连的网段; 优化rip: [interface_name] rip poison-reverse ...
- C#中给WebClient添加代理Proxy
效果图: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; ...
- 基于pygame的打砖块游戏,做到一半,不带做了
跟着一个博主做的,前面的变量的定义全是内个哥们的,没带任何改动,就做了个界面,背景音乐,绘制了个小球,绘制了挡板 小球可以撞到边界反弹,然后做了砖块,定义了一个存放砖块的列表,,,就没有下文了 原博主 ...
- struts2学习
struts2是一种基于mvc模式的轻量级web框架,它本质上相当于一个servlet,在mvc设计模式中,struts2作为控制器(Controller)来建立模型与视图的数据交互,struts2采 ...
- unity独立游戏开发日志2018/09/22
f::很头痛之前rm做的游戏在新电脑工程打不开了...只能另起炉灶... 还不知道新游戏叫什么名...暂且叫方块世界.(素材已经授权) 首先是规划下场景和素材文件夹的建立. unity常用的文件夹有: ...
- 文件 I/O缓冲流
import java.io.File; import java.io.Writer; import java.util.StringTokenizer; import java.io.Reader; ...
- 嵌入式框架Zorb Framework搭建七:任务的实现
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...
- python2.7练习小例子(十)
10):古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 程序分析:兔子的规律为数列1,1 ...
- ajax同步和异步的切换
ajax为网页提供了非常不错的异步机制,但是有时候两个ajax放在一起,希望第一个完成后再继续第二个ajax的执行.这时候可以将第一个ajax代码带上同步参数即可,如下: $.ajax({ async ...
- P3527 [POI2011]MET-Meteors
P3527 [POI2011]MET-Meteors 链接 整体二分! 代码 #include<bits/stdc++.h> using namespace std; typedef lo ...