SDOI2014 旅行

传送门

省选前水一发

这题一开始看标签是主席树……后来……这题和主席树有啥关系……
可以想到对于每种宗教用树剖+线段树维护即可。然后因为空间不够要动态开点。然后改宗教,改评级的,把原来的点删了再插一个新点就可以了。查询最大值,和就直接线段树维护。
当树剖板子练习了。

#include<bits/stdc++.h>
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('\n')
#define pr pair<int,int>
#define mp make_pair
#define fi first
#define sc second
using namespace std;
typedef long long ll;
const int M = 100005;
const int N = 2000005;
const int INF = 0x3f3f3f3f;int read()
{int ans = 0,op = 1;char ch = getchar();while(ch < '0' || ch > '9') {if(ch == '-') op = -1;ch = getchar();}while(ch >='0' && ch <= '9') ans = ans * 10 + ch - '0',ch = getchar();return ans * op;
}int n,m,w[M],c[M],head[M],ecnt,dep[M],hson[M],top[M],idx,dfn[M],rk[M],fa[M];
int x,y,size[M],cnt,root[M],k,q;
char ch[5];struct tree
{int lc,rc,val,sum;
}t[M<<5];struct edge
{int next,to,from;
}e[M<<1];void add(int x,int y){e[++ecnt] = {head[x],y,x},head[x] = ecnt;}void dfs1(int x,int f)
{dep[x] = dep[f] + 1,size[x] = 1,fa[x] = f;for(int i = head[x];i;i = e[i].next){if(e[i].to == f) continue;dfs1(e[i].to,x);size[x] += size[e[i].to];if(size[e[i].to] > size[hson[x]]) hson[x] = e[i].to;}
}void dfs2(int x,int t)
{dfn[x] = ++idx,rk[idx] = x,top[x] = t;if(hson[x]) dfs2(hson[x],t);for(int i = head[x];i;i = e[i].next){if(e[i].to == hson[x] || e[i].to == fa[x]) continue;dfs2(e[i].to,e[i].to);}
}void pushup(int p)
{t[p].val = max(t[t[p].lc].val,t[t[p].rc].val);t[p].sum = t[t[p].lc].sum + t[t[p].rc].sum;
}
void pushdown(int p){t[p].sum = t[p].val = 0;}void insert(int &p,int l,int r,int pos,int val)
{if(!p) p = ++cnt;if(l == r) {t[p].sum = t[p].val = val;return;}int mid = (l+r) >> 1;if(pos <= mid) insert(t[p].lc,l,mid,pos,val);else insert(t[p].rc,mid+1,r,pos,val);pushup(p);
}void del(int &p,int l,int r,int pos)
{if(!p) return;if(l == r) {pushdown(p);return;}int mid = (l+r) >> 1;if(pos <= mid) del(t[p].lc,l,mid,pos);else del(t[p].rc,mid+1,r,pos);pushup(p);
}int query(int &p,int l,int r,int kl,int kr)
{if(!p) return 0;if(l == kl && r == kr) return t[p].sum;int mid = (l+r) >> 1;if(kr <= mid) return query(t[p].lc,l,mid,kl,kr);else if(kl > mid) return query(t[p].rc,mid+1,r,kl,kr);else return query(t[p].lc,l,mid,kl,mid) + query(t[p].rc,mid+1,r,mid+1,kr);
}int ask(int &p,int l,int r,int kl,int kr)
{if(!p) return 0;if(l == kl && r == kr) return t[p].val;int mid = (l+r) >> 1;if(kr <= mid) return ask(t[p].lc,l,mid,kl,kr);else if(kl > mid) return ask(t[p].rc,mid+1,r,kl,kr);else return max(ask(t[p].lc,l,mid,kl,mid),ask(t[p].rc,mid+1,r,mid+1,kr));
}int srange(int x,int y)
{int cur = 0,k = c[x];while(top[x] != top[y]){if(dep[top[x]] < dep[top[y]]) swap(x,y);cur += query(root[k],1,n,dfn[top[x]],dfn[x]);x = fa[top[x]];}if(dep[x] > dep[y]) swap(x,y);cur += query(root[k],1,n,dfn[x],dfn[y]);return cur;
}int mrange(int x,int y)
{int cur = 0,k = c[x];while(top[x] != top[y]){if(dep[top[x]] < dep[top[y]]) swap(x,y);cur = max(cur,ask(root[k],1,n,dfn[top[x]],dfn[x]));x = fa[top[x]];}if(dep[x] > dep[y]) swap(x,y);cur = max(cur,ask(root[k],1,n,dfn[x],dfn[y]));return cur;
}int main()
{n = read(),q = read();rep(i,1,n) w[i] = read(),c[i] = read();rep(i,1,n-1) x = read(),y = read(),add(x,y),add(y,x);dfs1(1,0),dfs2(1,1);rep(i,1,n) insert(root[c[i]],1,n,dfn[i],w[i]);while(q--){scanf("%s",ch);if(ch[1] == 'C'){x = read(),k = read();del(root[c[x]],1,n,dfn[x]),c[x] = k;insert(root[c[x]],1,n,dfn[x],w[x]);}if(ch[1] == 'W'){x = read(),k = read();del(root[c[x]],1,n,dfn[x]),w[x] = k;insert(root[c[x]],1,n,dfn[x],w[x]);}if(ch[1] == 'S'){x = read(),y = read();printf("%d\n",srange(x,y));}if(ch[1] == 'M'){x = read(),y = read();printf("%d\n",mrange(x,y));}}return 0;
}

转载于:https://www.cnblogs.com/captain1/p/10659250.html

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

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

相关文章

API函数的调用(包含一个大小写的问题)

遇到问题&#xff1a; 今天做的一个程序要调用AnimateWindow()函数来实现窗口的动画效果&#xff0c;参考书上在类的成员函数中直接调用该函数&#xff0c;没有做任何处理。然而实验时发现编译通不过。 解决过程&#xff1a; 查看MSDN后,发现AnimateWindow()函数说明中…

第一个openGL程序

一、工具的安装 因为要写C程序&#xff0c;为了便捷&#xff0c;这里我安装的Visual Studio&#xff1b; 免费使用90天&#xff01;安装好了之后&#xff0c;我们要为我们的开发安装相应的工具集&#xff1b; 因为我是要在windows上跑的&#xff0c;所以选择如下两个包&#xf…

[转]leo谈“80后”程序员为什么找不到工作?(1)

(应it168约稿写了关于“80后”程序员求职难的文章&#xff0c;我将分三次放在博客上&#xff0c;之后会引用网上的部分批评文章。) 80后的定义应该是&#xff1a;22至27岁之间、受过高等教育、刚刚毕业走向社会或者拥有几年工作经验年轻一代。不可否认&#xff0c;80后已成为职…

c语言斜杠表示除法,[转载]C语言中反斜杠的使用

问题1&#xff1a;#define f(z)(z<2)?(((2-z)*(2-z))*((2-z)*(2-z)))*(((2-z)*(2-z))*((2-z)*(2-z)))/560:0;上面这个*什么意思问题2&#xff1a;一语句printf("a%.2fn,b%.2fn,c%.2fn,d%.2fn,e%.2fn",a,b,c,d,e);不提示错误。换成printf("a%.2fn,b%.2fn,c%.…

SJJG习题一

动态 链 表 的 建 立 1&#xff0e; 修改以下程序&#xff0c;尽可能减少临时空间的占用。即&#xff1a;先判断输入数据的合法性&#xff0c;再为其分配空间。 2&#xff0e; 修改以下程序&#xff0c;把尾插法建立链表改为头插法建立链表…

hdu 2544 最短路

Problem Description在每年的校赛里&#xff0c;所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候&#xff0c;却是非常累的&#xff01;所以现在他们想要寻找最短的从商店到赛场的路线&#xff0c;你可以帮助他们…

华水c语言课程设计,【图片】发几个C语言课程设计源代码(恭喜自己当上技术小吧主)【东华理工大学吧】_百度贴吧...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼/*************************************************查询函数**********************************************/void search(){int flag,j,x;char w[20];FILE *fp;char v[20];printf("(1)按作者\n");printf("(2)按…

DataGridView 写入到EXCEL

usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Windows.Forms;usingMicrosoft.Office.Interop.Excel;usingSystem.Xml;usingSystem.Xml.Serialization;usingSystem.IO;namespacetxt批处理{ class 保存 { internal static bool 写入E…

Git和Github的学习

来源&#xff1a; 秦时明月NightTiger Git和Github的学习 作者声明&#xff1a;本博客中所写的文章&#xff0c;都是博主自学过程的笔记&#xff0c;参考了很多的学习资料&#xff0c;学习资料和笔记会注明出处&#xff0c;所有的内容都以交流学习为主。有不正确的地方&#xf…

在asp.net中做视频转换,将各种视频文件转换成.flv格式

首先&#xff0c;我们部署一下文件夹.在工程的目录下新建几个文件夹如下图&#xff1a;UpFiles文件夹是要保存你上传的文件&#xff0c;PlayFiles文件夹是用于你转换后保存的文件&#xff08;用于网上播放&#xff09; ImgFile文件夹是保存截取视频文件的图片&#xff0c;然后那…

Android实现支付宝AR功能,Android接入支付宝实现支付功能实例

我本来是想直接讲Android支付这一块的&#xff0c;包括支付宝&#xff0c;微信&#xff0c;其他第三方整合支付等&#xff0c;但是微信开放平台他对我的账号做了限制&#xff0c;所有我今天就先把重心放在支付宝的支付上&#xff0c;也算是写得尽可能详细些吧&#xff0c;毕竟是…

httpd 处理模型

prefork 一个请求用一个进程响应。预先生成一批进程&#xff0c;定时清理一批&#xff0c;同时生成一批。 worker 一个请求用一个线程响应&#xff08;启动多个进程&#xff0c;多个进程生成多个线程&#xff09; event 一个进程&#xff0c;处理多个请求&#xff0c;采用事件通…

工作373-前端 import与export区别

import与export区别 1.当用export default people导出时&#xff0c;就用 import people 导入&#xff08;不带大括号&#xff09; 2.一个文件里&#xff0c;有且只能有一个export default。但可以有多个export。 3.当用export name 时&#xff0c;就用import { name }导入&…

设计功能和界面测试用例

1.1 文本框、按钮等控件测试 1.1.1 文本框的测试 如何对文本框进行测试  a,输入正常的字母或数字。  b,输入已存在的文件的名称&#xff1b;  c,输入超长字符。例如在“名称”框中输入超过允许边界个数的字符&#xff0c;假设最多255个字符&#xff0c;尝试输入 256个字符&a…

android系统的发展态势,2020年安卓手机发展的7个趋势,只有延伸,并无革命性的变化...

在2019年&#xff0c;国内的几家手机厂家都是有得有失&#xff0c;虽然华为在国内大杀四方&#xff0c;但是海外市场遇到了一些麻烦&#xff0c;OPPO和VIVO也开始走性价比路线了&#xff0c;但是国内的市场还是被华为打压的厉害&#xff0c;不过海外发展还可以&#xff0c;至于…