10.23联考

fib

发现f[45]已经大于10的9次方了,我们可以O(45*45)暴力计算斐波那契数两两乘积,再判断询问的数是否在其中。

一样远

先找到以A和B为端点的树链上的中点,若点数是偶数则直接输出0,否则分两种情况:第一种A和B的最近公共祖先是中点时答案为n-size[fx]-size[fy],fx表示从x向上跳,跳到距离lca

为1的地方。第二种情况是中点不是lca时,答案为size[fa[fx][0]]-size[fx]。

#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
using namespace std;
int getint()
{
	int i=0,f=1;char c;
	for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar());
	if(c=='-')f=-1,c=getchar();
	for(;c>='0'&&c<='9';c=getchar())i=(i<<3)+(i<<1)+c-'0';
	return i*f;
}
const int N=100005;
int n,m;
int tot,first[N],nxt[N<<1],to[N<<1];
int fa[N][20],dep[N],size[N];
void add(int x,int y)
{
	nxt[++tot]=first[x],first[x]=tot,to[tot]=y;
}

void dfs(int u)
{
	for(int i=1;i<20;i++)fa[u][i]=fa[fa[u][i-1]][i-1];
	size[u]=1;
	for(int e=first[u];e;e=nxt[e])
	{
		int v=to[e];
		if(v!=fa[u][0])
		{
			fa[v][0]=u;
			dep[v]=dep[u]+1;
			dfs(v);
			size[u]+=size[v];
		}
	}
}
int jump(int u,int delta)
{
	for(int i=19;i>=0;i--)
	{
		if(delta>=(1<=0;i--)
		if(fa[x][i]!=fa[y][i])
			x=fa[x][i],y=fa[y][i];
	return x==y?x:fa[x][0]; 
}

void solve(int x,int y)
{
	if(x==y)
	{
		cout<
折网线
贪心:两两匹配一定是最优的,若企鹅个数k为偶数且匹配的对数大于k,输出k/2,若k为奇数则输出k/2+1。.
若匹配对数*2小于k,多出的企鹅就每一个增加一条边与当前已经两两匹配成功的点对连上,及输出(k-num*2)+num。
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int N =100005;
int t,n,k,x,tot,num;
int first[N],sze[N],next[N*2],to[N*2];
void add(int x,int y)
{
	next[++tot]=first[x];
	first[x]=tot;
	to[tot]=y;
}
void dfs(int x,int fa)
{
	sze[x]=1;
	for(int i=first[x];i;i=next[i])
	{
		int v=to[i];
        if(v!=fa)
        {
        	dfs(v,x);
        	sze[x]+=sze[v];
        }
	}
	if(sze[x]>=2)
	{
		num++;
		sze[x]=0;
	}
}
int main()
{
	//freopen("k.in","r",stdin);
	//freopen("k.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cin>>t;
	while(t--)
	{
		tot=num=0;
	    memset(sze,0,sizeof(sze));
	    memset(first,0,sizeof(first));
	    memset(next,0,sizeof(next));
	    memset(to,0,sizeof(to));
	    cin>>n>>k;
	    for(int i=1;i>x;
	    	add(x,i+1);
	    	add(i+1,x);
	    }
	    dfs(1,0);
	    if(k<=num*2)
	    cout<

 
  

 
  
 
  
 
  
 
  

你可能感兴趣的:(10.23联考)