这个题的题意还是很劲的。搞了好久才知道是怎么变得。

(假设已经缩好了点,每次边中间颜色不同的,然后和就和他外面的相同,继续再变这个大的,依次类推,最多就是树的直径D/2)

(还是英语水平太弱了(吐槽++,数学考得还没英语高,还是找个地方撞死吧2333))

 #include<bits/stdc++.h>
#define lowbit(x) x&(-x)
#define LL long long
#define N 200005
#define M 1000005
#define mod 1000000007LL
#define inf 0x7ffffffff
using namespace std;
inline int ra()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>''){if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<=''){x=x*+ch-''; ch=getchar();}
return x*f;
}
struct node{
int next,to;
}re[N<<],e[N<<];
int head[N],hd[N],cnt,recnt;
void insert(int x, int y)
{
e[++cnt].to=y;
e[cnt].next=head[x];
head[x]=cnt;
}
void reinsert(int x, int y)
{
re[++recnt].to=y;
re[recnt].next=hd[x];
hd[x]=recnt;
}
int ans,sum[N],belong[N],mx[N],sec[N],n,deep[N];
bool col[N];
void dfs(int x, int num)
{
belong[x]=num;
for (int i=head[x];i;i=e[i].next)
{
if (belong[e[i].to]) continue;
if (col[e[i].to]==col[x]) dfs(e[i].to,num);
}
}
void rebuild()
{
for (int i=; i<=n; i++)
{
for (int j=head[i];j;j=e[j].next)
{
if (belong[e[j].to]==belong[i]) continue;
reinsert(belong[i],belong[e[j].to]);
}
}
}
void dfs1(int x, int fa)
{
deep[x]=; int mx=,sc=;
for (int i=hd[x];i;i=re[i].next)
{
if (re[i].to==fa) continue;
dfs1(re[i].to,x);
deep[x]=max(deep[x],deep[re[i].to]+);
if (mx==deep[re[i].to]) sc=mx;
if (mx<deep[re[i].to]) sc=mx,mx=deep[re[i].to];
if (mx>deep[re[i].to]) sc=max(sc,deep[re[i].to]);
}
ans=max(ans,max(deep[x],mx+sc+));
}
int main()
{
n=ra();
for (int i=; i<=n; i++) col[i]=ra();
for (int i=; i<n; i++)
{
int x=ra(),y=ra();
insert(x,y);
insert(y,x);
}
int tot=;
for (int i=; i<=n; i++)
if (!belong[i]) dfs(i,++tot);
rebuild();
dfs1(,);
cout<<ans/;
return ;
} //一开始没看懂题意2333,以为好水
/*#include<bits/stdc++.h>
#define lowbit(x) x&(-x)
#define LL long long
#define N 200005
#define M 1000005
#define mod 1000000007LL
#define inf 0x7ffffffff
using namespace std;
inline int ra()
{
int x=0,f=1; char ch=getchar();
while (ch<'0' || ch>'9'){if (ch=='-') f=-1; ch=getchar();}
while (ch>='0' && ch<='9'){x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
struct node{
int next,to;
}e[N<<1];
int head[N],cnt;
bool vis[N],col[N];
inline void insert(int x, int y)
{
e[++cnt].to=y;
e[cnt].next=head[x];
head[x]=cnt;
}
void dfs(int x, int fa)
{
vis[x]=1;
for (int i=head[x];i;i=e[i].next)
{
if (e[i].to==fa || col[e[i].to]!=col[x] || vis[e[i].to]) continue;
dfs(e[i].to,x);
}
}
int n,ans1,ans0;
int main()
{
n=ra();
for (int i=1; i<=n; i++) col[i]=ra();
for (int i=1; i<n; i++)
{
int x=ra(),y=ra();
insert(x,y);
insert(y,x);
}
for (int i=1; i<=n; i++)
if (col[i]==0 && !vis[i]) ++ans0,dfs(i,0);
memset(vis,0,sizeof(vis));
for (int i=1; i<=n; i++)
if (col[i]==1 && !vis[i]) ++ans1,dfs(i,0);
cout<<min(ans1,ans0);
return 0;
}*/

cf734 E. Anton and Tree的更多相关文章

  1. Codeforces 734E. Anton and Tree 搜索

    E. Anton and Tree time limit per test: 3 seconds memory limit per test :256 megabytes input:standard ...

  2. 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 ...

  3. 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 ...

  4. Anton and Tree

    Anton and Tree 题目链接:http://codeforces.com/contest/734/problem/E DFS/BFS 每一次操作都可以使连通的结点变色,所以可以将连通的点缩成 ...

  5. Codeforces 734E Anton and Tree(缩点+树的直径)

    题目链接: Anton and Tree 题意:给出一棵树由0和1构成,一次操作可以将树上一块相同的数字转换为另一个(0->1 , 1->0),求最少几次操作可以把这棵数转化为只有一个数字 ...

  6. 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 ...

  7. 【27.91%】【codeforces 734E】Anton and Tree

    time limit per test3 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  8. Codeforces Round #379 (Div. 2) E. Anton and Tree

    题意: 给一颗树 每个节点有黑白2色 可以使一个色块同事变色,问最少的变色次数. 思路: 先缩点 把一样颜色的相邻点 缩成一个 然后新的树 刚好每一层是一个颜色. 最后的答案就是树的直径/2 不过我用 ...

  9. Codeforces734 E. Anton and Tree

    传送门:>Here< 题意:给出一颗树,节点不是黑色就是白色,每次可以将一个颜色相同的块变颜色,问最少变几次才能让其变为同色 解题思路: 我们考虑由于每一次都是把同样颜色的色块进行变色,因 ...

随机推荐

  1. jQuery常用及基础知识总结(一)

    Attribute: $(”p”).addClass(css中定义的样式类型); 给某个元素添加样式$(”img”).attr({src:”test.jpg”,alt:”test Image”}); ...

  2. http 安全验证

    今天升级Xcode 7.0 bata发现网络访问失败.输出错误信息 The resource could not be loaded because the App Transport Securit ...

  3. HDU 3743 Frosh Week(归并排序求逆序数)

    归并排序求逆序数 #include <iostream> #include <cstdio> using namespace std; #define maxn 1000005 ...

  4. FZU Problem 2221 RunningMan(贪心)

    一开始就跑偏了,耽误了很长时间,我和队友都想到博弈上去了...我严重怀疑自己被前几个博弈题给洗脑了...贪心的做法其实就是我们分两种情况,因为A先出,所以B在第一组可以选择是赢或输,如果要输,那直接不 ...

  5. 基于POI的Excel导入导出(JAVA实现)

    今天做了个excel的导入导出功能,在这记录下. 首先现在相关poi的相关jar包,资源链接:http://download.csdn.net/detail/opening_world/9663247 ...

  6. jQuery动态绑定

    一.原始需求 在实际项目的时候,遇到了一个问题,就是通过JS动态生成的元素,无法触发JS事件. 原始的JS代码: $(function () { $(".original").cl ...

  7. Windows下编译mxnet

    操作系统: 64位Windows10 mxnet的构建和安装包括两个步骤: 第一步,编译出共享库 libmxnet.dll. 第二步,安装语言包,比如python等. 最小编译要求: 最新的支持C++ ...

  8. 高并发数据库之MySql性能优化

    1.慢查询 SHOW VARIABLES LIKE '%quer%'

  9. 省市二级联动--使用app-jquery-cityselect.js插件

    只有省市二级联动,三级联动还没处理好,会尽快完善. 嵌入id: <div class="form-group"> <label>地址</label&g ...

  10. SQL truncate 、delete与drop区别

    SQL truncate .delete与drop区别 相同点: 1.truncate和不带where子句的delete.以及drop都会删除表内的数据. 2.drop.truncate都是DDL语句 ...