[bzoj4777]Switch Grass
结论:最短路径一定是单独的一条边且在最小生成树上,可以用反证法证明。
那么求出最小生成树,对于每一个点建立一棵权值线段树,再对每一个权值线段树上的叶子节点开一个multiset,维护所有儿子中该种颜色的权值(普通节点仍维护区间最小值),答案也需要用multiset维护。
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 200005
4 #define mid (l+r>>1)
5 multiset<int>ans,s[N*3];
6 struct ji{
7 int nex,to,len;
8 }edge[N<<1];
9 struct ji2{
10 int x,y,z;
11 bool operator < (const ji2 &k)const{
12 return z<k.z;
13 }
14 }a[N];
15 int E,V,V2,n,m,q,head[N],f[N],r[N],sh[N],id[N*29],ls[N*29],rs[N*29],tr[N*29],c[N];
16 int find(int k){
17 if (k==f[k])return k;
18 return f[k]=find(f[k]);
19 }
20 void add(int x,int y,int z){
21 edge[E].nex=head[x];
22 edge[E].to=y;
23 edge[E].len=z;
24 head[x]=E++;
25 }
26 void update(int &k,int l,int r,int x,int y,int p,int c){
27 if ((!k)&&(y==-1))return;
28 if (!k)k=++V;
29 if (l==r){
30 if (!id[k])id[k]=++V2;
31 if (y!=-1)
32 if (p==1)s[id[k]].insert(y);
33 else s[id[k]].erase(s[id[k]].find(y));
34 if ((c==x)||(!s[id[k]].size()))tr[k]=0x3f3f3f3f;
35 else tr[k]=(*s[id[k]].begin());
36 return;
37 }
38 if (x<=mid)update(ls[k],l,mid,x,y,p,c);
39 else update(rs[k],mid+1,r,x,y,p,c);
40 tr[k]=min(tr[ls[k]],tr[rs[k]]);
41 }
42 void dfs(int k,int fa){
43 f[k]=fa;
44 for(int i=head[k];i!=-1;i=edge[i].nex)
45 if (edge[i].to!=fa){
46 dfs(edge[i].to,k);
47 sh[edge[i].to]=edge[i].len;
48 update(r[k],1,n,c[edge[i].to],edge[i].len,1,c[k]);
49 }
50 ans.insert(tr[r[k]]);
51 }
52 int main(){
53 scanf("%d%d%*d%d",&n,&m,&q);
54 memset(head,-1,sizeof(head));
55 tr[0]=0x3f3f3f3f;
56 for(int i=1;i<=m;i++)scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
57 sort(a+1,a+m+1);
58 for(int i=1;i<=n;i++)f[i]=i;
59 for(int i=1;i<=m;i++)
60 if (find(a[i].x)!=find(a[i].y)){
61 f[find(a[i].x)]=find(a[i].y);
62 add(a[i].x,a[i].y,a[i].z);
63 add(a[i].y,a[i].x,a[i].z);
64 }
65 for(int i=1;i<=n;i++)scanf("%d",&c[i]);
66 dfs(1,0);
67 int x,y;
68 for(int i=1;i<=q;i++){
69 scanf("%d%d",&x,&y);
70 if (f[x]){
71 ans.erase(ans.find(tr[r[f[x]]]));
72 update(r[f[x]],1,n,c[x],sh[x],-1,c[f[x]]);
73 update(r[f[x]],1,n,y,sh[x],1,c[f[x]]);
74 ans.insert(tr[r[f[x]]]);
75 }
76 ans.erase(ans.find(tr[r[x]]));
77 update(r[x],1,n,c[x],-1,1,y);
78 c[x]=y;
79 update(r[x],1,n,c[x],-1,1,c[x]);
80 ans.insert(tr[r[x]]);
81 printf("%d\n",(*ans.begin()));
82 }
83 }
[bzoj4777]Switch Grass的更多相关文章
- BZOJ 4777: [Usaco2017 Open]Switch Grass
4777: [Usaco2017 Open]Switch Grass Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 46 Solved: 10[Su ...
- BZOJ4777 [Usaco2017 Open]Switch Grass[最小生成树+权值线段树套平衡树]
标题解法是吓人的. 图上修改询问,不好用数据结构操作.尝试转化为树来维护.发现(不要问怎么发现的)最小生成树在这里比较行得通,因为最近异色点对一定是相邻的(很好想),所以只要看最短的一条两端连着异色点 ...
- Luogu 3665 [USACO17OPEN]Switch Grass 切换牧草
BZOJ 4777 被权限了. 这道题的做法看上去不难,但是感觉自己yy不出来. 首先是两个结论: 1.答案一定是连接着两个异色点的一条边. 2.答案一定在最小生成树上. 感觉看到了之后都比较显然,自 ...
- BZOJ 4777 Usaco2017 Open Switch Grass Kruskal+替罪羊树+权值线段树
这道题首先可以看出答案一定是一条边,而且答案一定在最小生成树上,那么我们就可以在这个最小生成树上维护他与异色儿子的边最小值,所以我们就可以已通过Kruskal和一棵平衡树来解决,时间复杂度是O(n*l ...
- P3665 [USACO17OPEN]Switch Grass
题目描述 N个点M条边的无向图,每个点有一个初始颜色,每次改变一个点的颜色,求改变后整张图上颜色不同的点之间的距离最小值. 思路 考虑整张图的距离最小值一定是一条边,而不可能是一条路径,那么显然这条边 ...
- USACO 2017 US Open
只会做T1,FallDream T2 n^2暴力AC,太强啦. T1.Modern Art 题目大意:有一个n*n的矩阵,一开始都是0,你有n^2种颜色,编号1到n^2,每次可以选出一种颜色涂满一个子 ...
- 游戏编程算法与技巧 Game Programming Algorithms and Techniques (Sanjay Madhav 著)
http://gamealgorithms.net 第1章 游戏编程概述 (已看) 第2章 2D图形 (已看) 第3章 游戏中的线性代数 (已看) 第4章 3D图形 (已看) 第5章 游戏输入 (已看 ...
- Partition:分区切换(Switch)
在SQL Server中,对超级大表做数据归档,使用select和delete命令是十分耗费CPU时间和Disk空间的,SQL Server必须记录相应数量的事务日志,而使用switch操作归档分区表 ...
- java中if和switch哪个效率快
首先要看一个问题,if 语句适用范围比较广,只要是 boolean 表达式都可以用 if 判断:而 switch 只能对基本类型进行数值比较.两者的可比性就仅限在两个基本类型比较的范围内.说到基本类型 ...
随机推荐
- caffe.cpp解析
来自链接:http://blog.csdn.net/u014114990/article/details/47747025 主要讲解:GetBrewFunction()函数定义如下,其返回BrewFu ...
- Python | JSON 数据解析(Json & JsonPath)
一.什么是JSON? JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMAScript (欧洲计算机协会制定的js规范)的一 ...
- 未来云原生 | CIF 论坛精彩看点
当下云原生技术正在飞速发展,那么如何准确理解「云原生」?在发展不够成熟,行业认知差异大的情况下,不论是云原生计算基金会(CNCF),还是行业的任何大咖,都不能给出精确的.便于理解的定义.我们要理解的逻 ...
- C#开发BIMFACE系列53 WinForm程序中使用CefSharp加载模型图纸1 简单应用
BIMFACE二次开发系列目录 [已更新最新开发文章,点击查看详细] 在我的博客<C#开发BIMFACE系列52 CS客户端集成BIMFACE应用的技术方案>中介绍了多种集成BIM ...
- 初次认识指针:C语言*p、p以及&p的区别,*p和**p的区别?
https://blog.csdn.net/weixin_43115440/article/details/93475460 先要理解地址和数据,你可以想象有很多盒子,每个盒子有对应的号码,那个号码叫 ...
- 初始HTML04
HTML 列表标签 无序列表 默认用实心圆点标识列表项 1 <ul> 2 <li>list item 列表项</li> 3 <li>list item ...
- 打造专属测试平台4-使用Docker部署Django项目
编写完项目代码后,为了稳定的运行,需要将其部署至服务器.这里我选择了Docker去部署Django后端代码. 首先来看看Runoob对Docker的介绍: Docker 是一个开源的应用容器引擎,基于 ...
- SpringCloud 2020.0.4 系列之Eureka
1. 概述 老话说的好:遇见困难,首先要做的是积极的想解决办法,而不是先去泄气.抱怨或生气. 言归正传,微服务是当今非常流行的一种架构方式,其中 SpringCloud 是我们常用的一种微服务框架. ...
- 第三次Scrum Metting
日期:2021年4月27日会议主要内容概述:确定后端和前端接口,前端讨论画图页面,解决两处画图问题 一.进度情况# 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 徐宇龙 后端 ...
- [对对子队]会议记录5.27(Scrum Meeting12)
今天已完成的工作 朱俊豪 工作内容:寻找电池模型和BGM,修改关卡选择场景 相关issue:优化初步导出版本 相关签入:perf:地图界面优化 feat:更新系列资源(星星,大电池) 何瑞 ...