Jzoj3625 旅行(travel)
非常好的树剖模板题了,直接C颗线段树上去就好了,动态开点一次写对~
#pragma GCC opitmize("O3")
#pragma G++ opitmize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 100010
#define mid (l+r>>1)
using namespace std;
struct edge{ int v,nt; } G[200010];
struct nod{ int l,r,s,m; } s[3000010];
int h[N],sz[N],top[N],son[N],f[N],d[N];
int n,m,cnt=1,tot=0,clk=0,w[N],l[N],c[N],rt[N];
inline void gmax(int& x,int y){ x<y?x=y:0; }
inline void ps(nod& x){x.s=s[x.l].s+s[x.r].s;x.m=max(s[x.l].m,s[x.r].m);
}
inline void adj(int x,int y){ G[++cnt]=(edge){y,h[x]}; h[x]=cnt;G[++cnt]=(edge){x,h[y]}; h[y]=cnt;
}
void dfs(int x,int p){d[x]=d[p]+1; sz[x]=1; f[x]=p;for(int v,i=h[x];i;i=G[i].nt)if(!d[v=G[i].v]){dfs(v,x); sz[x]+=sz[v];if(sz[v]>sz[son[x]]) son[x]=v;}
}
void dgs(int x,int p){top[x]=p; l[x]=++clk;if(son[x]) dgs(son[x],p);for(int v,i=h[x];i;i=G[i].nt)if(!l[v=G[i].v]) dgs(v,v);
}
void insert(int l,int r,int& x,int p,int k){if(!x) x=++tot;if(l==r) { s[x].s=s[x].m=k; return; }if(p<=mid) insert(l,mid,s[x].l,p,k);else insert(mid+1,r,s[x].r,p,k);ps(s[x]);
}
void remove(int l,int r,int& x,int p){if(l==r){ x=0; return; }if(p<=mid) remove(l,mid,s[x].l,p);else remove(mid+1,r,s[x].r,p);if(s[x].l || s[x].r) ps(s[x]); else x=0;
}
void modify(int l,int r,int x,int p,int k){if(l==r){ s[x].s=s[x].m=k; return; }if(p<=mid) modify(l,mid,s[x].l,p,k);else modify(mid+1,r,s[x].r,p,k);ps(s[x]);
}
int queryS(int l,int r,int x,int L,int R){if(!x) return 0;if(L<=l && r<=R) return s[x].s;int ans=0;if(L<=mid) ans+=queryS(l,mid,s[x].l,L,R);if(mid<R) ans+=queryS(mid+1,r,s[x].r,L,R);return ans;
}
int gSum(int x,int y){int ans=0,C=c[x];for(;top[x]!=top[y];y=f[top[y]]){if(d[top[x]]>d[top[y]]) swap(x,y);ans+=queryS(1,n,rt[C],l[top[y]],l[y]);}if(d[x]>d[y]) swap(x,y);return ans+queryS(1,n,rt[C],l[x],l[y]);
}
int queryM(int l,int r,int x,int L,int R){if(!x) return 0;if(L<=l && r<=R) return s[x].m;int ans=0;if(L<=mid) gmax(ans,queryM(l,mid,s[x].l,L,R));if(mid<R) gmax(ans,queryM(mid+1,r,s[x].r,L,R));return ans;
}
int gMax(int x,int y){int ans=0,C=c[x];for(;top[x]!=top[y];y=f[top[y]]){if(d[top[x]]>d[top[y]]) swap(x,y);gmax(ans,queryM(1,n,rt[C],l[top[y]],l[y]));}if(d[x]>d[y]) swap(x,y);return max(ans,queryM(1,n,rt[C],l[x],l[y]));
}
int main(){freopen("travel.in","r",stdin);freopen("travel.out","w",stdout); scanf("%d%d",&n,&m);for(int i=1;i<=n;++i) scanf("%d%d",w+i,c+i);for(int x,y,i=1;i<n;++i) scanf("%d%d",&x,&y),adj(x,y); dfs(1,0); dgs(1,1); char o[3];for(int i=1;i<=n;++i) insert(1,n,rt[c[i]],l[i],w[i]);for(int x,y;m--;){scanf("%s%d%d",o,&x,&y);if(*o=='C'){if(o[1]=='C'){remove(1,n,rt[c[x]],l[x]);insert(1,n,rt[y],l[x],w[x]);c[x]=y;} else {modify(1,n,rt[c[x]],l[x],y);w[x]=y;}} else {if(o[1]=='S') printf("%d\n",gSum(x,y));else printf("%d\n",gMax(x,y));}}
}
转载于:https://www.cnblogs.com/Extended-Ash/p/9477168.html
Jzoj3625 旅行(travel)相关推荐
- 开车旅行 travel
题目描述 JY J Y JY是一个爱旅游的探险家,也是一名强迫症患者.现在 JY J Y JY想要在 C C C国进行一次长途旅行,C国拥有n个城市(编号为0,1,2...,n−1" rol ...
- 旅行(travel)
时间限制: 5 Sec 内存限制: 512 MB 题目描述 小R开车去C国旅行.C国所有n座城市构成一棵树,且树上的每条边的长度L_i满足1≤L_i≤2.小R打算白天开车,晚上到达一个城市后在该城市休 ...
- 哈里王子启动可持续旅行倡议 携程作为创始成员入选
9月3日,荷兰阿姆斯特丹,携程旅行网作为全球旅游行业代表,受邀加入英国萨塞克斯公爵哈里王子发起的全球可持续旅行倡议:Travalyst.该倡议的名称取自英文中的旅行(Travel)与催化剂(Catal ...
- 【英语:语法基础】C6.日常对话-旅行专题
旅行专题 1.交通出行类 2.旅行装备类 3.航空旅行 `Travel by Air` `Flight` 航班 办理登机 行李托运 中转 行李超重 选座 拿登机牌&告知登机口 航班延误 航班取 ...
- Test on 11/14/2016
@kaike 第一题太简单我不想说什么 来说第二题. 1.小x的旅行 (travel.pas/c/cpp) [问题描述] 小x大学毕业后,进入了某个公司做了高层管理,他每年的任务就是检查这个公司在 ...
- Java编程基础10——面向对象_多态抽象类接口
1.多态的概述及其成员访问特点代码体现 A:多态(polymorphic)概述 事物存在的多种形态 B:多态前提- 1.要有继承关系 2.要有方法重写 3.要有父类引用指向子类对象. C:多态中的成员 ...
- 自学成才翁_仅因为您是自学成才,并不意味着您必须独自学习。
自学成才翁 by Piotr Bakker 皮特·巴克(Piotr Bakker) 仅因为您是自学成才,并不意味着您必须独自学习. (Just because you're self-taught d ...
- 新概念英语(第一册)复习(原文及全文翻译)——Lesson 111 - Lesson 130
Lesson 111 The most expensive model [课文] MR.FRITH:I like this television very much. How much does it ...
- 环境资源与相关词汇中英文对照
大气 ATMOSPHERE 大气组成 Atmospheric composition 空气质量 Air quality 大气化学 Atmospheric chemistry 大气成分 Atmosphe ...
最新文章
- 设计model层的理念和思路
- android 之ExpandableListView详解
- leetcode 318. Maximum Product of Word Lengths | 318. 最大单词长度乘积
- bootstrap.yml与application.properties区别?
- Java中的LinkedHashMap
- 前端学习(2818):小程序学习之新建页面
- ASP.NET MVC源码现在可以下载了(翻译)
- [转载] python之flask框架
- laravel连接mysql8_php – 如何使用laravel运行MySql 8?
- 板绘新手sai入门基础教程,非常详细全面!
- 一.用matlab生成想要的分布数据——均匀分布
- M/M/m排队模型 (单队列多服务台并联服务模型)数学建模: 基于生灭过程的理论计算和基于事件推进的Matlab模拟仿真思路
- Android HttpClient 与JSON解析
- Redis 基本命令和五大基础数据类型
- MATLAB理论力学应用
- pta中c语言编程问题答案,pta题库答案_浙大远程教育2015秋 程序设计基础C 求PTA实验代码题库liujiahai-C答案_淘题吧...
- 2023最新苹果CMS10魔加主题1.1.6去授权版+支持全部版本
- oracle如何新建用户
- mysql semi-sync(半同步复制)
- 基于屏幕空间渲染的液体模拟
热门文章
- 718保时捷spyder_我要买保时捷718 Spyder的原因:新手也可以玩手动
- 京东方网络推广外包将为三星提供OLED 屏幕可造成韩国显示产业动荡
- java jsp js xml_jsp实现将信息放入xml中的方法
- java 编写命令行工具_编写命令行工具
- mysql error manager,MYSQL Starting MySQL. ERROR! Manager of pid-file quit without updating file
- python matplotlib pyplot title_Matplotlib pyplot.title(字符串)返回
- 服务器跑python程序_远程编写+调试服务器上的Python程序
- 安卓ttf格式的字体包_苹果官网御用字体
- 开发日记-20190802 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 18
- github bilibili