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 旅行的更多相关文章

  1. BZOJ 3531: [Sdoi2014]旅行 [树链剖分]

    3531: [Sdoi2014]旅行 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1685  Solved: 751[Submit][Status] ...

  2. vijos P1780 【NOIP2012】 开车旅行

    描述 小\(A\)和小\(B\)决定利用假期外出旅行,他们将想去的城市从\(1\)到\(N\)编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市\(i\)的海拔高度为 ...

  3. 【BZOJ-1570】BlueMary的旅行 分层建图 + 最大流

    1570: [JSOI2008]Blue Mary的旅行 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 388  Solved: 212[Submit ...

  4. codevs 1036 商务旅行(Targin求LCA)

    传送门 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任意 ...

  5. nyoj 71 独木舟上的旅行(贪心专题)

    独木舟上的旅行 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别.一条独木舟最多只能乘坐两个人,且乘客 ...

  6. 【bzoj3531】 [SDOI2014]旅行

    题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰.为了方便,我们 ...

  7. tomcat源码分析(三)一次http请求的旅行-从Socket说起

    p { margin-bottom: 0.25cm; line-height: 120% } tomcat源码分析(三)一次http请求的旅行 在http请求旅行之前,我们先来准备下我们所需要的工具. ...

  8. 11.14 T2 小x的旅行(小x的旅行)

    1.小x的旅行   (travel.pas/c/cpp) [问题描述] 小x大学毕业后,进入了某个公司做了高层管理,他每年的任务就是检查这个公司在全国各地N个分公司的各种状况,每个公司都要检查一遍,且 ...

  9. hdoj 2066 一个人的旅行

    Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰 ...

随机推荐

  1. 学习Promise异步编程

    JavaScript引擎建立在单线程事件循环的概念上.单线程( Single-threaded )意味着同一时刻只能执行一段代码.所以引擎无须留意那些"可能"运行的代码.代码会被放 ...

  2. Spring boot 启动错误处理:Action: Consider the following: If you want an embedded database (H2, HSQL or Derby), please put it on the classpath. If you have database settings to be loaded from a particular...

    错误原因 在pom中引入了mybatis-spring-boot-starter ,Spring boot默认会加载org.springframework.boot.autoconfigure.jdb ...

  3. udp聊天室--简易

    package 聊天; /*一切随便消逝吧*/ import java.net.DatagramSocket; import java.net.SocketException; public clas ...

  4. [标签] Java学习日报7.28

    package minG;import java.util.*;public class MinG { public static void main(String[] args) { // TODO ...

  5. 解析STM32的库函数

    意法半导体在推出STM32微控制器之初,也同时提供了一套完整细致的固件开发包,里面包含了在STM32开发过程中所涉及到的所有底层操作.通过在程序开发中引入这样的固件开发包,可以使开发人员从复杂冗余的底 ...

  6. 被自己以为的GZIP秀到了

    问题的开始 我司某产品线有这么一个神奇接口 (https://host/path/customQuery) 该接口在预发或线上缓存正常的情况下TTFB为150ms左右(可以认为服务处理时间差不多就是T ...

  7. spark bulkload 报错异常:Caused by: java.io.IOException: Added a key not lexically larger than previous

    ------------恢复内容开始------------ Caused by: java.io.IOException: Added a key not lexically larger than ...

  8. Linux下安装svn教程

    前言 最近买了新服务器,准备开始弄一些个人的开源项目.有了服务器当然是搞一波svn啦.方便自己的资料上传和下载.于是在此记录搭建svn的方式,方便以后直接使用. 安装 使用yum源进行安装,十分的方便 ...

  9. SpringBoot配置文件(2)

    六.配置文件加载 SpringBoot 启动会扫描以下位置的application.properties或者application.yml文件作为SpringBoot的默认配置文件 file:./co ...

  10. 【JS学习】var let const声明变量的异同点

    [JS学习]var let const声明变量的异同点 前言: 本博客系列为学习后盾人js教程过程中的记录与产出,如果对你有帮助,欢迎关注,点赞,分享.不足之处也欢迎指正,作者会积极思考与改正. 总述 ...