E. Anton and Tree 数组开大点
http://codeforces.com/contest/734/problem/E
看了题解,缩点 + 树的直径。
然而一直wa14.
注意到,

缩点后重建图,在5的时候,5和6建了一条边,然后6的时候,又和5建一次边。这个时候就要大数组了。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
const int maxn = * + ;
int first[maxn];
int first_sec[maxn];
int num, num_sec;
struct node {
int u, v, w;
int tonext;
}e[maxn * ], e_sec[maxn * ];
int col[maxn];
void add(int u, int v) {
++num;
e[num].u = u;
e[num].v = v;
e[num].tonext = first[u];
first[u] = num;
}
void add_sec(int u, int v) {
++num_sec;
e_sec[num_sec].u = u;
e_sec[num_sec].v = v;
e_sec[num_sec].tonext = first_sec[u];
first_sec[u] = num_sec;
}
bool vis[maxn];
int fa[maxn];
int find(int u) {
if (u == fa[u]) return u;
else return fa[u] = find(fa[u]);
}
void merge(int u, int v) {
u = find(u);
v = find(v);
if (u != v) {
fa[v] = u;
}
}
void dfs(int cur) {
for (int i = first[cur]; i; i = e[i].tonext) {
int v = e[i].v;
if (vis[v]) continue;
vis[v] = true;
if (col[cur] == col[v]) {
merge(cur, v);
}
dfs(v);
}
}
void dfs2(int cur) {
printf("cur %d : %d\n", cur, col[cur]);
for (int i = first_sec[cur]; i; i = e_sec[i].tonext) {
int v = e_sec[i].v;
if (vis[v]) continue;
vis[v] = true;
dfs2(v);
}
}
struct NODE {
int cur, cnt;
NODE(int aa, int bb) : cur(aa), cnt(bb) {}
};
int bfs(int begin) {
memset(vis, , sizeof vis);
queue<struct NODE>que;
while(!que.empty()) que.pop();
que.push(NODE(begin, ));
vis[begin] = true;
int mx = -inf;
int to = begin;
while (!que.empty()) {
struct NODE t = que.front();
que.pop();
for (int i = first_sec[t.cur]; i; i = e_sec[i].tonext) {
int v = e_sec[i].v;
if (vis[v]) continue;
que.push(NODE(v, t.cnt + ));
vis[v] = true;
if (mx < t.cnt + ) {
mx = t.cnt + ;
to = v;
}
}
}
if (to == begin) return ;
// cout << to << " " << mx << endl;
que.push(NODE(to, ));
memset(vis, , sizeof vis);
vis[to] = true;
mx = -inf;
to = ;
while (!que.empty()) {
struct NODE t = que.front();
que.pop();
for (int i = first_sec[t.cur]; i; i = e_sec[i].tonext) {
int v = e_sec[i].v;
if (vis[v]) continue;
que.push(NODE(v, t.cnt + ));
if (mx < t.cnt + ) {
mx = t.cnt + ;
to = v;
}
vis[v] = true;
}
}
// cout << mx << " " << to << endl;
return mx;
}
void work() {
int n;
scanf("%d", &n);
for (int i = ; i <= n; ++i) fa[i] = i;
for (int i = ; i <= n; ++i) scanf("%d", &col[i]);
for (int i = ; i <= n - ; ++i) {
int u, v;
scanf("%d%d", &u, &v);
add(u, v);
add(v, u);
if (num > * ) while();
}
vis[] = true;
dfs();
// for (int i = 1; i <= n; ++i) {
// printf("%d\n", find(i));
// }
for (int i = ; i <= n; ++i) {
for (int j = first[i]; j; j = e[j].tonext) {
int v = e[j].v;
if (find(i) == find(v)) continue;
// printf("%d %d\n", find(i), find(v));
// printf("fff");
add_sec(find(i), find(v));
add_sec(find(v), find(i));
}
}
// memset(vis, 0, sizeof vis);
// vis[1] = 1;
// dfs2(1);
int ans = bfs(find());
cout << (ans + ) / << endl;
} int main() {
#ifdef local
freopen("data.txt","r",stdin);
#endif
work();
return ;
}
为什么直径 / 2是答案?因为可以在直径中间的那个点,一直变一直变。
E. Anton and Tree 数组开大点的更多相关文章
- [ACM_数据结构] Color the ball [线段树水题][数组开大]
Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次 ...
- Atitit 编程语言知识点tech tree v2 attilax大总结
Atitit 编程语言知识点tech tree v2 attilax大总结 大分类中分类小分类知识点原理与规范具体实现(javac#里面的实现phpjsdsl(自己实现其他语言实现 类与对象实现对象实 ...
- Codeforces Round #379 (Div. 2) E. Anton and Tree —— 缩点 + 树上最长路
题目链接:http://codeforces.com/contest/734/problem/E E. Anton and Tree time limit per test 3 seconds mem ...
- Codeforces 734E. Anton and Tree 搜索
E. Anton and Tree time limit per test: 3 seconds memory limit per test :256 megabytes input:standard ...
- Codeforces Round #379 (Div. 2) E. Anton and Tree 缩点 直径
E. Anton and Tree 题目连接: http://codeforces.com/contest/734/problem/E Description Anton is growing a t ...
- Codeforces Round #379 (Div. 2) E. Anton and Tree 树的直径
E. Anton and Tree time limit per test 3 seconds memory limit per test 256 megabytes input standard i ...
- 开大Stack的一个小技巧
在程序头部添加一行 #pragma comment(linker, "/STACK:16777216") 可有效开大堆栈 实验效果如下: 11330179 2014-08-05 1 ...
- Anton and Tree
Anton and Tree 题目链接:http://codeforces.com/contest/734/problem/E DFS/BFS 每一次操作都可以使连通的结点变色,所以可以将连通的点缩成 ...
- Codeforces 734E Anton and Tree(缩点+树的直径)
题目链接: Anton and Tree 题意:给出一棵树由0和1构成,一次操作可以将树上一块相同的数字转换为另一个(0->1 , 1->0),求最少几次操作可以把这棵数转化为只有一个数字 ...
随机推荐
- kbmMW实现sql查询(图文并茂)
kbmMW对于Delphi来说,是最好的多层框架,没有之一,无论是效率.稳定及架构都让人无可挑剔,尤其自Delphi支持跨平台开发以来,随着Delphi支持ios及Android移动开发,KbmMW也 ...
- react native 之页面布局
第一章 flexbox 布局 1.flexDirection:'row', 水平 flexDirection:'column',垂直 需要在父元素上设置这种属性才能实现flex. flex:1 会撑 ...
- HDU3085 Nightmare Ⅱ —— 双向BFS + 曼哈顿距离
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3085 Nightmare Ⅱ Time Limit: 2000/1000 MS (Java/Other ...
- 包、修饰符、内部类、匿名内部类(java基础知识十)
1.package关键字的概述及作用 * A:为什么要有包 * 将字节码(.class)进行分类存放 * B:包的概述 * * C:包的作用 * 包名要定义在第一行, ...
- JavaScript实现Map、Reduce和Filter
1. [代码][JavaScript]代码 <script type="text/javascript">// 函数式编程:// 描述我们要做什么,而不是我们如 ...
- CF_576D_Flights for Regular Customers_矩阵乘法+倍增floyd+bitset+bfs
CF_576D_Flights for Regular Customers_矩阵乘法+倍增floyd+bitset https://www.luogu.org/problemnew/show/CF57 ...
- MongoDB复制集安全认证
之前我有一篇博客写的是“node.js通过权限验证连接MongoDB”,这篇博客上提到如何在启动文件中通过配置auth参数来开启权限认证,但这种认证方式只适合单机节点,当我们使用复制集时应该怎么开启权 ...
- 洛谷P1290 欧几里德的游戏
题目:https://www.luogu.org/problemnew/show/P1290 只要出现n>=2*m,就可以每次把较大的数控制在较小的数的一倍与二倍之间,则控制了对方的走法: 每次 ...
- Oracle 安装报错 [INS-06101] IP address of localhost could not be determined 解决方法输入日志标题
安装Oracle 11gR2,报错:[INS-06101] IP address of localhost could not be determined 出现这种错误是因为主机名和/etc/host ...
- Linux环境下在Tomcat上部署JavaWeb工程
本文讲解如何将我们已经编译好的JavaWeb工程在Linux环境下的Tomcat上进行部署,总体上的思路是和Windows下JavaWeb项目部署到tomcat差不多,具体步骤和命令如下. 注:部署之 ...