[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事件机制
本文同时发布于个人网站 https://ifuyao.com/blog/java-event/ 相信做 Java 开发的朋友,大多都是学习过或至少了解过 Java GUI 编程的,其中有大量的事件和控 ...
- UltraSoft - Alpha - Scrum Meeting 5
Date: Apr q9th, 2020. Scrum 情况汇报 进度情况 组员 负责 昨日进度 后两日任务 CookieLau PM 统筹个人进度,协助推进进度 辅助前后端连接工作 刘zh 前端 完 ...
- 配置 JAVA 环境 JDK + IDEA
配置JDK 搜索 ORACLE 官网,找到 JDK,下载 JDK8 版本 / JDK11 版本 选择合适的路径,我这里放在了 D 盘 配置下方系统环境变量,变量名为 JAVA_HOME,把刚刚安装的J ...
- Spring 5 中函数式web开发中的swagger文档
Spring 5 中一个非常重要的更新就是增加了响应式web开发WebFlux,并且推荐使用函数式风格(RouterFunction和 HandlerFunction)来开发WebFlux.对于之前主 ...
- lib库无法加载的情况分析
最近升级vs2017的时候遇到无法加载库的问题,在网上查找问题,网上给出可能有三种情况导致该问题:路径是否正确:库依赖是否齐全:库版本是否正确.最直接的方法就是用depends软件去查询,是否有模块有 ...
- python基础语法--字典的遍历
原文链接:https://blog.csdn.net/normang/article/details/55804231 (1)遍历key值 >>> a {'a': '1', 'b': ...
- 常用Java API: ArrayList(Vector) 和 LinkedList
摘要: 本文主要介绍ArrayList(Vector)和LinkedList的常用方法, 也就是动态数组和链表. ArrayList ArrayList 类可以实现可增长的对象数组. 构造方法 Arr ...
- 转载: VIVADO的增量综合流程
http://xilinx.eetrend.com/content/2019/100044286.html 从 Vivado 2019.1 版本开始,Vivado 综合引擎就已经可以支持增量流程了.这 ...
- 最接近的数 牛客网 程序员面试金典 C++ Python
最接近的数 牛客网 程序员面试金典 C++ Python 题目描述 有一个正整数,请找出其二进制表示中1的个数相同.且大小最接近的那两个数.(一个略大,一个略小) 给定正整数int x,请返回一个ve ...
- 痞子衡嵌入式:借助Serial Plot软件测量i.MXRT系列FlexSPI驱动Flash页编程执行时间
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT系列FlexSPI驱动Flash页编程执行时间. 痞子衡之前写过一篇文章 <串行NOR Flash的页编程模式对于量产 ...