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 }
View Code

 

转载于:https://www.cnblogs.com/gryzy/p/10479157.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264651.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

System variables, logging and the Execute SQL Task...(zz)

原文地址http://sqljunkies.com/WebLog/knight_reign/archive/2005/02/27/8187.aspxHeres something useful you can do with system variables and the SQL Task. Logging in SSIS is more flexible and there are more options for logging destinations and formats then wi…

jenkins maven没有使用全局设置文件地址_Jenkins手把手图文教程「基于Jenkins 2.164.1」...

一、下载前往https://jenkins.io/download/ &#xff0c;按需下载。如用于生产&#xff0c;建议下载Long-term Support (LTS) 版本&#xff0c;这样能够获得相对长期的维护&#xff1b;如想体验最新的功能&#xff0c;可尝试 Weekly 版本。可以直接下载特定系统专属的版本&…

[原创]flex 3 + .net开发flash Remoting一 --- 开发环境

flex 3 .net开发flash Remoting一 --- 开发环境 本篇文章将介绍flash Remoting 开发的必备的运行环境和相关配置过程&#xff1a;一。开发必备环境。 1. flex 3&#xff0c;请从Adobe官方网站下载或其它地方找D版(目前为止D版还没有出)。 2. Visual Studio 2005&#…

mysql表恢复报错binlog_mysqlbinlog 恢复报错ERROR at line 24826643: Unknown command '\'汗血宝马...

有两个binlog日志文件mysql-bin.000001,mysql-bin.000002&#xff0c;大小都是1G左右。现在要在另外一个库上做完全恢复。想到通常的恢复方法&#xff1a;mysqlbinlog /usr/local/var/mysql1/mysql-bin.000001 | mysql -uroot -S /usr/local/var/mysql2/mysql2.sockmysqlbinlog…

linux分盘笔记

一磁盘分区 首先磁盘分区&#xff1a;计算机中存放信息的主要的存储设备就是硬盘&#xff0c;但是硬盘不能直接使用&#xff0c;必须对硬盘进行分割&#xff0c;分割成的一块一块的硬盘区域就是磁盘分区。在传统的磁盘管理中&#xff0c;将一个硬盘分为两大类分区&#xff1a;主…

python 析构函数_常用的python类的魔术方法

对于很少使用python编写大型代码的朋友可能会忘记python还是一种面向对象的语言。在其他面向对象的语言中有构造函数、析构函数等等在生命周期不同时机自动调用的函数&#xff0c;python当然也是有的。除此之外&#xff0c;python类还有很多神奇的编写方式让对象的表现更加丰富…

微软桌面虚拟化vdi 安装测试体验

最近同事在讨论桌面虚拟化&#xff0c;说目前很多企业都准备上桌面虚拟化&#xff0c;结合众多的解决方案&#xff0c;觉得微软的桌面虚拟化方案不错&#xff0c;相对与citrix的xendesktop,vmware view 有一定的价格优势&#xff0c;心里想&#xff0c;微软是大公司&#xff0c…

mysql 8.0.22_最新版MySQL 8.0.22下载安装超详细教程(Windows 64位)

前言前几天下载安装了最新版的MySQL 8.0.22&#xff0c;遇到了不少问题&#xff0c;参考了一些方法&#xff0c;最终得以解决。今天将自己的安装过程记录下来&#xff0c;希望对各位有所帮助。一、MySQL 8.0.22官网下载点击进入MySQL官网&#xff1a;https://www.mysql.com/① …

android获取网络图片

2019独角兽企业重金招聘Python工程师标准>>> 资源描述: 关于android获取网络图片主要是把网络图片的数据流读入到内存中然后用1.Bitmap bitMap BitmapFactory.decodeByteArray(data, 0, length); 方法来将图片流传化为bitmap类型 这样才能用到1.imageView.setImage…

WSS Alert(邮件提醒) 定制

项目需要&#xff0c;研究了一下WSS的Alert定制。 定制有两种方法: (方法1)修改模板文件 默认模板是12\TEMPLATE\XML\alerttemplates.xml,将这个模板复制一份修改,然后用stsadm命令添加模板: STSADM -o updatealerttemplates -url <http://urlname> -filename <your w…

windows log日志分割_如何将日志记录到 Windows事件日志 中

每当出现一些未捕获异常时&#xff0c;操作系统都会将异常信息写入到 Windows 事件日志 中&#xff0c;可以通过 Windows 事件查看器 查看&#xff0c;如下图&#xff1a; 这篇文章将会讨论如何使用编程的方式将日志记录到 Windows 事件日志 中。 安装 EventLog 要想在 .NET Co…

偷窃转基因玉米种子引发中美打农业官司

偷窃转基因玉米种子引发中美打农业官司 请看下面相片&#xff1a; 这张相片是孩子们与转基因玉米在一起的景象。转基因玉米颗粒饱满&#xff0c;孩子们的小手差点儿抓不住&#xff08;由于玉米棒子非常粗&#xff09;。广大农民喜欢这样的抗虫、耐药并且产量高的农作物&#xf…

mysql中视图的概念_MySql中的视图的概念及应用

视图的基本概念视图是从一个或几个基本表(或者视图)导出的表。它与基本表不同&#xff0c;是一个虚表。数据库只存放视图的定义&#xff0c;而不存放视图对应的数据&#xff0c;这些数据仍存放在原来的基本表中。所以基本表中的数据发生变化&#xff0c;从视图中查询出的数据也…

JQuery常用的代码片段

2019独角兽企业重金招聘Python工程师标准>>> JQuery常用的代码片段 JQuery在当前众多网站开发中都有用到。他简易的操作以及对各个浏览器的兼容性&#xff0c;被广大的开发者一致看好。 下面是一些常用实用的 JQuery 代码片段。看看有没有需要收藏的吧&#xff1a; …

linux环境配置

在安装linux之前首先要明白linux系统的功能特性&#xff0c;linux是多少位 的&#xff0c;对要使用的工具要有大体的了解&#xff0c;那样就不至于在之后的安装中耽误太多时间&#xff0c;比如安装的系统是32位的就要安装与之对应的工具。我们大体上了解一下linux能支持的又比较…

tomcat 启动速度慢背后的真相

1. tomcat 启动慢 在线上环境中&#xff0c;我们经常会遇到类似的问题&#xff0c;就是tomcat 启动比较慢&#xff0c;查看内存和cpu,io都是正常的&#xff0c;但是启动很慢&#xff0c;有的时候长达几分钟&#xff0c;这到底是什么原因导致的。 1.1 tomcat 获取随机值阻塞 ​ …

[导入]相片: 23853741.jpg

文章来源:http://img.blog.163.com/photo/NdAK9XEb2a-KOR7zpDWpAA/588564176302178421.jpg转载于:https://www.cnblogs.com/baiyirui/archive/2008/04/27/1173117.html

手摇泵PHP一32_节能手摇泵的制作方法

本实用新型属于液压动力装置技术领域&#xff0c;特指一种节能手摇泵。背景技术&#xff1a;如图1-2所示&#xff0c;目前&#xff0c;手摇泵采用分体式结构&#xff0c;比如&#xff0c;左横向出油通道和右横向出油通道是装配在泵体上的&#xff0c;由于零件较多&#xff0c;所…

掌握 ASP.NET 之路:自定义实体类简介 来源 :msdn

ADODB.RecordSet 和常常被遗忘的 MoveNext 的时代已经过去&#xff0c;取而代之的是 Microsoft ADO.NET 强大而又灵活的功能。我们的新武器就是 System.Data 名称空间&#xff0c;它的特点是具有速度极快的 DataReader 和功能丰富的 DataSet&#xff0c;而且打包在一个面向对象…

HTML入门学习 -- HTML基础知识

打算按照 HTML -> CSS –> JavaScript –> jQuery –> HTML5 –> WebGL 的顺序&#xff0c;简略学习一下Web前端技术。 因为不是搞Web的&#xff0c;只需要大概过一下有个印象就行&#xff0c;每一项花费3天到一周时间走马观花的看看。 编辑器就选择Sublime Tex…