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),求最少几次操作可以把这棵数转化为只有一个数字 ...
随机推荐
- MapReduce算法形式三:cleanup
案例三:cleanup 其实这个案例可以不用写这么复杂,不用cleanup也能写,但是为了,突显,突显,突显(重要的事说四遍)cleanup的重要性,琢磨了半天,恩,这样写既可以突显cleanup又显 ...
- react native 知识点总结(一)
一.关于react native 版本的升级 参照文档:http://reactnative.cn/docs/0.45/upgrading.html react-native -v 查看当前版本 ...
- jQuery常用插件大全(9)ResponsiveSlides插件
ResponsiveSlides.js是一个展示同一容器内图片的轻量级响应式jQuery幻灯片插件(tiny responsive slideshow jQuery plugin).它支持包括IE6在 ...
- SpringBoot发送简单文本邮件
1.pom.xml添加 spring-boot-starter-mail 依赖 <dependency> <groupId>org.springframework.boot&l ...
- CSS自定义文件上传按钮样式,兼容主流浏览器
解决办法:使用text文本框及a链接模拟文件上传按钮,并且把文件上传按钮放在他们上面,并且文件上传按钮显示透明.1.图片2. [代码][HTML]代码 <div class="b ...
- ES6 模板编译
顾名思义,就是用反引号编写一个模板字符串, 用echo将模板转为javascrip表达式字符串, 用正则将基础字符串转为想要字符串 将代码封装在函数中返回: 注: 用到es6属性${} var tem ...
- saltstack自动化运维快速入门
saltstack自动化运维快速入门 关于saltstack 这个软件是干啥的 我这里就不介绍了 只是简单的说下是干啥的 网上的说法是 它是func的强化版本+ puppet的精简版 关于puppet ...
- CS231n 2016 通关 第一章-内容介绍
第一节视频的主要内容: Fei-Fei Li 女神对Computer Vision的整体介绍.包括了发展历史中的重要事件,其中最为重要的是1959年测试猫视觉神经的实验. In 1959 Harvar ...
- UI:动画
参考 UIView 层级管理.触摸.检测手机是否横屏.调整设备的方向 动画:为了提高用户的体验 View层的动画.UIlayer层的动画.UIView改变视图效果.UIlayer的绘图框架 #prag ...
- In-App Purchase Programming Guide----(五) ----Delivering Products
Delivering Products In the final part of the purchase process, your app waits for the App Store to p ...