Wannafly挑战赛1 C MMSet2 虚树
题目链接:https://www.nowcoder.com/acm/contest/15/C
思路:虚树,取两点间的lca,构造成一颗新的树;求(直径+1)/2即可
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<queue>
#include<algorithm>
#include<stack>
#include<cstring>
#include<vector>
#include<list>
#include<set>
#include<map>
#include<bitset>
#include<time.h>
using namespace std;
#define LL long long
#define pi (4*atan(1.0))
#define eps 1e-8
#define bug(x) cout<<"bug"<<x<<endl;
const int N=3e5+,M=1e6+,inf=1e9+,MOD=1e9+;
const LL INF=1e18+,mod=1e9+; struct edge
{
int v,next;
}edge[N<<];
int head[N],fa[N][],edg,deep[N];
int in[N],out[N],tot;
void init()
{
memset(head,-,sizeof(head));
edg=;tot=;
}
void add(int u,int v)
{
edg++;
edge[edg].v=v;
edge[edg].next=head[u];
head[u]=edg;
}
void dfs(int u,int fat)
{
tot++;
in[u]=tot;
for (int i=; i<= ;i++)
fa[u][i] = fa[fa[u][i-]][i-];
for (int i=head[u];i!=-;i=edge[i].next)
{
int v=edge[i].v;
if(v==fat) continue;
deep[v]=deep[u]+;
fa[v][]=u;
dfs(v,u);
}
out[u]=tot;
}
int RMQ_LCA(int x,int y) {
if(deep[x]<deep[y]) swap(x,y);
int d=deep[x]-deep[y];
for (int i=; i<= ;i++)
if((<<i)&d) x=fa[x][i];
for (int i=; i>= ;i--) {
if(fa[x][i]!=fa[y][i]) {
x=fa[x][i];y=fa[y][i];
}
}
if(x==y) return x;
else return fa[x][];
} int h[M],ans,far,pos;
struct f
{
int v,w,nex;
}edge2[N<<];
int head2[N],edg2;
void add2(int u,int v,int w)
{
edge2[++edg2]=(f){v,w,head2[u]};
head2[u]=edg2;
}
bool cmp(int u, int v) {
return in[u] < in[v];
}
bool check(int u, int v) {
return in[u] <= in[v] && in[v] <= out[u];
}
int build(int A[], int tot) {
std::sort(A + , A + + tot, cmp);
for(int i = , old_tot = tot; i <= old_tot; i++) {
A[++tot] = RMQ_LCA(A[i - ], A[i]);
}
std::sort(A + , A + + tot, cmp);
tot = std::unique(A + , A + + tot) - A - ; std::stack<int> S; S.push(A[]);
for(int i = ; i <= tot; i++) {
while(!S.empty() && !check(S.top(), A[i])) S.pop();
int u = S.top(), v = A[i];
add2(u,v,deep[v]-deep[u]);
add2(v,u,deep[v]-deep[u]);//u, v, deep[v] - deep[u]);
S.push(v);
}
return tot;
}
void dfs1(int u,int fa,int val)
{
if(val>far)far=val,pos=u;
for(int i=head2[u];i!=-;i=edge2[i].nex)
{
int v=edge2[i].v;
int w=edge2[i].w;
if(v==fa)continue;
dfs1(v,u,val+w);
}
}
void dfs2(int u,int fa,int val)
{
ans=max(ans,val);
for(int i=head2[u];i!=-;i=edge2[i].nex)
{
int v=edge2[i].v;
int w=edge2[i].w;
if(v==fa)continue;
dfs2(v,u,w+val);
}
}
int main()
{
init();
memset(head2,-,sizeof(head2));
int n;
scanf("%d",&n);
for(int i=;i<n;i++)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v);add(v,u);
}
dfs(,);
int q;
scanf("%d",&q);
while(q--)
{
edg2=far=pos=ans=;
int t;
scanf("%d",&t);
for(int i=;i<=t;i++)
scanf("%d",&h[i]);
t = build(h, t);
dfs1(h[],,);
dfs2(pos,,);
printf("%d\n",(ans+)/);
for(int i=;i<=t;i++)
head2[h[i]]=-;
}
return ;
}
;
Wannafly挑战赛1 C MMSet2 虚树的更多相关文章
- Wannafly挑战赛18 E 极差(线段树、单调栈)
Wannafly挑战赛18 E 极差 题意 给出三个长度为n的正整数序列,一个区间[L,R]的价值定义为:三个序列中,这个区间的极差(最大值与最小值之差)的乘积. 求所有区间的价值之和.答案对\(2^ ...
- Wannafly挑战赛2_D Delete(拓扑序+最短路+线段树)
Wannafly挑战赛2_D Delete Problem : 给定一张n个点,m条边的带权有向无环图,同时给定起点S和终点T,一共有q个询问,每次询问删掉某个点和所有与它相连的边之后S到T的最短路, ...
- 【Wannafly挑战赛29F】最后之作(Trie树,动态规划,斜率优化)
[Wannafly挑战赛29F]最后之作(Trie树,动态规划,斜率优化) 题面 牛客 题解 首先考虑怎么计算\([l,r]\)这个子串的不同的串的个数. 如果\(l=1\),我们构建\(Trie\) ...
- 牛客wannafly 挑战赛14 B 前缀查询(trie树上dfs序+线段树)
牛客wannafly 挑战赛14 B 前缀查询(trie树上dfs序+线段树) 链接:https://ac.nowcoder.com/acm/problem/15706 现在需要您来帮忙维护这个名册, ...
- 良心送分题(牛客挑战赛35E+虚树+最短路)
目录 题目链接 题意 思路 代码 题目链接 传送门 题意 给你一棵树,然后把这棵树复制\(k\)次,然后再添加\(m\)条边,然后给你起点和终点,问你起点到终点的最短路. 思路 由于将树复制\(k\) ...
- HDU-6035:Colorful Tree(虚树+DP)
这里有三道长得像的题: 一:HDU6036: There is a tree with nn nodes, each of which has a type of color represented ...
- Wannafly挑战赛27
Wannafly挑战赛27 我打的第一场$Wannafly$是第25场,$T2$竟然出了一个几何题?而且还把我好不容易升上绿的$Rating$又降回了蓝名...之后再不敢打$Wannafly$了. 由 ...
- Wannafly 挑战赛 19 参考题解
这一次的 Wannafly 挑战赛题目是我出的,除了第一题,剩余的题目好像对大部分算法竞赛者来说好像都不是特别友好,但是个人感觉题目质量还是过得去的,下面是题目链接以及题解. [题目链接] Wanna ...
- Wannafly挑战赛22游记
Wannafly挑战赛22游记 幸运的人都是相似的,不幸的人各有各的不幸. --题记 A-计数器 题目大意: 有一个计数器,计数器的初始值为\(0\),每次操作你可以把计数器的值加上\(a_1,a_2 ...
随机推荐
- AngularJS简单例子
双大括号标记{{}}绑定的表达式 <html ng-app> <script src="http://code.angularjs.org/angular-1.0.1.mi ...
- 干了这杯Java之HashMap
类: public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneab ...
- sql 生成随机字符串
生成三位随机字母+12位数字 ),), @c int; select @CardCode=abs(CHECKSUM(NEWID())) -LEN(@CardCode); ,@c)) set @Card ...
- Python之jinja2
jinja2简介 python的模板引擎,设计思想来自与django的模板引擎,和其非常相似 pip install jinjia2 pip install MakeupSafe #模块加载 from ...
- Python记录wsgi
类实现wsgi app from wsgiref.util import setup_testing_defaults from wsgiref.simple_server import make_s ...
- 记录心得-FastJson分层解析demo示例
记录一下,平时用到,可速查!关键: // startArray(); 开始解析数组 // endArray(); 结束解析数组 // startObject(); 开始解析键值对 // endObje ...
- TTL与非门电路的工作原理
分立元件门电路虽然结构简单,但是存在着体积大.工作可靠性差.工作速度慢等许多缺点.1961年美国德克萨斯仪器公司率先将数字电路的元器件和连线制作在同一硅片上,制成了集成电路.由于集成电路体积小.质量轻 ...
- vue.js国际化vue-i18n插件的使用问题,在模版文本、组件方法、jsf方法里的使用
vue.js国际化vue-i18n插件的使用问题,在模版文本.组件方法.jsf方法里的使用 1.在文本里使用{{$t("xxx")}} <span>{{$t(" ...
- inodes 相关信息查看
查看inode数量 df -ih 查看磁盘信息 tune2fs -l /dev/sdc1 查看相关目录信息 /data/osd.3/bean_test/7/8/9# debugfs /dev/sdc2 ...
- 单点登录系统和CAS的简介
---恢复内容开始--- 什么是单点登录? 单点登录(Single Sign On),简称为SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以 ...