点分治/贪心

对于点分治的理解不够深刻...点分治能统计树上每个点对的信息,那么这里就是统计同种颜色点对之间的最大距离,自然可以用点分

然后点分,每次统计最大距离,但是略微卡常...

还有一种贪心的方法,每种颜色必然选以某点为根最深的节点,计算出最深的节点,然后dfs,看每种颜色,然后和最深的节点计算距离

#include<bits/stdc++.h>
using namespace std;
const int N = ;
int n, top, root, k, top1;
vector<int> G[N];
int size[N], mx[N], mark[N], ans[N], st[N], st1[N], c[N], a[N], mx_deep[N], now_deep[N], vis[N], vis1[N];
namespace IO
{
const int Maxlen = N * ;
char buf[Maxlen], *C = buf;
int Len;
inline void read_in()
{
Len = fread(C, , Maxlen, stdin);
buf[Len] = '\0';
}
inline void fread(int &x)
{
x = ;
int f = ;
while (*C < '' || '' < *C) { if(*C == '-') f = -; ++C; }
while ('' <= *C && *C <= '') x = (x << ) + (x << ) + *C - '', ++C;
x *= f;
}
inline void read(int &x)
{
x = ;
int f = ; char c = getchar();
while(c < '' || c > '') { if(c == '-') f = -; c = getchar(); }
while(c >= '' && c <= '') { x = (x << ) + (x << ) + c - ''; c = getchar(); }
x *= f;
}
inline void read(long long &x)
{
x = ;
long long f = ; char c = getchar();
while(c < '' || c > '') { if(c == '-') f = -; c = getchar(); }
while(c >= '' && c <= '') { x = (x << 1ll) + (x << 3ll) + c - ''; c = getchar(); }
x *= f;
}
} using namespace IO;
void findroot(int u, int last, int tot)
{
size[u] = ;
mx[u] = ;
for(int i = ; i < G[u].size(); ++i)
{
int v = G[u][i];
if(v == last || mark[v]) continue;
findroot(v, u, tot);
size[u] += size[v];
if(size[v] > mx[u]) mx[u] = size[v];
}
mx[u] = max(mx[u], tot - mx[u]);
if(mx[u] < mx[root]) root = u;
}
void dfs(int u, int last, int deep)
{
if(mx_deep[a[u]] == -) st[++top] = a[u];
mx_deep[a[u]] = max(mx_deep[a[u]], deep);
for(int i = ; i < G[u].size(); ++i)
{
int v = G[u][i];
if(v == last || mark[v]) continue;
dfs(v, u, deep + );
}
}
int get_size(int u, int last)
{
int ret = ;
for(int i = ; i < G[u].size(); ++i)
{
int v = G[u][i];
if(v == last || mark[v]) continue;
ret += get_size(v, u);
}
return ret;
}
void divide(int u)
{
root = ;
findroot(u, , get_size(u, ));
mark[root] = ;
now_deep[a[root]] = ;
st1[++top1] = a[root];
for(int i = ; i < G[root].size(); ++i)
{
int v = G[root][i];
if(mark[v]) continue;
dfs(v, root, );
if(mx_deep[a[root]] == -) st[++top] = a[root], mx_deep[a[root]] = ;
for(int j = top; j; --j) if(now_deep[st[j]] != -) ans[st[j]] = max(ans[st[j]], now_deep[st[j]] + mx_deep[st[j]]);
while(top)
{
if(now_deep[st[top]] == -) st1[++top1] = st[top];
now_deep[st[top]] = max(now_deep[st[top]], mx_deep[st[top]]);
mx_deep[st[top--]] = -;
}
}
while(top1) now_deep[st1[top1--]] = -;
for(int i = , now = root; i < G[now].size(); ++i)
{
int v = G[now][i];
if(mark[v]) continue;
divide(v);
}
}
int main()
{
memset(now_deep, -, sizeof(now_deep));
memset(mx_deep, -, sizeof(mx_deep));
read_in();
fread(n);
fread(k);
for(int i = ; i <= n; ++i)
{
int u;
fread(a[i]);
fread(u);
if(u) { G[u].push_back(i); G[i].push_back(u); }
}
mx[] = << ;
divide();
for(int i = ; i <= k; ++i) printf("%d\n", ans[i]);
return ;
}

bzoj1776的更多相关文章

  1. 【BZOJ1776】[Usaco2010 Hol]cowpol 奶牛政坛 树的直径

    [BZOJ1776][Usaco2010 Hol]cowpol 奶牛政坛 Description 农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N. ...

  2. [BZOJ1776][Usaco2010 Hol]cowpol 奶牛政坛

    Description 农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N.恰好有N-1条单位长度的双向道路,用各种各样的方法连接这些草地.而且从每片 ...

  3. [bzoj1776][Usaco2010 Hol]cowpol 奶牛政坛_倍增lca

    [Usaco2010 Hol]cowpol 奶牛政坛 题目大意: 数据范围:如题面. 题解: 第一想法是一个复杂度踩标程的算法..... 就是每种政党建一棵虚树,然后对于每棵虚树都暴力求直径就好了,复 ...

  4. 【刷题记录】BZOJ-USACO

    接下来要滚去bzoj刷usaco的题目辣=v=在博客记录一下刷题情况,以及存一存代码咯.加油! 1.[bzoj1597][Usaco2008 Mar]土地购买 #include<cstdio&g ...

随机推荐

  1. linux目录文件操作

    一.linux系统目录结构 1.顶层根目录 顶层根目录使用 “/”来表示 2.linux中的一些重要目录 (1)bin目录 放置常用的可执行文件(其中ls命令位列其中) (2)sbin目录 放置系统的 ...

  2. 技能CD 效果 shader

    技能CD特效 这个效果主要是利用反正切函数完成.atan2(x,y)的返回值是[-PI,PI],这个支持4个象限的反正切函数.关于圆角计算,在上篇文章中有介绍. 现在,我们来看看反正切函数的效果: 在 ...

  3. angular(转)

    学习之前可以看看 知乎上讨论angularjs优缺点 帮你选择框架的网站 同类主流框架对比 教程 angularjs在慕课网 angularjs在51cto angularjs在图灵社区 社区 Ang ...

  4. 全排列函数 nyoj 366(next_permutation()函数)

    C++ STL中提供了std::next_permutation与std::prev_permutation可以获取数字或者是字符的全排列,其中std::next_permutation提供升序.st ...

  5. vue2.0一个书城实例

    gitHub克隆地址 git clone https://github.com/Webxiaoyaun/vue-book.git 点击去Github下载 ## 一个书城 ## 有增加,修改,缓存,懒加 ...

  6. 2018/2/14 x-pack的学习

    x-pack是什么?它能提供的作用如下,下面描述的这些功能都属于x-park:Shield: 提供对数据的 Password-Protect,以及加密通信.基于角色的权限控制,IP 过滤,审计,可以有 ...

  7. Ubuntu 16.04粘贴板增强工具Diodon

    相比Parcellite(http://www.cnblogs.com/EasonJim/p/7119308.html),Diodon可以支持图片. 安装: sudo add-apt-reposito ...

  8. Django学习系列之中间件

    中间件的定义 中间件是一个.一个的管道,如果相对任何所有的通过Django的请求进行管理都需要自定义中间件 中间件可以对进来的请求和出去的请求进行控制 中间件是一类 django请求生命周期 自定义中 ...

  9. Swift开发iOS项目实战视频教程(一)---iOS真简单

    本课主要介绍iOS项目的创建.第一个iOS项目的开发.UILabel.UIButton的使用. 假设你看完此视频还认为iOS非常难,请你来找我! 本教程摒弃枯燥的语法和知识解说,全是有趣有料的项目实战 ...

  10. mysql正则表达式及应用

    mysql where子句的模式匹配 今天在应用中遇到了这样的一个问题,有一个字段 t1,其中的值类似于:1,1,1,2,3,3,4,4,5,5,2,4,3,2,1,2 需要从里面搜索出比如说:第一个 ...