题目链接:BZOJ - 2243

题目分析

树链剖分...写了200+行...Debug了整整一天+...

静态读代码读了 5 遍 ,没发现错误,自己做小数据也过了。

提交之后全 WA 。

————————————— 杯具的分割线 —————————————————

然后看了别人代码。。然后发现。。

我写线段树区间修改竟然没打标记!!!!直接就修改上了!!!最裸的线段树都不会写了!!!

Warning!Warning!Warning!

代码

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm> using namespace std; const int MaxN = 100000 + 5; int n, m, Index;
int Father[MaxN], Son[MaxN], Depth[MaxN], Top[MaxN], A[MaxN], Size[MaxN], Pos[MaxN];
int Color[MaxN]; struct Edge
{
int v;
Edge *Next;
} E[MaxN * 2], *P = E, *Point[MaxN]; inline void AddEdge(int x, int y) {
++P; P -> v = y;
P -> Next = Point[x]; Point[x] = P;
} int DFS_1(int x, int Dep, int Fa) {
Depth[x] = Dep;
Father[x] = Fa;
Size[x] = 1;
int SonSize, MaxSonSize;
SonSize = MaxSonSize = 0;
for (Edge *j = Point[x]; j; j = j -> Next) {
if (j -> v == Fa) continue;
SonSize = DFS_1(j -> v, Dep + 1, x);
if (SonSize > MaxSonSize) {
Son[x] = j -> v;
MaxSonSize = SonSize;
}
Size[x] += SonSize;
}
return Size[x];
} void DFS_2(int x) {
if (x == 0) return;
if (x == Son[Father[x]]) Top[x] = Top[Father[x]];
else Top[x] = x;
Pos[x] = ++Index;
Color[Pos[x]] = A[x];
DFS_2(Son[x]);
for (Edge *j = Point[x]; j; j = j -> Next) {
if (j -> v == Father[x] || j -> v == Son[x]) continue;
DFS_2(j -> v);
}
} struct ES
{
int Lx, Rx, Tx;
ES() {}
ES(int a, int b, int c) {
Lx = a; Rx = b; Tx = c;
}
} T[MaxN * 4], D[MaxN * 4]; ES Plus(ES e1, ES e2) {
ES ret;
if (e1.Tx == 0) return e2;
if (e2.Tx == 0) return e1;
ret = ES(e1.Lx, e2.Rx, e1.Tx + e2.Tx);
if (e1.Rx == e2.Lx) --ret.Tx;
return ret;
} inline void Update(int x) {
T[x] = Plus(T[x << 1], T[x << 1 | 1]);
} void Plant_Tree(int x, int s, int t) {
if (s == t) {
T[x] = ES(Color[s], Color[s], 1);
D[x] = ES(0, 0, 0);
return;
}
int m = (s + t) >> 1;
Plant_Tree(x << 1, s, m);
Plant_Tree(x << 1 | 1, m + 1, t);
Update(x);
} inline void Paint(int x, ES Dlt) {
T[x] = Dlt;
D[x] = Dlt;
} inline void PushDown(int x) {
if (D[x].Tx == 0) return;
Paint(x << 1, D[x]);
Paint(x << 1 | 1, D[x]);
D[x] = ES(0, 0, 0);
} void Change_Tree(int x, int s, int t, int l, int r, int Col) {
if (l <= s && r >= t) {
ES Temp = ES(Col, Col, 1);
Paint(x, Temp);
return;
}
PushDown(x);
int m = (s + t) >> 1;
if (l <= m) Change_Tree(x << 1, s, m, l, r, Col);
if (r >= m + 1) Change_Tree(x << 1 | 1, m + 1, t, l, r, Col);
Update(x);
} void Change_Color(int x, int y, int z) {
int fx, fy;
while (true) {
fx = Top[x]; fy = Top[y];
if (Depth[fx] < Depth[fy]) {
swap(fx, fy);
swap(x, y);
}
if (fx == fy) {
if (Pos[x] < Pos[y]) Change_Tree(1, 1, n, Pos[x], Pos[y], z);
else Change_Tree(1, 1, n, Pos[y], Pos[x], z);
break;
}
else {
Change_Tree(1, 1, n, Pos[fx], Pos[x], z);
x = Father[fx];
}
}
} ES Query_Tree(int x, int s, int t, int l, int r) {
if (l <= s && r >= t) return T[x];
PushDown(x);
int m = (s + t) >> 1;
ES ret = ES(0, 0, 0);
if (l <= m) ret = Plus(ret, Query_Tree(x << 1, s, m, l, r));
if (r >= m + 1) ret = Plus(ret, Query_Tree(x << 1 | 1, m + 1, t, l, r));
return ret;
} int Query(int x, int y) {
int fx, fy, ret;
ES Ansx, Ansy, Temp;
Ansx = Ansy = ES(0, 0, 0);
while (true) {
fx = Top[x]; fy = Top[y];
if (Depth[fx] < Depth[fy]) {
swap(fx, fy);
swap(x, y);
swap(Ansx, Ansy);
}
if (fx == fy) {
ret = Ansx.Tx + Ansy.Tx;
if (Pos[x] < Pos[y]) {
Temp = Query_Tree(1, 1, n, Pos[x], Pos[y]);
ret += Temp.Tx;
if (Ansy.Lx == Temp.Rx) --ret;
if (Ansx.Lx == Temp.Lx) --ret;
}
else {
Temp = Query_Tree(1, 1, n, Pos[y], Pos[x]);
ret += Temp.Tx;
if (Ansx.Lx == Temp.Rx) --ret;
if (Ansy.Lx == Temp.Lx) --ret;
}
break;
}
else {
Ansx = Plus(Query_Tree(1, 1, n, Pos[fx], Pos[x]), Ansx);
x = Father[fx];
}
}
return ret;
} int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i) scanf("%d", &A[i]);
int a, b, c;
for (int i = 1; i <= n - 1; ++i) {
scanf("%d%d", &a, &b);
AddEdge(a, b);
AddEdge(b, a);
}
DFS_1(1, 0, 0);
Index = 0;
DFS_2(1);
Plant_Tree(1, 1, n);
char ch;
int Ans;
for (int i = 1; i <= m; ++i) {
ch = '#';
while (ch != 'C' && ch != 'Q') ch = getchar();
if (ch == 'C') {
scanf("%d%d%d", &a, &b, &c);
Change_Color(a, b, c);
}
else {
scanf("%d%d", &a, &b);
Ans = Query(a, b);
printf("%d\n", Ans);
}
}
return 0;
}

  

[BZOJ 2243] [SDOI 2011] 染色 【树链剖分】的更多相关文章

  1. BZOJ 2243 SDOI 2011染色

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2243 算法讨论: 树链剖分把树放到线段树上.然后线段树的每个节点要维护的东西有左端点的颜色 ...

  2. BZOJ 2243 染色 | 树链剖分模板题进阶版

    BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上 ...

  3. BZOJ 2243: [SDOI2011]染色 [树链剖分]

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6651  Solved: 2432[Submit][Status ...

  4. Bzoj 2243: [SDOI2011]染色 树链剖分,LCT,动态树

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 5020  Solved: 1872[Submit][Status ...

  5. BZOJ 2243: [SDOI2011]染色 树链剖分 倍增lca 线段树

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  6. BZOJ 2243: [SDOI2011]染色 树链剖分+线段树区间合并

    2243: [SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数 ...

  7. BZOJ 2243: [SDOI2011]染色 (树链剖分+线段树合并)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2243 树链剖分的点剖分+线段树.漏了一个小地方,调了一下午...... 还是要细心啊! 结 ...

  8. [bzoj 2243]: [SDOI2011]染色 [树链剖分][线段树]

    Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“ ...

  9. BZOJ 2243 染色 树链剖分

    题意: 给出一棵树,每个顶点上有个颜色\(c_i\). 有两种操作: C a b c 将\(a \to b\)的路径所有顶点上的颜色变为c Q a b 查询\(a \to b\)的路径上的颜色段数,连 ...

随机推荐

  1. PDO方法连接数据库(怕忘记,记起来)

    PDO方法连接数据库更加安全! [完整代码,只需要添上对应的数据库即可以运行] <?php include "init.inc.php"; //--------------- ...

  2. [Javascript] Creating an Immutable Object Graph with Immutable.js Map()

    Learn how to create an Immutable.Map() through plain Javascript object construction and also via arr ...

  3. MySQL快捷键

    \c  clear  放弃正在输入的命令\h  help   显示一份命令清单\q   exit  或  quit  退出Mysql程序         在linux里面可以使用Ctr+D快捷键\s  ...

  4. STL的基本使用之关联容器:map和multiMap的基本使用

    STL的基本使用之关联容器:map和multiMap的基本使用 简介 map 和 multimap 内部也都是使用红黑树来实现,他们存储的是键值对,并且会自动将元素的key进行排序.两者不同在于map ...

  5. windows下jboss启动、配置、访问

    window 下的jboss启动.配置.访问 1.进入jboss\server\default\deploy\jboss-web.deployer 执行run命令 2.jboss访问地址:http:/ ...

  6. JavaScript 数据类型转换(显式与隐式)

    一.数据类型 JS中有5中简单数据类型(也称为基本数据类型):Undefined.Null.Boolean.Number.String.还有一种复杂数据类型------Object,Object本质是 ...

  7. 访问nginx提示gateway timeout 504 ,发现总是当调用时间超过30s时提示504错误

    解决办法: 需要修改php-fpm的配置文件 request_terminate_timeout=30s 参考文档: http://baike.baidu.com/view/641394.htm ht ...

  8. postgresql sql修改表,表字段

    1.更改表名 alter table 表名 rename to 新表名 2.更改字段名 alter table 表名 rename 字段名 to 新字段名 3.增加列 ALTER TABLE ud_w ...

  9. Difference Between XML and XAML.

    XML, or Extensible Markup Language, is a subset  of the more complex SGML (Standard Generalized Mark ...

  10. ContextSwitchDeadlock was detected Message(读取注册表时出现).

    google的时候,在StackOverflow中得到个暂时解决的方法: http://stackoverflow.com/questions/2797677/contextswitchdeadloc ...