首页 > 其他分享 >2024.10.29模拟赛

2024.10.29模拟赛

时间:2024-10-29 23:21:12浏览次数:1  
标签:pre 2024.10 int 29 ans 集合 操作 模拟 op

今天照常7:45开始打模拟赛,11:45时结束。打了T1的40分暴力、T3的20分暴力,没有注意到T4的特殊样例可以骗分(悲),最后以60分收尾。总结一下,没有挂分,但也没和正解挨上边,算是不好也不坏吧。
订题时我看着T1 26行的AC代码陷入了沉思。三个人,想了至少三个小时,结果全没想出来,于是来整理一下今天的神奇模拟赛。
题目小链接:?
T1【集合】
题目大意:给定一棵n个节点的树,共m次操作,每次操作形如对于第x条边(u,v),将Su,Sv替换成两者的并集。求m次操作后,每个i属于多少个集合
解题思路:经过一定的思考之后,我们发现正序操作可以理解为“我会有多少个朋友”,明显不好处理;但倒序操作可以理解为“我会是谁的朋友”,可以转移。
举个栗子:对于操作加盟u->v边,此时u与v中都包含彼此,所以当下次对u进行操作时,v一定也会被那个节点包含。
可以转移为s[u]=s[v]=s[u]+s[v]。但这样当出现重边时,因为u与v已有相同元素,这个操作就会应取了相同元素而不满足集合性质(题目中取并集)。但是,众所周知,|S∪T|=|S|+|T|−|S∩T|,而经过一系列推论我们容易发现|S∩T|为上一次对该边操作后的答案,即上一次操作取的并集会是此次操作中u与v的交集。那么会不会出现|S∩T|中不仅仅是上次并集中的元素情况呢?手模后发现是不会的。因为……反正……这样这样,那样那样,树上是没有环的,若S、T中的其他元素想要影响|S∩T|,只能通过再次操作该边影响,所以上次的操作的集合并就是这次操作中的集合角。
于是乎,我们维护pre数组与ans数组,pre[i]表示对于边i,上一次操作的答案,ans[i]表示对于节点i之中元素的个数。于是我们稍加整理,可以得到神奇的式子:ans[u]=ans[v]=pre[op[i]]=ans[u]+ans[v]-pre[op[i]]。于是26行代码就解决了

点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int N=4e5+10;
int n,m;
int u[N],v[N];//记录每条边
int op[N];//操作
int ans[N],pre[N];//答案与上次答案

void read()
{
	scanf("%d%d",&n,&m);
	for (int i=1;i<n;i++) scanf("%d%d",&u[i],&v[i]);
	for (int i=1;i<=m;i++) scanf("%d",&op[i]);
}
int main()
{
	read();
	for (int i=1;i<=n;i++) ans[i]=1;
	for (int i=m;i>=1;i--)
	{
		int uu=u[op[i]],vv=v[op[i]];
		ans[uu]=ans[vv]=pre[op[i]]=ans[uu]+ans[vv]-pre[op[i]];
	}
	for (int i=1;i<=n;i++) printf("%d ",ans[i]);
	return 0;
}
*来自蒟蒻的小声bb:想过3小时思路不对,没想过思路完全不着边。

标签:pre,2024.10,int,29,ans,集合,操作,模拟,op
From: https://www.cnblogs.com/Myyy-L/p/18514140

相关文章

  • 10.29
    距离NOIP2024还有31天arc181_c:按行的字典序大小,每一行比上一行多一个\(1\),选在未选过的列的字典序最大的那一列。arc180_b贪心感觉很妙,但是感觉还是官解比较好理解。我们定义序列\(pos\),满足\(pos_{p_i}=i\),那么每次交换其实就是找一对\((i,j)\)满足\(1\lei<j\le......
  • 2024/10/29
    今天学习了数据库的链接,配置了Maven环境<head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>MES系统</title><style>body{......
  • 深入浅出:SpringBoot启动流程源码分析(持续更新中......)最新日期:2024年10月29日
    Hello,大家好,我是此林。今天来深入底层讲一讲SpringBoot是如何启动的,也就是我们单击运行SpringBoot启动类,它底层发生了什么?SpringBoot启动类很简单,只有一行代码。我们点进run()方法。我们发现,它底层其实进行了两步操作。第一步是new出一个SpringApplication对象,第二个是......
  • 10.29每日总结:《程序员修炼之道》读后感2
    经过这一阶段的阅读,我对程序员这个职业有了更深的理解和感悟。这本书强调了许多重要的理念和实践方法,让我认识到作为一名程序员,不能仅仅满足于编写代码,更要注重自身的修炼和成长。它提醒我们要保持对技术的好奇心,不断学习新的知识和技能,以适应快速变化的行业需求。书中提到的“......
  • 10.29 人工智能学习内容
    上节课内容补充【给大语言模型法阅读材料】如果你手边现成有原文,而且长度合适,建议自带原文去找大语言模型Usetheprovidedarticlesdelimitedbytriplequotestoanswerquestions.Iftheanswercannotbefoundinthearticles,write"Icouldnotfindananswer."......
  • SS241029C. 卡路里(calorie)
    SS241029C.卡路里(calorie)题意有\(m\)家奶茶店,一共有\(n\)种奶茶,每家店都有这\(n\)种奶茶。奶茶店排成一排,两两之间距离\(d_i\)。每家奶茶店每种奶茶有一个卡路里值\(a_{i,j}\)。选择若干家连续的奶茶店,在这些奶茶店中每种奶茶各喝一次,求最大化\((\sum_ja_j)-(s_r......
  • 2024.10.19 CF2030(Div.2)
    比赛链接Solved:5/8Upsolved:6/8Rank:166E.MEXmizetheScore题意定义一个集合的分数为:将它分成若干个子集,mex和的最大值。(mex从0开始算)给n个数,求所有非空子集的分数之和。\(n\leq2\times10^5\)题解对一个确定的集合,它的划分方式一定是每次分出去一个最长的{0,......
  • 2024.10.14 Codeforces Round 978 (Div. 2)
    比赛链接Solved:4/7Upsolved:5/7Rank:447(rated343)D2.Asesino(HardVersion)题意:有n个人,除了一个卧底以外,其他人或者只会说真话,或者只会说谎,且他们知道彼此的身份。卧底只会说谎,但其他人都认为他只会说真话。现在你可以进行若干次询问,每次询问形如问第i个人第j个人是什么......
  • 2024.10.24 The 2021 ICPC Northwestern Russia Regional Contest
    比赛链接Solved:8/14Penalty:909Rank:23前五道签到题ABCHL。K.KaleidoscopicRoute题意给一张带边权的图,求一条1到n的路径,使经过的边数最少的同时边的极差最大。题解求出最短路图,然后DAG上dp:f和g分别表示从1到这个点能经过的最大边权和最小边权。然后每转移一条边(x,y,z......
  • 2024.10.4 2018-2019 ACM-ICPC Southeastern European Regional Programming Contest
    比赛链接Solved:7/11Penalty:914Rank:1/74Rank(vp):63/1k+Dirt:22%G答案是4*纯色块数+5。考虑怎么维护这个纯色块数。这道题的修改保证了一个块纯色当且仅当其行列都纯色。因此对行列分别维护一棵线段树,维护每一层分别有多少个纯色节点,按层乘起来相加就行。K1操作的增加量......