点分治/贪心

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

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

还有一种贪心的方法,每种颜色必然选以某点为根最深的节点,计算出最深的节点,然后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. python链家网高并发异步爬虫and异步存入数据

    python链家网二手房异步IO爬虫,使用asyncio.aiohttp和aiomysql 很多小伙伴初学python时都会学习到爬虫,刚入门时会使用requests.urllib这些同步的库进行单线 ...

  2. Oracle 实现查询不区分大小写(SQL实现)

    转为小写  LOWER('ABC') 结果 abc转为大写  UPPER('aBc') 结果 ABC 将数据库字段数据和前台接受的值全部转换为大写或者小写 例: select * from table ...

  3. fd最大值和限制

    fd的数量决定了fd的最大值 在Linux下,系统全部能够打开的fd总数为: /proc/sys/fs/file-max,取决于内存 The file-max file /proc/sys/fs/fi ...

  4. MySQL查看表结构及查看建表语句

    查看表结构:desc 表名 mysql> use recommend; Database changed mysql> desc user; +--------------+------- ...

  5. android中webview的实现

    设置从当前页面打开链接,而不是跳转到系统默认浏览器打开: webview.setWebViewClient(new WebViewClient(){ @Override public boolean ...

  6. Linux下Apache服务部署静态网站------网站服务程序

    文章链接(我的CSDN博客): Linux下Apache服务部署静态网站------网站服务程序

  7. zoj3988 Prime Set

    思路不难想到二分图求个最大匹配P,若P>=K,则2*K即可,否则应为P*2+min(K-P,未匹配且有度数不为0的顶点个数s).但坑点在于有1的情况,所以如果直接建二分图去跑最大匹配会因为1的影 ...

  8. hibernate详解一

    hibernate介绍 hibernate是一个开源的轻量级的框架, hibernate框架应用在javaee三层结构中的dao层框架,在dao层对数据库进行crud操作,使用hibernate框架实 ...

  9. Windows7下ftp服务器

    1. 创建用户 2. 创建ftp服务 3. 管理ftp站点 4. 权限编辑 5. 绑定iP和端口 6. 访问 7. Java代码上传文件 import java.io.File; import jav ...

  10. Vue.js父子通信之所有方法和数据共享

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...