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

(假设已经缩好了点,每次边中间颜色不同的,然后和就和他外面的相同,继续再变这个大的,依次类推,最多就是树的直径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. ajax 跨域请求资源问题

    其实相当的简单:只需要在服务端设置一下响应头: header("Access-Control-Allow-Origin: *");就可以了!! nice,有木有? 下面两句也可以带 ...

  2. FusionCharts使用问题及解决方法(四)-FusionCharts常见问题大全

    在前3篇文章中,我们总结了FusionCharts图表的一些常见问题(FAQ)及解决方法,本文继续讨论FusionCharts使用者常见的一些复杂的报错及解决方法. 问题描述:使用FusionChar ...

  3. Beautiful Subarrays

    Beautiful Subarrays time limit per test 3 seconds memory limit per test 512 megabytes input standard ...

  4. drawRect & 内存 -> 深究

    转载自:http://bihongbo.com/2016/01/03/memoryGhostdrawRect/ 在平日的开发中,随意覆盖drawRect方法,稍有不慎就会让你的程序内存暴增.下面我们来 ...

  5. WeakSelf和StrongSelf

    转载自:http://sherlockyao.com/blog/2015/08/08/weakself-and-strongself-in-blocks/ 现在我们用 Objective-C 写代码时 ...

  6. JSP中EL表达式取值问题记录(已解决)

    ***************************2015-10-28 22:21************************* 问题描述如下: 在当前的jsp页面已经有了如下代码: < ...

  7. SQLSERVER设置行号

    select row_number()over(order by columnname)as rownum,* from tablename 按照columnname列进行排列

  8. bootstrap中的居左和居右

    1.pull-left和pull-right 2.text-left.text-center和text-right

  9. hibernate--多对多单向关联 (重点!!!)

    老师和学生的关系, 一个老师对多个学生, 一个学生也对应多个老师. 数据库会需要3个表, 一个老师表, 一个学生表, 一个老师对应学生表. 单向: 老师知道自己有多少学生, 但是学生不知道自己有多少个 ...

  10. Oracle教程-安装、结构(一)

    本文安装的是Oracle中的11G版本 一. 将文件win32_11gR2_database_1of2.zip和win32_11gR2_database_2of2.zip解压. 注意:这两个文件解压到 ...