[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 只能对基本类型进行数值比较.两者的可比性就仅限在两个基本类型比较的范围内.说到基本类型 ...
随机推荐
- VS运行时 /MD、/MDd 和 /MT、/MTd之间的区别
程序运行时出现问题,选择的是Release,win64位的模式,并且已经看到了宏定义NDEBUG,但是程序依然进入上面的部分 解决方案是将属性->C/C++->代码生成器->运行库里 ...
- 题解 「SDOI2017」硬币游戏
题目传送门 Description 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利. 大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬币实在是太单调了. 同学们觉得要加强 ...
- MC-BE基岩版服务器搭建与日常维护
有部分内容被csdn和谐,强烈建议移步我的个人博客以获得更好的排版和阅读体验: xzajyjs.cn. 目录 环境搭建 开始部署 日常维护 服务器的白名单机制 定时备份 服务器升级 服务器模组安装 搭 ...
- 2021-2022 20211420 《信息安全专业导论》安装Linux操作系统并学习Linux基础
作业信息 |作业属于|https://edu.cnblogs.com/campus/besti/2021-2022-1fois |作业要求|https://edu.cnblogs.com/campus ...
- Matlab/Modelsim图像联合仿真平台
FPGA图像仿真平台 1 引言 在使用modelsim进行图像算法的功能仿真时,无法得到图像的实时预览,因此直观性有所欠缺.因此可配合matlab使用,通过modelsim读出txt格式的图像,利用m ...
- DP接口中AUX
背景技术: DP接口(DisplayPort)是一种图像显示接口,它不仅可以支持全高清显示分辨率(1920×1080),还能支持4k分辨率(3840×2160),以及最新的8k分辨率(7680×432 ...
- 计算机网络传输层之TCP协议(tcp协议特点、tcp报文段首部格式、tcp连接建立---三次握手、tcp连接释放---四次握手)
文章转自:https://blog.csdn.net/weixin_43914604/article/details/105516090 学习课程:<2019王道考研计算机网络> 学习目的 ...
- netty系列之:netty实现http2中的流控制
目录 简介 http2中的流控制 netty对http2流控制的封装 Http2FlowController Http2LocalFlowController Http2RemoteFlowContr ...
- 『学了就忘』Linux基础 — 6、VMware虚拟机安装Linux系统(超详细)
目录 1.打开VMware虚拟机软件 2.选择Linux系统的ISO安装镜像 3.开启虚拟机安装系统 (1)进入Linux系统安装界面 (2)硬件检测 (3)检测光盘 (4)欢迎界面 (5)选择语言 ...
- 《手把手教你》系列技巧篇(三十六)-java+ selenium自动化测试-单选和多选按钮操作-番外篇(详解教程)
1.简介 前边几篇文章是宏哥自己在本地弄了一个单选和多选的demo,然后又找了网上相关联的例子给小伙伴或童鞋们演示了一下如何自动化测试,这一篇宏哥在网上找了一个问卷调查,给小伙伴或童鞋们来演示一下.上 ...