解题: SDOI 2011 染色
题面
强行把序列问题通过树剖套在树上。。。算了算是回顾了一下树剖的思想=。=
每次树上跳的时候注意跳的同时维护当前拼出来的左右两条链的靠上的端点,然后拼起来的时候讨论一下拼接点,最后一下左右两边的端点都要考虑
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=100005; 6 struct a 7 { 8 int cnt; 9 int lc,rc; 10 }; 11 int num[N],nmb[N],val[4*N],lcol[4*N],rcol[4*N],laz[4*N]; 12 int siz[N],dep[N],anc[N],imp[N],top[N],dfn[N]; 13 int p[N],noww[2*N],goal[2*N]; 14 int n,m,t1,t2,t3,cnt,tot; 15 char rd[2]; 16 void link(int f,int t) 17 { 18 noww[++cnt]=p[f]; 19 goal[cnt]=t,p[f]=cnt; 20 } 21 void DFS(int nde,int fth,int dth) 22 { 23 int tmp=0; 24 siz[nde]=1,anc[nde]=fth,dep[nde]=dth; 25 for(int i=p[nde];i;i=noww[i]) 26 if(goal[i]!=fth) 27 { 28 DFS(goal[i],nde,dth+1); 29 siz[nde]+=siz[goal[i]]; 30 if(siz[goal[i]]>tmp) 31 tmp=siz[goal[i]],imp[nde]=goal[i]; 32 } 33 } 34 void MARK(int nde,int tpp) 35 { 36 dfn[nde]=++tot,nmb[tot]=num[nde],top[nde]=tpp; 37 if(imp[nde]) 38 { 39 MARK(imp[nde],tpp); 40 for(int i=p[nde];i;i=noww[i]) 41 if(goal[i]!=anc[nde]&&goal[i]!=imp[nde]) 42 MARK(goal[i],goal[i]); 43 } 44 } 45 void pushup(int nde) 46 { 47 int ls=2*nde,rs=2*nde+1; 48 lcol[nde]=lcol[ls],rcol[nde]=rcol[rs]; 49 val[nde]=val[ls]+val[rs]-(rcol[ls]==lcol[rs]); 50 } 51 void create(int nde,int l,int r) 52 { 53 if(l==r) 54 val[nde]=1,lcol[nde]=rcol[nde]=nmb[l]; 55 else 56 { 57 int mid=(l+r)/2,ls=2*nde,rs=2*nde+1; 58 create(ls,l,mid),create(rs,mid+1,r); 59 pushup(nde); 60 } 61 } 62 void release(int nde,int l,int r) 63 { 64 if(laz[nde]) 65 { 66 int ls=2*nde,rs=2*nde+1; 67 laz[ls]=lcol[ls]=rcol[ls]=laz[nde]; 68 laz[rs]=lcol[rs]=rcol[rs]=laz[nde]; 69 val[ls]=val[rs]=1; laz[nde]=0; 70 } 71 } 72 void change(int nde,int l,int r,int nl,int nr,int task) 73 { 74 if(l>nr||r<nl) 75 return ; 76 else if(l>=nl&&r<=nr) 77 val[nde]=1,lcol[nde]=rcol[nde]=laz[nde]=task; 78 else 79 { 80 int mid=(l+r)/2,ls=2*nde,rs=2*nde+1; release(nde,l,r); 81 change(ls,l,mid,nl,nr,task),change(rs,mid+1,r,nl,nr,task); 82 pushup(nde); 83 } 84 } 85 a query(int nde,int l,int r,int nl,int nr) 86 { 87 if(l>=nl&&r<=nr) 88 return (a){val[nde],lcol[nde],rcol[nde]}; 89 else 90 { 91 int mid=(l+r)/2,ls=2*nde,rs=2*nde+1; release(nde,l,r); 92 if(nr<=mid) return query(ls,l,mid,nl,nr); 93 if(nl>mid) return query(rs,mid+1,r,nl,nr); 94 a r1=query(ls,l,mid,nl,nr),r2=query(rs,mid+1,r,nl,nr),ret; 95 ret.lc=r1.lc,ret.rc=r2.rc,ret.cnt=r1.cnt+r2.cnt-(r1.rc==r2.lc); 96 return ret; 97 } 98 } 99 void path_change(int x,int y,int v) 100 { 101 while(top[x]!=top[y]) 102 { 103 if(dep[top[x]]<dep[top[y]]) swap(x,y); 104 change(1,1,n,dfn[top[x]],dfn[x],v); x=anc[top[x]]; 105 } 106 if(dep[x]>dep[y]) swap(x,y); 107 change(1,1,n,dfn[x],dfn[y],v); return ; 108 } 109 int path_query(int x,int y) 110 { 111 int rt=0,ll=-1,rr=-1; 112 while(top[x]!=top[y]) 113 { 114 if(dep[top[x]]<dep[top[y]]) swap(x,y),swap(ll,rr); 115 a ret=query(1,1,n,dfn[top[x]],dfn[x]); x=anc[top[x]]; 116 rt+=ret.cnt-(ll==ret.rc); ll=ret.lc; 117 } 118 if(dep[x]>dep[y]) swap(x,y),swap(ll,rr); 119 a ret=query(1,1,n,dfn[x],dfn[y]); rt+=ret.cnt-(ll==ret.lc)-(rr==ret.rc); 120 return rt; 121 } 122 int main () 123 { 124 scanf("%d%d",&n,&m); 125 for(int i=1;i<=n;i++) 126 scanf("%d",&num[i]); 127 for(int i=1;i<n;i++) 128 scanf("%d%d",&t1,&t2),link(t1,t2),link(t2,t1); 129 DFS(1,0,1); MARK(1,1); create(1,1,n); 130 while(m--) 131 { 132 scanf("%s",rd); 133 if(rd[0]=='C') 134 scanf("%d%d%d",&t1,&t2,&t3),path_change(t1,t2,t3); 135 else 136 scanf("%d%d",&t1,&t2),printf("%d\n",path_query(t1,t2)); 137 } 138 return 0; 139 }
View Code
转载于:https://www.cnblogs.com/ydnhaha/p/9743416.html
解题: SDOI 2011 染色相关推荐
- [树链剖分][SDOI 2011]染色,Housewife Wind
文章目录 T1:Housewife Wind 题目 题解 code T2:染色 题目 题解 code 今天选择写这篇博客主要是为了告诉大家一个道理,数组比vectorvectorvector快太多了, ...
- 【SDOI 2011】Paint 染色
http://www.zybbs.org/JudgeOnline/problem.php?id=2243 题目大意:给你一棵树,节点有颜色,要求可以查询某路径中连续颜色段的数目和修改某一段路径的颜色. ...
- CSP2021提高组复赛解析
前言 终于出成绩了我可以写博客辣,官方数据还没出就先放洛谷的题目链接了. 正题 T1-廊桥分配 https://www.luogu.com.cn/problem/P7913 题目大意 有m1m_1m1 ...
- CF444C-DZY Loves Colors【线段树,set】
正题 题目链接:https://www.luogu.com.cn/problem/CF444C 题目大意 nnn个物品第iii个颜色为iii,权值为000.要求支持mmm次操作 给出l,r,xl,r, ...
- 说说中国的图书出版业者-读《小学奥数举一反三(5年级A版)》和《2010注册建筑师建筑结构考试强化模拟试题集》有感...
最近看了两本书,对中国当下的图书出版业者有了些认识. 图书1:<小学奥数举一反三(5年级A版)> (全国优秀畅销书) 作者:蒋顺.李济元,陕西人民教育出版社 ISBN: 978754198 ...
- [网络流][最大点权独立集] 方格取数
预备知识: 点覆盖集:无向图G的一个点集,使得该图中所有边都至少有一个端点在该集合内. 最小点权覆盖集:在带点权无向图G中,点权之和最小的覆盖集. 点独立集:无向图G的一个点集,使得任两个在该集合中的 ...
- 信息学奥赛数学一本通 数论相关题目
[数论]教堂 [数论]教堂_LZK1997的博客-CSDN博客 [数论]教堂_AKone123456的博客-CSDN博客 [数论]密码 [数论]密码_)NCuyALnA$Ke的博客-CSDN博客 [ ...
- webpack打包css image,webpack 打包CSS 引入图片
加载css 安装style-loader, css-loader npm install style-loader css-loader --save-dev 配置webpack.config.js文 ...
- 「HAOI2018」染色 解题报告
「HAOI2018」染色 是个套路题.. 考虑容斥 则恰好为\(k\)个颜色恰好为\(c\)次的贡献为 \[ \binom{m}{k}\sum_{i\ge k}(-1)^{i-k}\binom{m-k ...
最新文章
- Leaflet中使用Leaflet.Graticule插件实现添加矩形格网
- 《Access 2007开发指南(修订版)》一一1.11 额外的提示和技巧
- vue 表单 验证 async-validator
- 怎么在电脑安装php文件夹在哪个文件夹,php进行文件上传时找不到临时文件夹怎么办,电脑自动保存的文件在哪里...
- 10大最高效的Java库盘点
- 清华附2021高考成绩查询,2021年高考多少分能上清华大学?附清华大学录取分数线2020全国汇总...
- 扫地机器人单扫和双扫_618买扫地机器人前必看 别图便宜 小心入坑!
- redis通过lua脚本实现分布式锁
- DNS原理及解析过程
- html渐变色原理,CSS渐变色效果的实现方法与效果演示
- 【信号与系统】(十一)离散系统的时域分析 ——卷积和
- 配置Cisco VWIC T1/E1
- 华为服务器故障灯不开机_华为服务器
- CSP-S 2022 总结
- mysql启动时自动启动event事件
- IDEA——手把手教你mybatis的使用(新手教程)
- 1000左右 笔记本 linux,降价1000 易PC900 30G Linux版本只要2999元
- python 全栈开发之路
- 把Excel批注的“红三角”放在单元格左上角_十个日常Excel操作小技巧,牢牢记住,对你帮助不少呢!...
- P(NIPAAm-co-NHMAAm)温敏水凝胶/PCL-b-PNIPAM聚-己内酯-b-聚N-异丙基丙烯酰胺
热门文章
- docker mysql5.7 主从_docker-compose mysql5.7.30 主从
- matlab中直到循环语句,Matlab再次执行循环,直到第一条语句结束
- mybatis更新时间字段_你以为把Mybatis型处理器了解了,就不会“暴雷”了!
- 权限验证框架Shiro
- python内存管理机制_python内存管理机制
- python列表常用方法实践_python 列表list 常用方法
- 在一起计时器_古典计时器简介之一 qqtimer
- 动词ing形式的5种用法_英语语法这样学就对了!动词-ing结构的特征和四种形式是?...
- 基于javaweb(springboot+mybatis)网上酒类商城项目设计和实现以及文档报告
- 林辉高考机器人_机器人2019年参加高考 力争考上一本