首页 > 其他分享 >csp模拟赛 6 9.28

csp模拟赛 6 9.28

时间:2024-09-28 21:33:56浏览次数:1  
标签:num1 int 9.28 del lx freopen 300005 csp 模拟

0+40+10+0

一言以蔽之 曰 “一上午白干”

T1 一般图最小匹配

首先,对答案有贡献的点对一定在排序后的位于相邻位置

所以排序后取出所有 \(a_{i+1}-a_{i}\)

但不能像Kruskal一样每次取最小,因为其只需要考虑连通性,不涉及其它限制。

所以用dp或者可反悔贪心取最优解

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int a[50005];
int dp[5005][5005];
signed main()
{
	freopen("match.in","r",stdin);
 	 freopen("match.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	sort(a+1,a+1+n);
	memset(dp,0x3f,sizeof(dp));
	for(int i=0;i<=n;i++) dp[i][0]=0;
	for(int i=2;i<=n;i++)
	{
		for(int j=1;j<=min(i/2+1,m);j++)
		{
			dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+a[i]-a[i-1]);
		}
	}
	cout<<dp[n][m];
}

T2 重定向

从前向后扫描

对于分别考虑 \(a_{i}\) 和 \(a_{i+1}\) 是否选到 0,共四种情况。

用set维护出每个为 0 的位置可以填下的数

另外, 对于 一种情况 \(a_{i}=0\) 并且存在\(j>i\)并且\(a_{j}\)小于其可选的最小至,此时直接删除\(j\)

点击查看代码

#include<bits/stdc++.h>
using namespace std;
unordered_map<int,int> ma;
int a[500005];
bool f[500005];
set<int >stk,sty;
int n;
int main()
{
	freopen("repeat.in","r",stdin);
	freopen("repeat.out","w",stdout);
	int T;
	cin>>T;
	while(T--)
	{
		cin>>n;
		memset(f,0,sizeof(f));
		stk.clear();
		sty.clear();
		ma.clear();
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
			if(a[i]) f[a[i]]=1,ma[a[i]]=i;
		}
		for(int i=1;i<=n;i++)
		{
			if(!f[i]) stk.insert(i);
			else sty.insert(i);
		}
		int wei=0;
		for(int i=1;i<=n;i++)
		{
			if(a[i]) sty.erase(a[i]);
			if(a[i]&&a[i+1])
			{
				if(a[i]>a[i+1])
				{
					stk.insert(a[i]);
					wei=i;
					break;
				} 
			}
			if(a[i+1]==0&&a[i])
			{
				int x=*stk.begin();
				if(x<a[i])
				{
					stk.insert(a[i]);
					wei=i;
					break;
				}
			 }
			if(a[i]==0)
			{
				int x=*stk.begin();
				int y=*sty.begin();
				if(y<x)
				{
					a[i]=y;
					sty.erase(y);
					wei=ma[y];

					//cout<<"__";
					break;
				}
				else
				{
					a[i]=x;
					stk.erase(x);
				} 
			}

		}
		if(wei==0) wei=n;
		for(int i=1;i<=n;i++) 
		{
			if(wei==i) continue;
			if(a[i]==0)
			{
				int x=*stk.begin();
				//int y=*sty.begin();
				a[i]=x;
				stk.erase(x);
			}
		}
		for(int i=1;i<=n;i++)
		{
			if(wei==i) continue;
			//tot++;
			cout<<a[i]<<' ';
		}
		cout<<'\n';
	}	
}

T3 斯坦纳树

对于当前点集,当且仅当其在原树上形成的虚树存在虚点时答案为 0;

将用边权为0的边相连的点 ,合并为一个大点,只要大点内有一个点存在,即表示该大点存在;

  • 可正徐维护,依次加点,将已有点集按\(dfs\) 序排序 ,将新增节点填入,若其与左右两个节点分别形成的lca都位于已有点集内,则无新增虚点

  • 也可倒叙删点,对要删除点,若当前相连的边数大于3,则设为虚点;若等于2,则删除,并将与其相连的两个点连边,保持连通性;若等于1 直接删除; 对于每次删除要递归处理

点击查看代码

#include<bits/stdc++.h>
using namespace std;
struct node{
	int f,to,next,w;
}ee[600005],e[600005];
int head[300005],cnt1,cnt;
bool del[300005],xvd[300005];
int fa[300005],siz[300005],in[300005],p[300005];
bool ans[300005];
int n,xv;
void add(int f,int t,int w)
{
	e[++cnt].to=t;
	e[cnt].f=f;
	e[cnt].w=w;
	e[cnt].next=head[f];
	head[f]=cnt;
}
int find(int x)
{
	if(fa[x]!=x) fa[x]=find(fa[x]);
	return fa[x];
}
void merge(int x,int y)
{
	int fx=find(x),fy=find(y);
	if(fx==fy) return;
	fa[fx]=fy;
	siz[fy]+=siz[fx];
}
void delet(int x)
{
	del[x]=1;
	if(in[x]==2)
	{
	int num1=0,num2=0;
	for(int i=head[x];i;i=e[i].next)
	{
		int y=e[i].to;
		if(!del[y]&&num1==0) num1=y; 
		else if(!del[y]&&num1) num2=y;
	}
	add(num1,num2,1);
	add(num2,num1,1);
	in[num1]++;
	in[num2]++;
	}
	for(int i=head[x];i;i=e[i].next)
	{
		int y=e[i].to;
		if(!del[y])
		{
			in[y]--;
			if(xvd[y]&&in[y]==2)
			{
				xvd[y]=0;
				del[y]=1;
				xv--;
				delet(y);
			}
		}
	}
}
int main()
{
	freopen("tree.in","r",stdin);
	freopen("tree.out","w",stdout);	
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		fa[i]=i;
		siz[i]=1;
	}
	for(int i=1;i<n;i++)
	{
		int x,y,w;
		cin>>x>>y>>w;
		if(w==0) merge(x,y);
		else 
		{
			ee[++cnt1].f=x;
			ee[cnt1].to=y;
			ee[cnt1].w=w;
		}
	}
	for(int i=1;i<=cnt1;i++)
	{
		int lx=find(ee[i].f),ly=find(ee[i].to);
		in[lx]++,in[ly]++;
		add(lx,ly,e[i].w);
		add(ly,lx,e[i].w);
	}
	for(int i=1;i<=n;i++) cin>>p[i];
	for(int i=n;i>=1;i--)
	{
		ans[i]=(xv==0);
		int lx=find(p[i]);
		siz[lx]--;
		if(siz[lx]) continue;
		if(in[lx]>=3) xvd[lx]=1,xv++;
		else 
		{
			del[lx]=1;
			delet(lx);
		} 
	}
	for(int i=1;i<=n;i++) cout<<ans[i];
}

T4

不会


网络流
感觉 P2754在暗示什么 打了四遍都在保存前,电脑死机了

标签:num1,int,9.28,del,lx,freopen,300005,csp,模拟
From: https://www.cnblogs.com/CTHoi/p/18438462

相关文章

  • 『模拟赛』csp-s模拟赛6
    『模拟赛』csp-s模拟赛6挂分日寄:0+20+0+0喵喵赛时对拍拍了10000个点都没拍出来,赛后一下就拍出错来了,我谔谔。T1DP喵~首先sort一遍方便处理其实转移时加一个abs取绝对值就可,纯纯多此一举设\(f[i,j,1/0]\)为前\(i\)个数中选\(j\)个的最小值若选当前这个数,则\(f[i......
  • 2024.9.28 代码源模拟赛
    省流:\(45+20+5+0=70\)简称:唐诗在此膜拜\(klz\)\(Heldivis\)\(Sorato\)\(czl\)\(Ech0\_7\)yxanslihe_qwq大佬T1先看的T1,想了一个拓排(其实是看错题了),然后过了第一个样例,然后咋调都过不去,就去码暴力了。过了大概10min发现看错题了,然后一会就想出来个\(O(n^2)\)......
  • 2024.9.28 计划
    项目学习ROS第二章学完背包问题求方案数背包问题求具体方案总结ROS第二章总结三种基本的通信方式都解决了。步骤和框架参照上两篇和ubantu中的demo框架即可。前两种通信方式的比较:发布-订阅模式服务器通信通信模式发布/订阅请求/响应同步性异步同......
  • 代码源 2024 CSP-S 模拟赛 Day 6
    赛时开T1,发现立即有了\(O(n^2)\)的思路,能有\(45\)分,但是先不急,看看后面的题。T2、T3、T4似乎都可以写个暴力。又想了想,T1还需要求出个LCA,所以复杂度是\(O(n^2\logn)\)的,开写。很快写完,调不过,边界很不好处理。直到\(1.5\)h才调出来\(O(n^2\logn)\)。上个厕所......
  • 团队练习记录2024.9.28
    B-MagicalSubsequencehttps://codeforces.com/gym/103447/problem/B桶+stack,这里用map会TLEstack用一次时间复杂度\(O(1)\)\(156ms/1000ms\)#include<iostream>#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;voidfio(){ ios::sync_wit......
  • CSP-S 2024 第六次
    A排序之后只会选相邻的,直接DP。B从前往后考虑每个数\(a_i\)要不要删。若不删\(a_i\):若\(a_i\ne0\),则\(a_i\)已经确定。若\(a_i=0\),则\(a_i\)可取所有没出现过的数,以及\(i\)后最小的数(先删掉它再把\(a_i\)赋成它)若删掉\(a_i\):若\(a_{i+1}\ne0\),则\(a......
  • 『模拟赛』CSP-S模拟6
    Rank一般恼了怎么又狠狠挂分啊啊啊啊A.一般图最小匹配签。(这么多天终于签上了是吧)结论是,跟图完全没关系。题意转换完就是从\(n\)个数中选出\(m\)对差的绝对值之和最小的数。显然我们选的每一对数都应该是这\(n\)个数中相邻的一组,sort一下,设\(f_{i,j,k}\)表示到......
  • CSP-S 2022~2023 补题
    下面的代码都是远古代码,不打算重写了。CSP-S2023T1密码锁题意:一个密码锁上有\(5\)个位置,每个位置上的数字是\(0\sim9\)的循环,每次打乱会选择一或两个相邻位置同时循环移动。给定\(n\)个打乱后的状态,求有多少种可能的原状态。\(n\le8\)。容易发现可能的状态数......
  • [DMY]2024 CSP-S 模拟赛 Day 6
    前言离A掉一道题最近的一次。过程看完T1以后,想先构一个\(\mathcal{O}(n^3)\)的暴力,但是发现只有10pts,而且算法复杂度接近\(\mathcal{O}(n^4)\),所以果断放弃。把链的限制写了(然后亏大了),然后开始在CS上面画画。画了一会发现一个简单的dp思路,但是是\(\mathcal{O}(n^......
  • CSP & NOIP 模拟赛记录
    9.18(lanos212)T1签到,10mins内过了。T2乍一看有点困难,题目太形式化,不太直观,先跳过去思考T3了,T3没有什么DP的思路,但是这种题显然需要DP。看了一眼T4,被一堆式子糊脸恶心了,没有怎么思考。接下来一个小时在思考T2和T3,突然发现T2只需要每次求最短路就可以了,那么就是......