LOJ2195 旅行
LOJ2195 旅行
题目描述
S 国有 N 个城市,编号从 1 到 N。城市间用 N-1 条双向道路连接,满足从一个城市出发可以到达其它所有城市。每个城市信仰不同的宗教,如飞天面条神教、隐形独角兽教、绝地教都是常见的信仰。为了方便,我们用不同的正整数代表各种宗教,S 国境内总共有 c 种不同的宗教。
S 国的居民常常旅行。旅行时他们总会走最短路,并且为了避免麻烦,只在信仰和他们相同的城市留宿。当然旅程的终点也是信仰与他相同的城市。S 国政府为每个城市标定了不同的旅行评级,旅行者们常会记下途中(包括起点和终点)留宿过的城市的评级总和或最大值。
在 S 国的历史上常会发生以下几种事件:
CC x c:城市 x 的居民全体改信了 c 教;
CW x w:城市 x 的评级调整为 w;
QS x y:一位旅行者从城市 x 出发,到城市 y,并记下了途中留宿过的城市的评级总和;
QM x y:一位旅行者从城市 x 出发,到城市 y,并记下了途中留宿过的城市的评级最大值。
由于年代久远,旅行者记下的数字已经遗失了,但记录开始之前每座城市的信仰与评级,还有事件记录本身是完好的。请根据这些信息,还原旅行者记下的数字。
为了方便,我们认为事件之间的间隔足够长,以致在任意一次旅行中,所有城市的评级和信仰保持不变。
输入格式
输入的第一行包含整数 N,Q 依次表示城市数和事件数。
接下来 N 行,第 i+1 行两个整数 Wi,Ci 依次表示记录开始之前,城市 i 的评级和信仰。
接下来 N-1 行每行两个整数 x,y 表示一条双向道路。
接下来 Q 行,每行一个操作,格式如上所述。
输出格式
对每个 QS 和 QM 事件,输出一行,表示旅行者记下的数字。
样例
样例输入
5 6
3 1
2 3
1 2
3 3
5 1
1 2
1 3
3 4
3 5
QS 1 5
CC 3 1
QS 1 5
CW 3 3
QS 1 5
QM 2 4
样例输出
8
9
1
3
数据范围与提示
对所有的数据,N,Q≤10^5, C≤10^5,对所有 QS 和 QM 事件,起点和终点城市的信仰相同;在任意时刻,城市的评级总是不大于 10^4 的正整数,且宗教值不大于 c。
_________________________________________________________________________________________
树链剖分,单点修改,求和。
但是由于只对对应的点(信奉相同的宗教)的点求和,而宗教的种类太多,每个线段树的点不能为10^5个点,所以要动态开点。
第一次写动态开点线段树,但过去用指针写过线段树,所以感觉不算难。
所谓动态开点,就是用不到的点先不要建点,只把对应的点建立,这样每次建一个点只需要建一条链(长logn)就可以了,不用的点先不用建。
其他的和普通线段树一样。
_________________________________________________________________________________________
1 #include<bits/stdc++.h>
2 using namespace std;
3 typedef int ll;
4 const ll maxn=1e5+10;
5 ll n,m;
6 struct edge
7 {
8 int u,v,nxt;
9 }e[maxn<<1];
10 ll head[maxn],js;
11 void addage(ll u,ll v)
12 {
13 e[++js].u=u;e[js].v=v;
14 e[js].nxt=head[u];head[u]=js;
15 }
16 ll w[maxn],c[maxn];
17 ll dep[maxn],fat[maxn],siz[maxn],son[maxn];
18 void dfs(ll u,ll fa)
19 {
20 dep[u]=dep[fa]+1;
21 fat[u]=fa;
22 siz[u]=1;
23 for(ll i=head[u];i;i=e[i].nxt)
24 {
25 ll v=e[i].v;
26 if(v==fa)continue;
27 dfs(v,u);
28 siz[u]+=siz[v];
29 if(!son[u] || siz[son[u]]<siz[v])son[u]=v;
30 }
31 }
32 ll p,pos[maxn],fos[maxn],top[maxn];
33 void getpos(ll u,ll fa)
34 {
35 pos[u]=++p;
36 fos[p]=u;
37 top[u]=fa;
38 if(!son[u])return ;
39 getpos(son[u],fa);
40 for(ll i=head[u];i;i=e[i].nxt)
41 {
42 ll v=e[i].v;
43 if(v!=fat[u] && v!=son[u])getpos(v,v);
44 }
45 }
46 struct node
47 {
48 int lc,rc,sm,mx;
49 }t[2001000];
50 int rt[maxn],cnt;
51 void update(ll cur)
52 {
53 t[cur].sm=t[t[cur].lc].sm+t[t[cur].rc].sm;
54 t[cur].mx=max(t[t[cur].lc].mx,t[t[cur].rc].mx);
55 }
56 void change(ll & cur,ll l,ll r,ll p,ll x)
57 {
58 if(!cur)cur=++cnt;
59 if(l==r)
60 {
61 t[cur].sm=t[cur].mx=x;
62 return ;
63 }
64 ll mid=(l+r)>>1;
65 if(p<=mid)change(t[cur].lc,l,mid,p,x);
66 else change(t[cur].rc,mid+1,r,p,x);
67 update(cur);
68 }
69 ll SUM,MAX;
70 void query(ll cur,ll l,ll r,ll ql,ll qr)
71 {
72 if(!cur)return ;
73 if(ql<=l && r<=qr)
74 {
75 SUM+=t[cur].sm;
76 MAX=max(MAX,t[cur].mx);
77 return ;
78 }
79 ll mid=(l+r)>>1;
80 if(ql<=mid)query(t[cur].lc,l,mid,ql,qr);
81 if(mid<qr)query(t[cur].rc,mid+1,r,ql,qr);
82 }
83 void ask(ll u,ll v)
84 {
85 SUM=0;MAX=0;
86 ll cl=c[u];
87 ll tpu=top[u],tpv=top[v];
88 while(tpu!=tpv)
89 {
90 if(dep[tpu]<dep[tpv])
91 {
92 swap(u,v);
93 swap(tpu,tpv);
94 }
95 query(rt[cl],1,n,pos[tpu],pos[u]);
96 u=fat[tpu];tpu=top[u];
97 }
98 if(dep[u]>dep[v])swap(u,v);
99 query(rt[cl],1,n,pos[u],pos[v]);
100 }
101 int main()
102 {
103 scanf("%d%d",&n,&m);
104 for(ll i=1;i<=n;++i)scanf("%d%d",w+i,c+i);
105 for(ll u,v,i=1;i<n;++i)
106 {
107 scanf("%d%d",&u,&v);
108 addage(u,v);addage(v,u);
109 }
110 dfs(1,0);
111 getpos(1,1);
112 for(ll i=1;i<=n;++i)change(rt[c[i]],1,n,pos[i],w[i]);
113 char s[4];
114 ll u,v;
115 while(m--)
116 {
117 scanf("%s%d%d",s,&u,&v);
118 if(s[1]=='W')
119 {
120 w[u]=v;
121 change(rt[c[u]],1,n,pos[u],v);
122 }
123 else if(s[1]=='C')
124 {
125 change(rt[c[u]],1,n,pos[u],0);
126 c[u]=v;
127 change(rt[c[u]],1,n,pos[u],w[u]);
128 }
129 else if(s[1]=='S')
130 {
131 ask(u,v);
132 printf("%d\n",SUM);
133 }
134 else
135 {
136 ask(u,v);
137 printf("%d\n",MAX);
138 }
139 }
140 return 0;
141 }
LOJ2195 旅行的更多相关文章
- BZOJ 3531: [Sdoi2014]旅行 [树链剖分]
3531: [Sdoi2014]旅行 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1685 Solved: 751[Submit][Status] ...
- vijos P1780 【NOIP2012】 开车旅行
描述 小\(A\)和小\(B\)决定利用假期外出旅行,他们将想去的城市从\(1\)到\(N\)编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市\(i\)的海拔高度为 ...
- 【BZOJ-1570】BlueMary的旅行 分层建图 + 最大流
1570: [JSOI2008]Blue Mary的旅行 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 388 Solved: 212[Submit ...
- codevs 1036 商务旅行(Targin求LCA)
传送门 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任意 ...
- nyoj 71 独木舟上的旅行(贪心专题)
独木舟上的旅行 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别.一条独木舟最多只能乘坐两个人,且乘客 ...
- 【bzoj3531】 [SDOI2014]旅行
题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰.为了方便,我们 ...
- tomcat源码分析(三)一次http请求的旅行-从Socket说起
p { margin-bottom: 0.25cm; line-height: 120% } tomcat源码分析(三)一次http请求的旅行 在http请求旅行之前,我们先来准备下我们所需要的工具. ...
- 11.14 T2 小x的旅行(小x的旅行)
1.小x的旅行 (travel.pas/c/cpp) [问题描述] 小x大学毕业后,进入了某个公司做了高层管理,他每年的任务就是检查这个公司在全国各地N个分公司的各种状况,每个公司都要检查一遍,且 ...
- hdoj 2066 一个人的旅行
Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰 ...
随机推荐
- 阿里云ssl证书过期怎么解决 (免费SSL证书) 三步解决
阿里云ssl证书过期怎么解决(免费SSL证书),三步解决 使用免费的SSL证书网站 https://ohttps.com 1.注册帐号 2.申请证书 3.部署到阿里云 4.注意事项 1.注册帐号 到 ...
- 【WPF】 问题总结-RaidButton修改样式模板后作用区域的变化
最近工作需要,需要重绘RaidButton控件,具体想要达成的的效果是这样的: 当点击按钮任意一个地方的时候,按钮的背景改变. 于是我是这样对控件模板进行修改的: <Style x:Key=&q ...
- ATM管理系统
一.题目要求 编写一个ATM管理系统,语言不限,要求应包括以下主要功能: (1)开户,销户 (2)查询账户余额 (3)存款 (4)取款 (5)转账(一个账户转到另一个账户)等 二.代码提交 开户 pu ...
- 学习 Gin 总结(2020.12.30-31)
2020.12.30 问题总结 中间件 context.Next() 源码注释: // Next should be used only inside middleware. // It execut ...
- java数组之binarySearch查找
/** * 1.如果找到目标对象则返回<code>[公式:-插入点-1]</code> * 插入点:第一个大与查找对象的元素在数组中的位置,如果数组中的所有元素都小于要查找的对 ...
- Spring项目出现--Error:java: Compilation failed: internal java compiler error
错误现象 使用Idea导入新项目或升级idea或新建项目时会出现以下异常信息: Error:java: Compilation failed: internal java compiler error ...
- 零基础学习python
一.python的注释方式: (1)python的单行注释: ctrl+/ # print('Hello World!') 这是当行注释 (2)python的多行注释: ''' ''' ' ' ' ...
- LeetCode 面试题16.18.模式匹配
模式匹配 题目: 你有两个字符串,即pattern和value. pattern字符串由字母"a"和"b"组成,用于描述字符串中的模式.例如,字符串" ...
- std::thread线程库详解(2)
目录 目录 简介 最基本的锁 std::mutex 使用 方法和属性 递归锁 std::recursive_mutex 共享锁 std::shared_mutex (C++17) 带超时的锁 总结 简 ...
- tomcat版本号修改已dwr配置错误安全漏洞整改
1.tomcat版本信息泄露修改方法:tomcat6是在tomcat/lib 下使用jar xf catalina.jar 解压这个jar包会得到两个目录:META-INF和org其中org\apac ...