首页 > 其他分享 >2022杭电多校第十场7、3、9、4

2022杭电多校第十场7、3、9、4

时间:2022-08-21 15:33:56浏览次数:86  
标签:杭电多校 idx 第十 int scanf long while 2022 ll

1007 Even Tree Split

先考虑最简单的情况,如下图的边\((3,4)\),我们把这条边切掉,最后会留下一部分的点数为2,另一部分的点数依然是偶数。

进一步思考可以知道,对于边\((u,v)\),只要v子树的点数是偶数,这条边就可以切除。

再进一步,统计所有可以切除的边的数量,可以知道,只要从中选择任意多条,都可以切除两个或多个偶数个点的部分。直接套组合数公式即可。

const int N=1e5+5,M=2*N,p=998244353;
typedef long long ll;
int T;
int n;
int e[M],ne[M];
int h[N],idx;
int sz[N];
int cnt;

int qmi(int a,int k,int p){
	int tmp=1;
	while(k){
		if(k&1)tmp=(ll)tmp*a%p;
		k>>=1;
		a=(ll)a*a%p;
	}
	return tmp;
}

void adde(int x,int y){
	e[idx]=y; ne[idx]=h[x]; h[x]=idx++;
}

void dfs(int u,int fa){
	sz[u]=1;
	for(int i=h[u];~i;i=ne[i]){
		int v=e[i];
		if(v==fa)continue;
		dfs(v,u);
		sz[u]+=sz[v];
		if(sz[v]%2==0)cnt++;
	}
}

int main(){
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		idx=0; memset(h,-1,sizeof(h));
		int x,y;
		cnt=0;
		for(int i=1;i<n;i++){
			scanf("%d%d",&x,&y);
			adde(x,y); adde(y,x);			
		}
		
		dfs(1,0);
		
		printf("%d\n",(qmi(2,cnt,p)-1+p)%p);
	}
	return 0;
}

1003 Wavy Tree

很容易猜到贪心方案。

按每个下标属于波峰还是波谷分两种情况考虑:1. 奇峰偶谷,2. 偶峰奇谷。

然后第一个点不动,从左往右枚举,每个点贪心地移动最少的步数直到满足条件。

const int N=1e6+5;
const long long INF=0x3f3f3f3f3f3f3f3f;
typedef long long ll;
int T;
int b[N];
int c[N];
int n;

int main(){
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		for(int i=1;i<=n;i++)scanf("%d",&c[i]);
		memcpy(b,c,sizeof(c));
		ll ans=INF,res=0;
		//奇谷偶峰
		for(int i=2;i<=n;i++){
			if((i&1) && b[i]>=b[i-1]){ res+=b[i]-b[i-1]+1; b[i]=b[i-1]-1; }
			else if(!(i&1) && b[i]<=b[i-1]){ res+=b[i-1]-b[i]+1; b[i]=b[i-1]+1;}
		}
		ans=min(ans,res);
		memcpy(b,c,sizeof(c)); 
		res=0;
		//偶谷奇峰
		for(int i=2;i<=n;i++){
			if((i&1) && b[i]<=b[i-1]){ res+=b[i-1]-b[i]+1; b[i]=b[i-1]+1; }
			else if(!(i&1) && b[i]>=b[i-1]){ res+=b[i]-b[i-1]+1; b[i]=b[i-1]-1;}		
		}
		ans=min(ans,res);
		
		printf("%lld\n",ans);
	}
	return 0;
}

1009 Painting Game

手动膜你到了n=7的情况后,感觉应该找一些规律了。

首先想不太可能是在中间随便放,于是我们从左往右考虑。

对于第一手的情况,两人的最优操作如下(A表示Alice,B表示Bob):

因为这样A可以一次封住两个格子,B可以使x位置成为必填(最后谁填都无所谓)

对于一个黑格子之后的两个回合,两人的最优操作:

同样的,A是为了封住尽可能多的格子,B是为了创造出x这个必填位置。

因此,我们可以发现必然会存在长度为7的循环节。

typedef long long ll;
int T;
int n;
char s[8];
int a[6][2]={//长度小于7直接打表
	{1,1},
	{1,1},
	{1,2},
	{2,2},
	{2,3},
	{3,3},
};
int lft[2][7]={//余数部分直接打表
	{0,0,1,1,2,2,3},
	{0,0,1,1,1,2,2},
};

int main(){
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		scanf("%s",s+1);
		if(s[1]=='A'){
			if(n<=6)printf("%d\n",a[n-1][0]);
			else{
				int res=1;
				n-=2;//先处理第一手的情况
				res+=n/7*3+lft[0][n%7];//循环节和余数
				printf("%d\n",res);
			}
		}
		else{
			if(n<=6)printf("%d\n",a[n-1][1]);
			else{
				int res=2;
				n-=3;
				res+=n/7*3+lft[1][n%7];
				printf("%d\n",res);
			}
		}
	}
	return 0;
}

1004 Average Replacement

动手模拟、猜结论、并查集连通块。

找规律可以直接发现的:

  1. 同一连通块中的点最后值相同。
  2. 最后答案和点的度数有一定关联。

加上一点灵机一动,猜到:

\[每个连通块内的\sum a[i]*(deg[i]+1)是定值 \]

所以最终收敛的数就是用上面那个定值除以\((deg[i]+1)\)。

const int N=1e5+5;
typedef long long ll;
int T;
int n,m;
int w[N];
int f[N],d[N];
ll up[N],dn[N];

int findx(int x){
	if(f[x]!=x)return f[x]=findx(f[x]);
	else return x;
}

int main(){
	scanf("%d",&T);
	while(T--){
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;i++)scanf("%d",&w[i]);
		for(int i=1;i<=n;i++){
			f[i]=i,d[i]=0;
			up[i]=dn[i]=0;
		}
		
		int x,y;
		for(int i=1;i<=m;i++){
			scanf("%d%d",&x,&y);
			d[x]++,d[y]++;
			int fx=findx(x), fy=findx(y);
			if(fx!=fy)f[fx]=fy;
		}
		
		for(int i=1;i<=n;i++){
			int fx=findx(i);
			up[fx]+=(ll)w[i]*(d[i]+1);
			dn[fx]+=(d[i]+1);
		}
		
		for(int i=1;i<=n;i++)printf("%lf\n",1.0*up[findx(i)]/dn[findx(i)]);
	}
	
	return 0;
}

标签:杭电多校,idx,第十,int,scanf,long,while,2022,ll
From: https://www.cnblogs.com/tshaaa/p/16610069.html

相关文章

  • 2022-08-21-设计模式之观察者模式
    java设计模式之观察者模式-学习整理23种设计模式---观察者模式什么是观察者模式?定义是什么?观察者模式包含的角色有什么?四个核心的角色:抽象观察者,具体观察者;抽象被观察......
  • Common language of English Courses-001-20220821
    CommonlanguageofEnglishcourses您在EF中心学习英语多久了?howlonghaveyourbeenlearnenglishinefcenter.howlonghaveyourbeenlearningenglishatef......
  • NOI2022 游记
    跟风写一篇,整理一下收获UNR期间笔试给群友分享了黄队的背笔试网站。赛时错了一个题——选择可执行文件。正确做法是看前面的rwx权限,x表示可执行。但是我看到.sh......
  • 聊聊项目中分表的实际应用-2022新项目
    一、业务场景Web项目开发中,分表是时常会使用到的方式。分表的一个目的是为了缓解单表数据量过大,导致操作时性能下降的问题。可是在实际开发中应该如何进行进行分表呢......
  • JAVA基础--运算符--2022年8月20日
    第一节1、算数运算符有哪些+ - * / %2、/需要注意什么,为什么?两个整数相除,结果一定也是整数,因为最高类型是整数 第二节把数字321拆分成3  2......
  • 2022-8-21 每日一题+简单模拟
    1455.检查单词是否为句中其他单词的前缀难度简单45收藏分享切换为英文接收动态反馈给你一个字符串 sentence 作为句子并指定检索词为 searchWord ,其中句子由若......
  • 报告分享|2022年智能汽车云服务:汽车产业智能网联升级
    全文链接:http://tecdat.cn/?p=28277 原文出处:拓端数据部落公众号 报告分享|2022年智能汽车云服务:汽车产业智能网联升级在汽车"新四个现代化"的特定浪潮中,我们的......
  • postgresql使用group by进行数据去重-2022新项目
    一、业务场景数据去重是web开发中经常会遇到的方式之一,数据库操作中有一个关键字distinct主要就是用来做这件事,用来进行去重。比如进行统计查询的时候,可以这样写sel......
  • 2022年8月21日之人生感悟
      有时想想,我的童年挺幸福的,有最喜欢看的书,只要我想看书,妈妈都会给我买,我想吃的都买给我了,每次回家都会做我最爱吃的菜;每次都记得我喜欢吃什么。母亲和姥姥,爷爷,每次不管......
  • 2022年8月21日周六总结(maven install和package的区别未完成)
    最近做了nexus的配置,突然发现maven也很重要,我们平时会在idea用到clear、install、package等,package毫无疑问就是打包jar包了(在maven中定义了),这个打包会把 最近:这里记录......