首页 > 其他分享 >2024.2.26模拟赛T1题解

2024.2.26模拟赛T1题解

时间:2024-02-26 21:11:44浏览次数:32  
标签:2024.2 int 题解 void 26 son fa hei las

题目

先建出圆方树,题目转换为数长度为 \(2*L-1\) 的路径数,长链剖分

code

#include<bits/stdc++.h>
using namespace std;
#define N 2000005
#define ll long long
int n,m,top,tot,cnt,L,k;
int dfn[N],low[N],zhan[N],h[N];
struct AB{
	int a,b,n;
}d[N*4];
void cun(int x,int y){
	d[++k]=(AB){x,y,h[x]},h[x]=k;
}
namespace CP{
	int k,h[N*2];
	AB d[N*4];
	int hei[N*2],son[N*2];
	ll *f[N*2],*las;
	ll pos[N*4],ans;
	void cun(int x,int y){
		d[++k]={x,y,h[x]},h[x]=k;
		d[++k]={y,x,h[y]},h[y]=k;
	}
	void dfs(int x,int fa){
		hei[x]=1;
		for(int i=h[x];i;i=d[i].n){
			int y=d[i].b;
			if(y==fa) continue;
			dfs(y,x);
			if(hei[y]+1>hei[x]) hei[x]=hei[y]+1,son[x]=y;
		}
	}
	void DP(int x,int fa){
		if(son[x]){
			f[son[x]]=f[x]+1;
			DP(son[x],x);
		}
		if(x<=n) f[x][1]=1;
		if(hei[x]>=L) ans+=f[x][L];
		for(int i=h[x];i;i=d[i].n){
			int y=d[i].b;
			if(y==fa||y==son[x]) continue;
			f[y]=las,las=las+hei[y]+1;
			DP(y,x);
			for(int j=1;j<=hei[y];j++){
				if(j<=L&&L-j<=hei[x]) ans+=f[y][j]*f[x][L-j];
			}
			for(int j=1;j<=hei[y];j++) f[x][j+1]+=f[y][j];
		}
	}
	void solve(){
		dfs(1,0);L=L*2-1;
		f[1]=pos;
		las=pos+hei[1]+1;
		DP(1,0);
		printf("%lld\n",ans*2);
	}
}
void dfs(int x){
	dfn[x]=low[x]=++tot,zhan[++top]=x;
	for(int i=h[x];i;i=d[i].n){
		int y=d[i].b;
		if(!dfn[y]){
			dfs(y);
			low[x]=min(low[x],low[y]);
			if(low[y]==dfn[x]){
				cnt++;
				while(zhan[top]!=y) CP::cun(cnt,zhan[top]),top--;
				CP::cun(cnt,y),top--,CP::cun(cnt,x);
			}
		}
		else low[x]=min(low[x],dfn[y]);
	}
}
inline int read(){
	int num=0;
	char c=getchar();
	while(c<'0'||c>'9') c=getchar();
	while('0'<=c&&c<='9') num=num*10+c-'0',c=getchar();
	return num;
}
int main(){
	freopen("sing.in","r",stdin);
	freopen("sing.out","w",stdout);
	scanf("%d%d%d",&n,&m,&L);
	cnt=n;
	for(int i=1,x,y;i<=m;i++){
		x=read(),y=read();
		cun(x,y),cun(y,x);
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i]) dfs(i);
	}
	CP::solve();
	return 0;
}

标签:2024.2,int,题解,void,26,son,fa,hei,las
From: https://www.cnblogs.com/hubingshan/p/18035191

相关文章

  • P7154 Sleeping Cows 题解
    传送门题意:给定两个数组\(a_i,b_i\),若\(a_i\leb_j\),则他俩可配对。求极大匹配的方案数。(极大不是最大,最大一定是极大)先考虑最大匹配方案数怎么求。把\(a\)和\(b\)从小到大排序。则每个\(a_i\)能匹配的\(b\)都是一段后缀,且随着\(i\)增大,这个后缀越来越小。于是从......
  • 91st 2024/2/26 省选联赛训练-1st
    迟来的新年快乐!这次的机会挺难得的,初三了,好说歹说从学校里跑出来训练了,就一定要珍惜时间进入正题今天的比赛难度高,但也没有省选那么难属于是思路比较难想那类T1题目有些疑惑,但总体表达还可,应该是太久没接触这种表达较专业的题目而一时难以适应看题需要认真且专心调代码时状......
  • AC475A 2024省选联测26 博弈
    题意两个人在一张DAG上移动棋子,每个格子的颜色为黑/白。每次操作可以移动一个格子颜色和自己相同的棋子。不能走的人输掉游戏。先手为白色,问所有放棋子的\(2^n\)种方案,先手必胜有多少。Sol不难发现,自己颜色内的棋子不会被对方偷走,也就是说,想控制所有棋子使得对方判负,......
  • P4708 画画 题解
    先叠层甲。此解法非本题正解如果想看正解可以去看上面\(Sdchr\)或\(Log_x\)大佬的。第一眼看到此题,\(N\)个点的无标号的每个连通块有欧拉回路的图的个数。这不就是\(N\)阶赛德尔矩阵的个数吗?什么?你不知道赛德尔矩阵是什么。没关系。这东西是个很小众的东西。百度上都......
  • 2..3...4.... Wonderful! Wonderful! 题解
    2..3...4....Wonderful!Wonderful!题目描述​ 有一个元素等于其下标的数组,长度为n,对于属于区间\([1,(n-1)/2]\)的每一个数,我们称其为k,我们可以对数组进行任意次数的操作。​ 操作:选择长度为\(2*k+1\)的子序列,然后只留下最中间的那个数,删掉其他的元素。​ 我们想知道对于每个......
  • 2024-02-26 闲话
    Course不是UndergraduateResearch.Plug-and-PlayKnowledgeInjectionforPre-trainedLanguageModels建议以后写完文章拿ChatGPT跑一遍语法错误metioned不是mentions谢谢。设计了“plug-and-play”的paradigm。下文记作pap范式主打map-tuning。有一......
  • QT多线程实现-----问题解决及实现方式
    一、概述恰巧正在做一个多线程通信的项目,具体功能是与下位机交互和文件发送,在子线程中实现命令发送和文件传输。使用movetothread主要遇到以下几个问题:1.Socketnotifierscannotbeenabledordisabledfromanotherthread。2.子线程完成文件传输,发送信号......
  • 部署K8S-1-26
    DEVops入门1部署K8S1.1节点准备节点名ip功能k8s-master10.0.0.153k8s-node110.0.0.154k8s-node210.0.0.1551.2初始操作在所有节点执行#1关闭防火墙systemctldisablefirewalldsystemctlstopfirewalldfirewall-cmd--state#2关闭seli......
  • P1119 灾后重建题解
    目录思路代码\(原题传送门\)思路首先先来分析一下算法,Floyd算法的时间复杂度是\(O(n^3)\)虽然很多,但在这一题里很合适。dijkstra算法用堆优化的时间复杂度是\(O(m\logn)\),在这一题里会超时。Bellman–Ford算法的时间复杂度是\(O(mn)\),会超时。所以说这一题是能用Flo......
  • 近期总结 2024.2.19
    ARC098DDonation题意:一张无向连通图,\(n\)个点\(m\)条边。你一开始选择任意一个点开始走,到达点\(u\)时,要求你必须有\(a_u\)元,且可以在点\(u\)捐赠\(b_u\)元。可以以任意一点结束,求在所有点捐赠一次的前提下,你的最小初始钱数。\(1\len\len,m\le10^5\)考虑倒着来,......