[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 只能对基本类型进行数值比较.两者的可比性就仅限在两个基本类型比较的范围内.说到基本类型 ...
随机推荐
- 《手把手教你》系列技巧篇(三十)-java+ selenium自动化测试- Actions的相关操作下篇(详解教程)
1.简介 本文主要介绍两个在测试过程中可能会用到的功能:Actions类中的拖拽操作和Actions类中的划取字段操作.例如:需要在一堆log字符中随机划取一段文字,然后右键选择摘取功能. 2.拖拽操 ...
- 熊猫分布密度制图(ArcPy实现)
一.背景 大熊猫是我国国家级珍惜保护动物,熊猫的生存必须满足一定槽域(独占的猎食与活动范围)条件.因此,科学准确的分析熊猫的分布情况,对合理制定保护措施和评价保护成效具有重要意义. 二.目的 通过练习 ...
- CF992E Nastya and King-Shamans(线段树二分+思维)
这是一道卡常好题 从160s卡到36s qwq 由于题目设计到原数组的单点修改,那么就对应着前缀和数组上的区间加. 很显然能想到用线段树来维护这么个东西. 那么该如果求题目要求的位置呢 我们来看这个题 ...
- qsort()函数的使用
函数声明 void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*)) 参数 ...
- HCNP Routing&Switching之BGP路由宣告
前文我们了解了BGP报文结构.类型以及邻居状态相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15422924.html:今天我们来聊一聊BGP路由宣告 ...
- 【原创】浅谈指针(五)const和指针
前言 过了几个月再次更新.最近时间也不多了,快要期中考试了,暂且先少写一点吧. 本文仅在博客园发布,如在其他平台发现均为盗取,请自觉支持正版. 练习题 我们先来看几道题目.如果这几道题都不会的话,就先 ...
- 【数据结构与算法Python版学习笔记】图——拓扑排序 Topological Sort
概念 很多问题都可转化为图, 利用图算法解决 例如早餐吃薄煎饼的过程 制作松饼的难点在于知道先做哪一步.从图7-18可知,可以首先加热平底锅或者混合原材料.我们借助拓扑排序这种图算法来确定制作松饼的步 ...
- Redis:学习笔记-04
Redis:学习笔记-04 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 10. Redis主从复制 1 ...
- [技术博客]Unity3d 动画控制
在制作游戏时,导入的箱子模型本身自带动画.然而,它的动画是一个从打开到关闭的完整过程,并且没有给出控制打开关闭的方法. 最直接的想法是对该动画进行拆分,再封装成不同的动画状态,但是不巧的是,这个动画被 ...
- matlab添加永久路径
addpath('D:\MATLAB6p5\toolbox\svm'); 临时添加路径,不能添加子目录 addpath(genpath('D:\MATLAB6p5\toolbox\svm'));临时添 ...