向万能的谷民们求助
查看原帖
向万能的谷民们求助
181845
luozhichen楼主2022/1/24 10:27
#include<bits/stdc++.h>
using namespace std;
const int MX = 100010;
int n,k,ans,m;
struct GRAPH
{
	int fst[MX],nxt[MX],v[MX],lnum;
	void add(int nu,int nv)
	{
		nxt[++lnum] = fst[nu];
		fst[nu] = lnum;
		v[lnum] = nv;
	}
}G;
inline void swap(int &a,int &b)
{
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
}
inline int max(int a,int b){
	return a > b ? a : b;
}
struct CHAIN
{
	int root;//所在根节点 
	int siz[MX];//子树大小 
	int dep[MX];//当前深度 
	int fa[MX];//树上的父亲 
	int top[MX];//所在重链的顶部 
	int son[MX];//重儿子
	int yl[MX];
	inline void dfs1(int x,int f,int d){
		dep[x] = d;
		siz[x] = 1;
		fa[x] = f;
		for(register int i = G.fst[x]; i;i = G.nxt[i])
		{
			int y = G.v[i];
			if(y == f) continue;
			dfs1(y,x,d+1);
			siz[x] += siz[y];
			if(siz[son[x]] < siz[y])
			{
				son[x] = y;
			}
		}
	}
	inline void dfs2(int x,int f,int t)
	{
		//cout << x << " " << f  << " " << t << endl;
		top[x] = t;
		if(son[x]) dfs2(son[x],x,t);
		for(register int i = G.fst[x]; i; i=G.nxt[i])
		{
			int y = G.v[i];
			if(y == f || y == son[x]) continue;
			dfs2(y,x,y);
		}
		//cout <<"asd";
	}
	inline int lca(int x,int y)
	{
		register int fx = top[x],fy = top[y];
		while(fx != fy)
		{
			if(dep[fx] < dep[fy]) swap(fx,fy),swap(x,y);
			x = fa[x],fx = top[x];
		}
		if(dep[x] > dep[y]) return y;
		else return x;
	}
	inline void dfs3(int s,int fath)
	{
		for(register int i = G.fst[s]; i;i = G.nxt[i])
		{
			//cout << G.nxt[i] << endl;
			int y = G.v[i];
			//break;
			if(y == fath)
			{
				continue;	
			}
			dfs3(y,s);
			yl[s] += yl[y];
			//break;
		}
		ans = max(ans,yl[s]);
	}
} C;
char buf[1<<21], *p1 = buf, *p2 = buf;//好大的数组 
inline char gc() {//代替getchar 
    if(p1 != p2){
		return *p1++;
	} 
    p1 = buf;
    p2 = p1 + fread(buf, 1, 1 << 21, stdin);
    return p1 == p2 ? EOF : *p1++;
}
template<class I>//什么整数类型的都行 
inline void read(I &x) {//只可惜要用文件输入才有效 
    x = 0; I f = 1; char c = gc();
    while(c < '0' || c > '9'){
		if(c == '-'){
			f = -1;
			c = gc();//c 是输入的 
		} 
	}
    while(c >= '0' && c <= '9'){
		//x = x * 10 + c - '0';
		x = (x << 3) + (x << 1) + c - '0';//就相当于x * 10 +…… 
		c = gc();//再次输入 
	}
    x *= f;
}
inline void write(int x) {
  static int sta[35];
  register int top = 0;
  do {
    sta[top++] = x % 10,x /= 10;
  } while (x);
  while (top) putchar(sta[--top] + 48);
}
inline void input()
{
	read(n),read(k);
	register int x,y;
	for(register int i = 1;i < n;++i)
	{
		read(x),read(y);
		G.add(x,y);
		G.add(y,x);
	}
}
inline void work()
{
	C.dfs1(1,0,1);
	C.dfs2(1,0,1);
	//cout <<"Asd";
	for(register int i=1;i<=k;++i)
	{
		register int x,y;
		read(x),read(y);
		++C.yl[x];
		++C.yl[y];
		register int xx = C.lca(x,y);
		--C.yl[xx];
		--C.yl[C.fa[xx]];
	}
	C.dfs3(1,0);
	write(ans);
}
int main()
{
	input();
	work();
	return 0;
}

为什么过不了,就一个点T,超了0.03S

2022/1/24 10:27
加载中...