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

(假设已经缩好了点,每次边中间颜色不同的,然后和就和他外面的相同,继续再变这个大的,依次类推,最多就是树的直径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. Block 使用场景

    转载自:http://blog.csdn.net/totogo2010/article/details/7839061 代码块本质上是和其他变量类似.不同的是,代码块存储的数据是一个函数体.使用代码块 ...

  2. JAVA实现二进制,十六进制输出

    public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-gener ...

  3. Mybatis的<where><foreach><set>等标签详解

    sql语句where条件中,需要一些安全判断,例如按性别检索,如果传入的参数是空的,此时查询出的结果很可能是空的,也许我们需要参数为空 时,是查出全部的信息.这是我们可以使用动态sql,增加一个判断, ...

  4. ajax编程**

    ajax 编程 *step1获得 XmlHttpRequest 对象.该对象由浏览器提供,但是该类型并没有标准化.ie 和其它浏览器不同,其它浏览器都支持该类型,而 ie 不支持. function ...

  5. WebDriver(Selenium2) 判断页面是否刷新的方法

    http://uniquepig.iteye.com/blog/1568208 public static boolean waitPageRefresh(WebElement trigger) { ...

  6. JS对象引用

    对象和函数都是引用的关系(改变后者会改变前者) 但是下面这个列子情况不一样了.刚开始的时候 B 引用了 A的地址,后来B又重新赋值,新占了一个地址,A   B俩的关系已经脱离. 那么有的时候,我们只有 ...

  7. 在Android上实现SSL握手(客户端需要密钥和证书),实现服务器和客户端之间Socket交互

    Android的私钥和信任证书的格式必须是BKS格式的,通过配置本地JDK,让keytool可以生成BKS格式的私钥和信任证书,java本身没有BouncyCastle密库 服务端: Java代码  ...

  8. Bootstrap-dialog的使用(续Bootstrap Table)

    Bootstrap-dialog实现表格内容的增,删,改. 插件引入:必须先引入jquery和bootstrap和artTemplate. <link rel="stylesheet& ...

  9. jquery 如何动态添加、删除class样式方法介绍_jquery_脚本之家

    获取与设置样式 获取class和设置class都可以使用attr()方法来完成.例如使用attr()方法来获取p元素的class 取与设置样式 获取class和设置class都可以使用attr()方法 ...

  10. curl调用openstack API总结

    curl命令是Linux下一个可以使用多种协议收发数据的工具,包括http协议.openstack的API接口都是URL地址:http://controller:35357/v3可以使用curl命令进 ...