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^),很多事,还能丰 ...
随机推荐
- IaaS、PaaS、SaaS、DaaS都是什么?现在怎么样了?终于有人讲明白了
导读:本文将详细科普云计算的概念.云服务的发展现状,并逐一介绍各种云服务模式(IaaS.PaaS.SaaS.DaaS),建议收藏! 作者:阿里云智能-全球技术服务部来源:大数据DT(ID:bigdat ...
- [LeetCode]690. Employee Importance员工重要信息
哈希表存id和员工数据结构 递归获取信息 public int getImportance(List<Employee> employees, int id) { Map<Integ ...
- three.js 显示中文字体 和 tween应用
今天郭先生说一下如何在three中显示中文字体,然后结合tween实现文字位置的动画.线案例请点击博客原文. 1. 生成中文字体 我们都使用过three.js的FontLoader加载typeface ...
- ORB-SLAM3 细读单目初始化过程(上)
作者:乔不思 来源:微信公众号|3D视觉工坊(系投稿) 3D视觉精品文章汇总:https://github.com/qxiaofan/awesome-3D-Vision-Papers/ 点击上方&qu ...
- SpringBoot2.+restful风格请求方式设置以及表单中日期格式设置
1).SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(@Bean.@Component)如果有就用用户配置的,如果没有,才自动配置:如果有些组件可以有多个(ViewR ...
- InheritableThreadlocal使用问题排查
背景 在做一个微服务系统的时候,我们的参数一般都是接在通过方法定义来进行传递的,类似这样 public void xxx(Param p, ...){ // do something } 然后这时有个 ...
- Payment Spring Boot 1.0.4.RELEASE 发布,最易用的微信支付 V3 实现
Payment Spring Boot 是微信支付V3的Java实现,仅仅依赖Spring内置的一些类库.配置简单方便,可以让开发者快速为Spring Boot应用接入微信支付. 欢迎ISSUE,欢迎 ...
- kubernets之ReplicaSet
一 介绍RS 1.1 RS与RC在功能上基本上是一摸一样的,因为两者的功能都是用来管控集群内部的pod,并且 两者都具备模版,副本数量以及标签选择器等三要素,区别点在于,RS拥有着更为强大的标 ...
- ctfhub技能树—文件上传—双写后缀
双写后缀绕过 用于只将文件后缀名,例如"php"字符串过滤的场合: 例如:上传时将Burpsuite截获的数据包中文件名[evil.php]改为[evil.pphphp],那么过滤 ...
- REUSE_ALV_FIELDCATALOG_MERGE函数
今天使用REUSE_ALV_FIELDCATALOG_MERGE函数,就是获取不到fieldcat, 搞了半天才发现,原来参数要全部大写才行!!小写字符就是获取不到,唉,悲哀...