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

(假设已经缩好了点,每次边中间颜色不同的,然后和就和他外面的相同,继续再变这个大的,依次类推,最多就是树的直径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. SQL Server2008数据库中删除用户,提示数据库主体在该数据库中拥有 架构,无法删除

    一个数据库,运行在SQL Server 2008下,数据库用户无法删除,在删除时提示“数据库主体在该数据库中拥有架构,无法删除”.原因很简单,就是由于此用户在数据库中拥有某些架构的所有权,将相关架构的 ...

  2. Warning: The Copy Bundle Resources build phase contains this target's Info.plist file 'yintingting_baisi/Info.plist'.

    处理方法: The INFOPLIST_FILE build setting specifies the name of the Info.plist associated with your tar ...

  3. CentOS 在同一窗口打开文件夹

    1.打开一个文件夹 2.编辑 - 首选项 - 行为,勾选“总是在浏览器窗口打开”,点击关闭.

  4. [转]异常:android.os.NetworkOnMainThreadException

    Android 4.1项目:使用新浪微博分享时报: android.os.NetworkOnMainThreadException 网上搜索后知道是因为版本问题,在4.0之后在主线程里面执行Http请 ...

  5. iptables-过滤61开头的ip数据包

    iptables -F root@android:/system/bin # iptables -L -n iptables -L -n Chain INPUT (policy ACCEPT) tar ...

  6. hudson--ant编写记录

    最近配置Hudson---持续集成工具,重点是ant的编写. 环境:Ubuntu 虚拟机 hudson系统设置里面jdk ant路径也是Ubuntu里文件路径如:/home/test/java/ant ...

  7. Linux:crontab的安装以及使用方法

    安装crontab: [root@wulaoer ~]# yum install vixie-cron [root@wulaoer ~]# yum install crontabs 说明:vixie- ...

  8. Windows系统字体与文件对照表

    源:Windows系统字体与文件对照表 宋体 (TrueType) = SIMSUN.TTF 黑体 (TrueType) = simhei.ttf 楷体_GB2312 (TrueType) = sim ...

  9. JavaScript 中实现继承的方式(列举3种在前一章,我们曾经讲解过创建类的最好方式是用构造函数定义属性,用原型定义方法。)

    第一种:对象冒充 function ClassA(sColor) { this.color = sColor; this.sayColor = function () { alert(this.col ...

  10. OpenCV学习(20) grabcut分割算法

    http://www.cnblogs.com/mikewolf2002/p/3330390.html OpenCV学习(20) grabcut分割算法 在OpenCV中,实现了grabcut分割算法, ...