首页 > 其他分享 >暑假集训CSP提高模拟21

暑假集训CSP提高模拟21

时间:2024-08-15 15:40:03浏览次数:12  
标签:rt lazy 21 ll tree cnt CSP 集训 dis

暑假集训CSP提高模拟21

组题人: @Muel_imj

\(T1\) P241. 黎明与萤火 \(10pts\)

  • 原题: CF963B Destruction of a Tree

  • 部分分

    • \(10pts\) :生成 \(1 \sim n\) 的全排列然后依次判断。
    • \(20pts\) :输出 NO
  • 正解

    • 叶子节点的度数为 \(1\) ,不能直接删除,只能先删除父亲节点后再单点删除。若父亲节点度数是偶数可以直接删,否则接着向上找到一个度数为偶数的祖先节点删掉后一连串地删下来。
    • 接着再从上到下扫一遍,看有没有被漏下的度数为奇数的点,若有说明无解,否则删掉这个点。
    • 本质上是一个钦定最优解然后进行 \(check\) 的过程。
    点击查看代码
    int du[200010],vis[200010];
    vector<int>e[200010],ans;
    void del(int x)
    {
    	vis[x]=1;
    	ans.push_back(x);
    	for(int i=0;i<e[x].size();i++)
    	{
    		du[e[x][i]]--;
    	}
    }
    void dfs1(int x,int fa)
    {
    	for(int i=0;i<e[x].size();i++)
    	{
    		if(e[x][i]!=fa)
    		{
    			dfs1(e[x][i],x);
    		}
    	}
    	if(du[x]%2==0)
    	{
    		del(x);
    	}
    }
    void dfs2(int x,int fa)
    {
    	if(vis[x]==0)
    	{
    		if(du[x]%2==0)
    		{
    			del(x);	
    		}
    		else
    		{
    			cout<<"NO"<<endl;
    			exit(0);
    		}
    	}
    	for(int i=0;i<e[x].size();i++)
    	{
    		if(e[x][i]!=fa)
    		{
    			dfs2(e[x][i],x);
    		}
    	}
    }
    int main()
    {
    	int n,u,v,rt=0,i;
    	cin>>n;
    	for(i=1;i<=n;i++)
    	{
    		cin>>u;
    		v=i;
    		if(u==0)
    		{
    			rt=i;
    		}
    		else
    		{
    			du[u]++;
    			du[v]++;
    			e[u].push_back(v);
    			e[v].push_back(u);
    		}
    	}
    	dfs1(rt,0);	
    	dfs2(rt,0);
    	cout<<"YES"<<endl;
    	for(i=0;i<ans.size();i++)
    	{
    		cout<<ans[i]<<endl;
    	}
    	return 0;
    }
    

\(T2\) P242. Darling Dance \(100pts\)

  • 原题: CF1076D Edge Deletion

  • 建出最短路 \(DAG\) 后在 \(DAG\) 上的边就是候选集合的边。接着进行大力分讨。

    • 若边的数量 \(\le k\) ,直接输出 \(DAG\) 上的边即可。
    • 若边的数量 \(>k\) ,不断找度数最大的点删边,直至成为一棵树,若还 \(>k\) 遍历一遍整棵树取 \(k\) 条边即可。
    点击查看代码
    struct node
    {
    	ll nxt,to,w,id;
    }e[600010];
    ll head[600010],dis[600010],vis[600010],din[600010],cut[600010],e_cnt=0,E_cnt=0,cnt=0;
    vector<pair<ll,ll> >E[600010],fE[600010];
    void add(ll u,ll v,ll w,ll id)
    {
    	e_cnt++;	
    	e[e_cnt].nxt=head[u];
    	e[e_cnt].to=v;
    	e[e_cnt].w=w;
    	e[e_cnt].id=id;
    	head[u]=e_cnt;
    }
    void dijstra(ll s)
    {
    	memset(dis,0x3f,sizeof(dis));
    	memset(vis,0,sizeof(vis));
    	priority_queue<pair<ll,ll> >q;
    	dis[s]=0;
    	q.push(make_pair(-dis[s],-s));;
    	while(q.empty()==0)
    	{
    		ll x=-q.top().second;
    		q.pop();
    		if(vis[x]==0)
    		{
    			vis[x]=1;
    			for(ll i=head[x];i!=0;i=e[i].nxt)
    			{
    				if(dis[e[i].to]>dis[x]+e[i].w)
    				{
    					dis[e[i].to]=dis[x]+e[i].w;
    					q.push(make_pair(-dis[e[i].to],-e[i].to));
    				}
    			}
    		}
    	}
    }
    void build(ll n)
    {
    	for(ll x=1;x<=n;x++)
    	{
    		for(ll i=head[x];i!=0;i=e[i].nxt)
    		{
    			if(dis[e[i].to]==dis[x]+e[i].w)
    			{
    				E_cnt++;
    				E[x].push_back(make_pair(e[i].to,e[i].id));
    				fE[e[i].to].push_back(make_pair(x,e[i].id));
    				din[e[i].to]++;
    			}
    		}
    	}
    }
    void top_sort(ll n)
    {
    	queue<ll>q;
    	for(ll i=1;i<=n;i++)
    	{
    		if(din[i]==0)
    		{
    			q.push(i);
    		}
    	}
    	while(q.empty()==0)
    	{
    		ll x=q.front();
    		q.pop();
    		for(ll i=0;i<E[x].size();i++)
    		{
    			if(cut[E[x][i].second]==0)
    			{
    				cout<<E[x][i].second<<" ";
    				din[E[x][i].first]--;
    				if(din[E[x][i].first]==0)
    				{
    					q.push(E[x][i].first);
    				}
    			}
    		}
    	}
    }
    void dfs(ll x,ll k)
    {
    	for(ll i=0;i<E[x].size();i++)
    	{
    		if(cut[E[x][i].second]==0&&cnt<k)
    		{
    			cnt++;
    			cout<<E[x][i].second<<" ";
    			dfs(E[x][i].first,k);
    		}
    	}
    }
    struct quality
    {
    	ll pos,val;
    }a[600010];
    bool cmp(quality a,quality b)
    {
    	return a.val>b.val;
    }
    int main()
    {
    	ll n,m,k,u,v,w,flag=0,i,j;
    	cin>>n>>m>>k;
    	for(i=1;i<=m;i++)
    	{
    		cin>>u>>v>>w;
    		add(u,v,w,i);
    		add(v,u,w,i);
    	}
    	dijstra(1);
    	build(n);
    	for(i=1;i<=n;i++)
    	{
    		a[i].pos=i;
    		a[i].val=din[i];
    	}
    	sort(a+1,a+1+n,cmp);
    	for(i=1;i<=n;i++)
    	{
    		for(j=1;j<fE[a[i].pos].size();j++)
    		{
    			if(E_cnt<=k||E_cnt==n-1)
    			{
    				flag=1;
    				break;
    			}
    			else
    			{
    				E_cnt--;
    				din[a[i].pos]--;
    				cut[fE[a[i].pos][j].second]=1;
    			}
    		}
    		if(flag==1)
    		{
    			break;
    		}
    	}
    	if(E_cnt>k)
    	{
    		cout<<k<<endl;
    		dfs(1,k);
    	}
    	else
    	{
    		cout<<E_cnt<<endl;
    		top_sort(n);
    	}
    	return 0;
    }
    
  • 或者只建最短路树,然后遍历一遍整棵树取 \(\min(k,n-1)\) 条边即可。

\(T3\) P243. Non-breath oblige \(0pts\)

  • 原题: luogu P5524 [Ynoi2012] NOIP2015 充满了希望
  • 部分分
    • \(10pts\) :暴力枚举操作,时间复杂度为 \(O(mq \log n)\) 。
    • \(20pts\) :没有操作 \(2\) ,则序列始终都是 \(0\) ,输出 \(0\) 即可。
  • 正解

\(T4\) P244. 妄想感伤代偿联盟 \(0pts\)

  • 部分分
  • 正解
    • 等价于将 \(a_{x},a_{y}\) 拼起来问最长重叠长度,基础字符串拿个什么玩意维护,之前应该做过类似的。

总结

  • \(T3\) 因 Ctrl+A 全选时因一些奇怪错误把
    if(tree[rt].lazy!=-1)
    {
    	tree[lson(rt)].sum=tree[rson(rt)].sum=tree[rt].lazy;
    	tree[lson(rt)].lazy=tree[rson(rt)].lazy=tree[rt].lazy;
    	tree[rt].lazy=-1;
    }
    
    粘成了
    if(tree[rt].lazy!=-1)
    	tree[lson(rt)].sum=tree[rson(rt)].sum=tree[rt].lazy;
    {
    	tree[lson(rt)].lazy=tree[rson(rt)].lazy=tree[rt].lazy;
    	tree[rt].lazy=-1;
    }
    
    但是没有爆 \(CE\) ,挂了 \(10pts\) 。
  • \(T4\) 以为 \(subtask 2,subtask 3\) 代码能过 \(subtask 1\) 就没写 \(subtask 1\) 的部分分,挂了 \(10pts\) 。

后记

标签:rt,lazy,21,ll,tree,cnt,CSP,集训,dis
From: https://www.cnblogs.com/The-Shadow-Dragon/p/18360833

相关文章

  • 2024.8.14 总结(集训)
    依然是TQX来讲字符串。/bx/bx/bx属于是两个上午速通字符串里一些重要的内容。上课时只有manacher和PAM是我有点听懂了的。于是下午看TQX的博客学了PAM,看之前看过的博客复习了下SAM,给why讲了些、和他讨论了PAM,AC了洛谷上的PAM板子,看TQX的PPT学了manache......
  • 『模拟赛』暑假集训CSP提高模拟20
    Rank有点可惜,暴力打满就并列Rank1了。A.Kanon原[JOI2021Final]雪玉签。考虑到每两个球之间的距离是恒不变的,因此我们可以通过找到每个球控制的边界得到答案,每个区间正好可以得出左边球的右边界和右边球的左边界。记录每个区间的标号和长度,按长度升序sort一遍,然......
  • CSP/NOIP计数题一些奇奇怪怪的东西
    卡特兰数常见公式:不是很懂。\[H_n=C_{2n}^n-C_{2n}^{n-1}\]应用:折线计数。第二类斯特林数在小球与盒子那道模板题中见到的,表示表示将\(n\)个两两不同的元素,划分为\(k\)个互不区分的非空子集的方案数。递推式:\[\operatorname{S2}_{i,j}=j\times\operatorname{S2}_{i-......
  • [考试记录] 2024.8.14 csp-s模拟赛20
    [考试记录]2024.8.13csp-s模拟赛2090+39+0+0还是太......
  • LeetCode216.组合总和lll
    4.组合总和lll(LeetCode216)题目叙述:找出所有相加之和为n的k个数的组合,且满足下列条件:只使用数字1到9每个数字最多使用一次返回所有可能的有效组合的列表。该列表不能包含相同的组合两次,组合可以以任何顺序返回。示例1:输入:k=3,n=7输出:[[1,2,4]]解释:1......
  • 《DNK210使用指南 -CanMV版 V1.0》第十九章 machine.PWM类实验
    第十九章machine.PWM类实验1)实验平台:正点原子DNK210开发板2)章节摘自【正点原子】DNK210使用指南-CanMV版V1.03)购买链接:https://detail.tmall.com/item.htm?&id=7828013987504)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k210/ATK-DNK210.html5)正......
  • 暑假集训CSP提高模拟20
    暑假集训CSP提高模拟20组题人:@KafuuChinocpp\(T1\)191.Kanon\(0pts\)原题:luoguP7405[JOI2021Final]雪玉|雪玉(Snowball)\(T2\)P154.SummerPockets\(0pts\)原题:[ARC157D]YYGarden\(T3\)199.空之境界\(60pts\)原题:QOJ1833.Deleting部分分......
  • 8.14信息学集训_树、搜索与剪枝
    目录P1305新二叉树B3642二叉树的遍历P4913【深基16.例3】二叉树深度P3884[JLOI2009]二叉树问题P8681[蓝桥杯2019省AB]完全二叉树的权值P1434[SHOI2002]滑雪P1040[NOIP2003提高组]加分二叉树P1074[NOIP2009提高组]靶形数独P2827[NOIP2016提高组]蚯蚓T266208......
  • CSP-J大纲
    CSP-J大纲2.1.1计算机基础与编程环境【1】计算机的基本构成(CPU、内存、I/O设备等)【1】Windows、Linux等操作系统的基本概念及其常见操作【1】计算机网络和Internet的基本概念【1】计算机的历史及其在现代社会中的常见应用【1】NOI以及相关活动的历史【1】进制的基本概念......
  • [陇剑杯 2021]wifi WP
    9.1小王往upload-labs上传木马后进行了cat/flag,flag内容为_____________。(压缩包里有解压密码的提示,需要额外添加花括号)附件信息:拿到附件先看服务器.pcapng可以发现只有发出去的包,且为哥斯拉php_eval_xor_base64流量哥斯拉php_eval_xor_base64流量是3.0才更新的php......