[Bzoj2243][SDOI2011]染色(线段树树剖)

题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2243

线段树+树链剖分,在线段树需要每次用lt和rt两个数组记录当前区间的左右边界的颜色,向上更新时需要判断左区间的右边界是否和右区间的左边界相等。在剖分求LCA的过程中需要在求值之后查询与下一次求值的边界是否相等。

  1 #include<bits/stdc++.h>
  2 #define lson l,mid,i<<1
  3 #define rson mid+1,r,i<<1|1
  4 using namespace std;
  5 typedef long long ll;
  6 const int maxn = 200005;
  7 const int INF = 2e9;
  8 struct node {
  9     int s, e, next;
 10 }edge[maxn * 2];
 11 int n, m;
 12 int son[maxn], top[maxn], tid[maxn], fat[maxn], siz[maxn], dep[maxn], rak[maxn];
 13 int head[maxn], len, dfx;
 14 //siz保存以i为根的子树节点个数,top保存i节点所在链的顶端节点,son保存i节点的重儿子,fat保存i节点的父亲节点
 15 //dep保存i节点的深度(根为1),,tid保存i节点dfs后的新编号,rak保存新编号i对应的节点(rak[i]=j,tid[j]=i)。
 16 void init() {
 17     memset(head, -1, sizeof(head));
 18     len = 0, dfx = 0;
 19 }
 20 void add(int s, int e) {//邻接表存值
 21     edge[len].s = s;
 22     edge[len].e = e;
 23     edge[len].next = head[s];
 24     head[s] = len++;
 25 }
 26 //搜出每个节点的siz,son,fat,dep
 27 void dfs1(int x, int fa, int d) {
 28     siz[x] = 1, son[x] = -1, fat[x] = fa, dep[x] = d;
 29     for (int i = head[x]; i != -1; i = edge[i].next) {
 30         int y = edge[i].e;
 31         if (y == fa)
 32             continue;
 33         dfs1(y, x, d + 1);
 34         siz[x] += siz[y];
 35         if (son[x] == -1 || siz[y] > siz[son[x]])
 36             son[x] = y;
 37     }
 38 }
 39 //搜出每个节点的top,tid,rak
 40 void dfs2(int x, int c) {
 41     top[x] = c;
 42     tid[x] = ++dfx;
 43     rak[dfx] = x;
 44     if (son[x] == -1)
 45         return;
 46     dfs2(son[x], c);
 47     for (int i = head[x]; i != -1; i = edge[i].next) {
 48         int y = edge[i].e;
 49         if (y == fat[x] || y == son[x])
 50             continue;
 51         dfs2(y, y);
 52     }
 53 }
 54 int a[maxn];
 55 int cr[maxn * 2];
 56 int rt[maxn * 2];
 57 int lt[maxn * 2];
 58 int lazy[maxn * 2];
 59 void up(int i) {
 60     lt[i] = lt[i << 1], rt[i] = rt[i << 1 | 1];
 61     cr[i] = cr[i << 1] + cr[i << 1 | 1];
 62     if (lt[i << 1 | 1] == rt[i << 1])
 63         cr[i]--;
 64 }
 65 void down(int i) {
 66     if (lazy[i] != -1) {
 67         lt[i << 1] = lt[i << 1 | 1] = rt[i << 1] = rt[i << 1 | 1] = lazy[i];
 68         cr[i << 1] = cr[i << 1 | 1] = cr[i];
 69         lazy[i << 1] = lazy[i << 1 | 1] = lazy[i];
 70         lazy[i] = -1;
 71     }
 72 }
 73 void build(int l, int r, int i) {
 74     lazy[i] = -1;
 75     if (l == r) {
 76         cr[i] = 1;
 77         rt[i] = a[rak[l]];
 78         lt[i] = a[rak[l]];
 79         return;
 80     }
 81     int mid = (l + r) >> 1;
 82     build(lson);
 83     build(rson);
 84     up(i);
 85 }
 86 void update(int L, int R, int k, int l, int r, int i) {
 87     if (L <= l && r <= R) {
 88         cr[i] = 1;
 89         lazy[i] = k;
 90         lt[i] = rt[i] = k;
 91         return;
 92     }
 93     down(i);
 94     int mid = (l + r) >> 1;
 95     if (L <= mid)
 96         update(L, R, k, lson);
 97     if (R > mid)
 98         update(L, R, k, rson);
 99     up(i);
100 }
101 int qquery(int L, int R, int l, int r, int i) {
102     if (L <= l && r <= R) return cr[i];
103     down(i);
104     int mid = (l + r) >> 1;
105     if (R <= mid) return qquery(L, R, lson);
106     if (L > mid) return qquery(L, R, rson);
107     int ans1 = qquery(L, R, lson);
108     int ans2 = qquery(L, R, rson);
109     int ans = ans1 + ans2;
110     if (rt[i << 1] == lt[i << 1 | 1]) ans--;
111     return ans;
112 }
113 
114 int dquery(int k, int l, int r, int i) {
115     if (l == r) {
116         return lt[i];
117     }
118     int mid = (l + r) / 2;
119     down(i);
120     if (k <= mid)
121         return dquery(k, lson);
122     else
123         return dquery(k, rson);
124 }
125 int solve(int x, int y, int w, int flg) {
126     int ans = 0;
127     while (top[x] != top[y]) {
128         if (dep[top[x]] < dep[top[y]])
129             swap(x, y);
130         if (!flg)
131             update(tid[top[x]], tid[x], w, 1, n, 1);
132         else {
133             ans += qquery(tid[top[x]], tid[x], 1, n, 1);
134             if (dquery(tid[top[x]], 1, n, 1) == dquery(tid[fat[top[x]]], 1, n, 1))
135                 ans--;
136         }
137         x = fat[top[x]];
138     }
139     if (dep[x] < dep[y])
140         swap(x, y);
141     if (!flg)
142         update(tid[y], tid[x], w, 1, n, 1);
143     else {
144         ans += qquery(tid[y], tid[x], 1, n, 1);
145         return ans;
146     }
147 }
148 int main() {
149     while (scanf("%d%d", &n, &m) != EOF) {
150         for (int i = 1; i <= n; i++)
151             scanf("%d", &a[i]);
152         init();
153         int x, y, z;
154         for (int i = 0; i < n - 1; i++) {
155             scanf("%d%d", &x, &y);
156             add(x, y);
157             add(y, x);
158         }
159         dfs1(1, 0, 1);
160         dfs2(1, 1);
161         build(1, n, 1);
162         while (m--) {
163             char s[10];
164             scanf("%s", s);
165             if (s[0] == 'C') {
166                 scanf("%d%d%d", &x, &y, &z);
167                 solve(x, y, z, 0);
168             }
169             else {
170                 scanf("%d%d", &x, &y);
171                 printf("%d\n", solve(x, y, 0, 1));
172             }
173         }
174     }
175 }

 

转载于:https://www.cnblogs.com/sainsist/p/11159853.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363894.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php static_castunsigned int,C++ static_cast、dynamic_cast、const_cast和reinterpret_cast(四种类型转换运算符)...

上节讲到&#xff0c;隐式类型转换是安全的&#xff0c;显式类型转换是有风险的&#xff0c;C语言之所以增加强制类型转换的语法&#xff0c;就是为了强调风险&#xff0c;让程序员意识到自己在做什么。但是&#xff0c;这种强调风险的方式还是比较粗放&#xff0c;粒度比较大&…

NetBeans IDE 8.0和Java 8的新功能

NetBeans IDE 8.0已发布&#xff0c;还为Java 8技术提供了新功能。 它具有用于与Java SE 8&#xff0c;Java SE Embedded 8和Java ME Embedded 8配合使用的代码分析器和编辑器。IDE还具有新的增强功能&#xff0c;这些功能进一步改善了其对使用PrimeFaces对Maven和Java EE的支持…

AngularJS(九):路由

本文也同步发表在我的公众号“我的天空” AngularJS路由 AngularJS路由可以让我们通过不同的URL访问不同页面&#xff08;似乎是废话&#xff09;&#xff0c;其价值主要体现在单页面的web应用中&#xff08;single page web application&#xff0c;SPA&#xff09;&#xff0…

(转)Oracle中实现行列转换的方法

(转自)http://blog.csdn.net/Torrice/archive/2006/01/25/587986.aspx 我们在写SQL语句的时候经常需要用到行与列的转换问题&#xff0c;对于一个新手来说可能比较困难&#xff0c;其实你只要能够熟练运用Decode和Sum函数&#xff0c;这个问题就迎刃而解. Create table tes…

[C3W2] Structuring Machine Learning Projects - ML Strategy 2

第二周&#xff1a;机器学习策略&#xff08;2&#xff09;&#xff08;ML Strategy&#xff08;2&#xff09;&#xff09; 误差分析&#xff08;Carrying out error analysis&#xff09; 你好&#xff0c;欢迎回来&#xff0c;如果你希望让学习算法能够胜任人类能做的任务&a…

mysql语句执行顺序图示

转载于:https://www.cnblogs.com/whalesea/p/10382227.html

玩Java 8 – Lambda和并发

因此Java 8不久前发布&#xff0c;具有许多功能和更改。 我们所有的Java狂热者一直在等待这个历史&#xff0c;从他们最初宣布Java 7的所有强大功能开始一直到最终被取消。 我最近才有时间实际开始给它一个真实的外观&#xff0c;我将我的家庭项目更新到了8个&#xff0c;我不…

用matlab 拟合实数解,求大神指点matlab用拟合的方式解延迟微分方程组参数

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼dy(1)-k*y(1)*y(2);dy(2)Z(3,1)-a*y(2)-q*y(2);dy(3)k*y(1)*y(2)-Z(3,1);dy(4)a*y(2);dy(5)q*y(2);t12345678910111213141516171819202122232425262728293031323334353637383940y208563475657545454535252515150504948484747464545…

AngularJS(三):重复HTML元素、数据绑定

本文也同步发表在我的公众号“我的天空” 重复HTML元素 在前端的页面编写中&#xff0c;我们会经常遇到重复HTML元素&#xff0c;譬如绘制表格、菜单等&#xff0c;如以下代码显示一个简单的li列表&#xff1a; <body> <ul id"ul_cities"> </ul…

hyper-v下的ubuntu虚拟机分辨率修改

修改/etc/default/grub sudo vim /etc/default/grub 改变前: GRUB_CMDLINE_LINUX_DEFAULT"quiet splash" 改变后: GRUB_CMDLINE_LINUX_DEFAULT"quiet splash videohyperv_fb:1920x1080" 更新grub配置 sudo update-grub 重启即可生效 sudo reboot 转载于:ht…

gopacket 在 windows 上面遇到的问题

前阵子有个需求是使用 golang 抓包改包&#xff0c;我用到了 gopacket 这个包&#xff0c;但是出了一些小问题。 我按照网上的方法进行使用 OpenLive 抓包&#xff0c;发现并不行&#xff0c;报错 error open adapter 啥啥啥。 经过调试发现根本找不到这个网卡&#xff0c;需要…

使用表中的数组数据类型

在这篇文章中&#xff0c;我想跟进我以前关于Oracle集合数据类型的文章 &#xff0c;并且我将集中精力使用af&#xff1a;table组件中的oracle.jbo.domain.Array属性。 因此&#xff0c;在我的数据库中&#xff0c;我具有以下SQL类型&#xff1a; create or replace type var…

最伟大最不可思议最令人感动的父亲

转载于:https://www.cnblogs.com/chenou/archive/2007/10/23/935014.html

关于数据库名、实例名

最近因看到论坛有人问起这方面的东西&#xff0c;将自己的理解加上查阅相关资料整理如下&#xff0c;如果不全或不当的地方&#xff0c;望指正并补全它。 数据库名(DB_NAME)、实例名(Instance_name)、以及操作系统环境变量(ORACLE_SID) 在ORACLE7、8数据库中只有数据库名(db_…

linux 文件inode,linux文件系统-inode学习整理

linux文件系统-inode学习整理介绍linux文件系统可讲的模块有很多&#xff0c;包括文件系统整体架构、文件系统分类、虚拟文件系统以及文件系统存储结构等等&#xff0c;本文主要介绍的是文件系统的存储结构&#xff0c;也就是本文的重点-inode。文件存储结构首先从开天辟地开始…

操作方法:Maven的Spring Boot和Thymeleaf

Spring Boot是一款很棒的软件&#xff0c;可让您在几秒钟内引导Spring应用程序。 它确实有效。 尽可能少的配置即可上手。 而且仍然可以更改默认值。 让我们看看用Thymeleaf和Maven引导Spring MVC并在IntelliJ中使用它是多么容易。 Spring MVC Thymeleaf与Maven的基本设置 确…

csharp: 百度语音合成

public string API_id "3333"; //你的IDpublic string API_record null; public string API_record_format null; public string API_record_HZ null;public string API_key "geovindu"; //你的KEYpublic string API_secret_key "geovindu"…

20080408 - VS2003 中 Jscript 文件中文乱码问题

在 VS2003 中新建 Jscript 文件中使用中文时&#xff0c;如果和网页的编码不一致&#xff0c;有可能会出现中文乱码问题。 而 VS2003 的Web页面默认是用 UTF-8&#xff0c;这是多语的首选方案。 但 VS2003 产品的本地化工作可能做得不到位&#xff0c;在其中新建的 Jscript 文件…

一个简单的发布工具

自己写的一个简单工具&#xff0c;可以把做好的程序中的.cs,.sln,等代码文件排除掉&#xff0c;只剩下页面文件 是用.net 2.0做的程序文件 转载于:https://www.cnblogs.com/itants/archive/2007/10/24/935824.html

用于大型事件处理的Akka Java

我们正在设计一个大型的分布式事件驱动系统&#xff0c;用于跨事务数据库的实时数据复制。 来自源系统的数据&#xff08;消息&#xff09;在到达目的地之前经历了一系列转换和路由逻辑。 这些转换是多进程和多线程的操作&#xff0c;包括可以同时执行的较小的无状态步骤和任务…