首页 > 其他分享 >csp-s模拟7

csp-s模拟7

时间:2024-09-30 21:33:25浏览次数:1  
标签:cnt ch return int flag maxn csp 模拟

这次状态不是很好,冲着T1磕了4个小时,后仨题看都没看。。。

A. median

去他丫的容斥,考虑排序,一个数作为中位数的方案数就是他左边有俩不同类型的数和右面有俩不同类型的数的总和

枚举哪些类型左边哪些右边,对每一位计算贡献就可以了,要提前预处理出来个数。

(有没有好心人看看我代码哪多乘了个4,最后答案我乘上4的逆元就过了,它没有道理但我拍不出来)

点击查看代码
#include<bits/stdc++.h>
#define int long long
const int mod=998244353;
const int maxn=1e5+10;
using namespace std;
int n,x,cnt,num[6][maxn<<3],ans;
struct lsx
{
	int x;
	char A;
	bool operator < (const lsx &a) const
	{
		return x<a.x;
	}
}a[maxn<<3];

int qpow(int x,int y)
{
	int ans=1;
	while(y)
	{
		if(y&1)ans=ans*x%mod;
		x=x*x%mod;
		y>>=1;
	}
	return ans;
}

void pre()
{
	for(int i=1;i<=cnt;i++)
	{
		for(int j=1;j<=5;j++) num[j][i]=num[j][i-1];
		if(a[i].A=='A') num[1][i]++;
		if(a[i].A=='B') num[2][i]++;
		if(a[i].A=='C') num[3][i]++;
		if(a[i].A=='D') num[4][i]++;
		if(a[i].A=='E') num[5][i]++;
	}
}

signed main()
{
	freopen("median.in","r",stdin);
	freopen("median.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++) cin>>x,a[++cnt]={x,'A'};
	for(int i=1;i<=n;i++) cin>>x,a[++cnt]={x,'B'};
	for(int i=1;i<=n;i++) cin>>x,a[++cnt]={x,'C'};
	for(int i=1;i<=n;i++) cin>>x,a[++cnt]={x,'D'};
	for(int i=1;i<=n;i++) cin>>x,a[++cnt]={x,'E'};
	sort(a+1,a+1+cnt);
	pre();
	for(int i=3;i<=cnt;i++)
	{
		for(int s=1;s<=5;s++)
		{
			if(s==a[i].A-'A'+1) continue;
			for(int k=1;k<=5;k++)
			{
				if(k==s||k==a[i].A-'A'+1) continue;
				for(int t=1;t<=5;t++)
				{
					if(t==s||t==k||t==a[i].A-'A'+1) continue;
					int h=15-s-k-t-(a[i].A-'A'+1);
					ans=(ans+a[i].x*num[s][i]%mod*num[k][i]%mod*(num[t][cnt]-num[t][i])%mod*(num[h][cnt]-num[h][i])%mod)%mod;
				}
			}
		}
	}

	cout<<ans*qpow(4,mod-2)%mod;
	
	return 0;
}
/*

*/

B. travel

我们知道对于一棵树来说,当 \(k\) 足够大时,答案就变成0,所以推广一下可知,题目就是在让我们找环,由于没有避免自环

所以考虑自环的贡献,如果只有一个自环的话,当 \(k\) 无限大时,答案只能是1,所以至少要有两个自环且联通才可以保证

有贡献,找这两种环就好了。

(我找这俩环写一个搜里了,确实对了,但一个点T了,卡常卡过去的,不理解你们为啥这么快)

点击查看代码
#include<bits/stdc++.h>
const int maxn=5e5+10;
using namespace std;
int n,m,head[maxn],nxt[maxn],to[maxn],tot,flag,cnt;
unordered_map<int,bool>vis[maxn],zi,v,s;

inline void add(int x,int y)
{
	to[++tot]=y;
	nxt[tot]=head[x];
	head[x]=tot;
}

template<typename T> inline T read() {
  T X = 0; bool flag = 1; char ch = getchar();
  while (ch < '0' || ch > '9') {if (ch == '-') flag = 0; ch = getchar();}
  while (ch >= '0' && ch <= '9') {X = (X << 1) + (X << 3) + ch - '0'; ch = getchar();}
  if (flag) return X;
  return ~ (X - 1);
}

inline void lsx(int x)
{
	cnt++;
	if(cnt>n+m) return ;
	if(flag) return ;
	v[x]=1;
	s[x]=zi[x];
	for(int i=head[x];i;i=nxt[i])
	{
		if(flag) return; 
		int y=to[i];
		if(v[y])
		{
			flag=1;
			return ;
		}
		s[x]=zi[x];
		lsx(y);
		if(cnt>n+m) return ;
		if(flag) return; 
		if(s[x]&&s[y]) 
		{
			flag=1;
			return ;
		}
		s[x]|=s[y];
	}
	if(cnt>n+m) return ;
	if(!flag)v[x]=0; 
}

int main()
{ 
	freopen("travel.in","r",stdin);
	freopen("travel.out","w",stdout);
//	freopen("ex_data4.in","r",stdin); 
	ios::sync_with_stdio(0);
//	cin.tie(0),cout.tie(0);
	n=read<int>(),m=read<int>();
	for(register int i=1,x,y;i<=m;i++)
	{
		x=read<int>(),y=read<int>();
		if(x==y)
		{
			zi[x]+=1;
			continue; 
		}
		if(vis[x][y])continue;
		vis[x][y]=1;
		add(x,y);
	}
	for(register int i=1;i<=n;i++)
	{
		if(flag) break; 
		if(!v[i])lsx(i);
	}
	if(flag) puts("Yes");
	else puts("No");

	return 0;
}
/*

*/

C. game

结论:\(n\) 为偶数且 \(a\) 能两两相同配对则后手赢,否则先手必胜。

充分性很好证明,只需要后手模仿先手的操作,最后一定后手赢。

证明其必要性,当 \(a\) 不能两两配对时,先对其排序:

若 \(n\) 为奇数,则先手可以找到最大的一个不能匹配的去填补剩下的小的不能匹配的较小的那个,由于排过序,相邻作差

的和一定小于最大的那个数,所以情况成立

若 \(n\) 为偶数,则只需要将较大的一个堆中的一部分填补到较小的堆中,一定有一种取法满足条件,情况成立

(代码很容易被卡,但不想计数了,直接异或的)

点击查看代码
#include<bits/stdc++.h>
const int maxn=1e5+10;
using namespace std;
int n,temp,t;

int main()
{
	freopen("game.in","r",stdin);
	freopen("game.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>t;
	while(t--)
	{
		int x;
		cin>>n;
		temp=0;
		for(int i=1;i<=n;i++)
		{
			cin>>x;
			temp^=x;
		}
		if(n%2==0&&temp==0) puts("No");
		else puts("Yes");
	}

	return 0;
}
/*

*/

标签:cnt,ch,return,int,flag,maxn,csp,模拟
From: https://www.cnblogs.com/oceansofstars/p/18442478

相关文章

  • CSP-S 2024 第七次
    有打对拍的时间不去想想T4?好吧根据一些经验分析确实该先写拍打一场模拟赛造三题数据,就当攒RP了A钦定\(A_i,B_j,C_k,D_l,E_m\)的中位数是它们按值为第一关键字,所属序列编号为第二关键字排序后正中间的数,这样就可以确定中位数在哪个序列的哪一位。枚举中位数在哪个序列的......
  • 模拟赛
    发现自己还有好多题没改/总结,所以弄了这么个东西;空着的就是还没改完或者是没来得及写题解的。由于目前还在不断地打新的模拟赛,所以大概会从两头向中心更新(最新:[35]csp-s模拟6[0]CSP提高组模拟1A最短路原题:P2966CowTollPathsG\(n\le300\),考虑Floyd。对点权从小......
  • 1284 海港 队列 模拟
    思路解释 1. 数据结构选择: 使用 queue 来存储每艘船的到达时间和乘客国籍信息。 使用数组 a 来记录每个国籍的乘客数量。 2. 输入处理: 读取船只数量 n。 对于每艘船,读取其到达时间 t 和乘客数量 k,然后读取每个乘客的国籍 x。 3. 统计不同......
  • 828华为云征文|部署个人文档管理系统 Docspell
    828华为云征文|部署个人文档管理系统Docspell一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1重置密码2.2服务器连接2.3安全组配置2.4Docker环境搭建三、Flexus云服务器X实例部署Docspell3.1Docspell介绍3.2Docspell部署3.3Docspell使用四、总......
  • 11752 糖葫芦 模拟 排序 枚举
    解决思路 读取输入:读取糖果的数量 n 和每个糖果距左边第一颗糖果的距离。 排序:对糖果的距离进行排序。 枚举分割点:枚举两个分割点,将糖果分成三段,计算每段的长度,并求出总长度的最小值。#include<bits/stdc++.h>#definelllonglongusingnamespacestd;cons......
  • 正睿csp-s7连测 day4
    注:未登录正睿OI账号则看不了题目。day4A难度:蓝-紫考虑贪心。考虑优先选当前能连到了最小的点,但是这样会被样例卡疯。考虑加一点策略。首先,若当前选到的点权大于其儿子的点权,那肯定把儿子也选上了,不然就不优了。然后树上就会出现一些团。现在假设一个点下面连着两个团,考虑......
  • 9.30 模拟赛
    得用kunkka号看。题解A.网瘾少年很好很好的贪心题。弱化版是[CSP-J2023]公路,这题没有油箱限制。首先判掉无解:存在\(d_i>T\)。用单调栈求\(nxt_i\)表示\(i\)之后第一个油价比\(i\)低的位置,没有为\(n+1\)(终点)。因为\(nxt_i\)的油价比\(i\)低,所以你肯定......
  • 信息学奥赛复赛复习07-CSP-J2020-03表达式前置知识点-结构体、链表、链式前向星
    PDF文档公众号回复关键字:2024093012020CSP-J题目1优秀的拆分[题目描述]链式前向星模板题,读入n个点,m条边,以及flag,若flag==1则图有向,否则无向。对每个点输出它的每一条边[输入格式]第一行三个数n,m,flag,题意如上所示第2~1+m行,每行三个数,x,y,z,代表从x到y有一条长为z的......
  • 『模拟赛』CSP-S模拟5
    Rank烂A.median签。你说得对,但是赛时嗯打150行5k代码超级分讨过了。因为容斥做的不好,求总的然后减总会差点东西,所以直接分着加。发现如果中位数在这五个数中不止出现一次那么就会算重,所以分三种大情况考虑。一,中位数只有一个。那么此时我们需要找到另外两个小于它的......
  • [37](CSP 集训)CSP-S 模拟 7
    A.median你说得对,但是你知道怎么不排序求中位数吗inlineintmid(inta1,inta2,inta3,inta4,inta5){ intd=-inf,x=inf,cd=-inf,cx=inf; if(a1>d)cd=d,d=a1; elseif(a1>cd)cd=a1; if(a1<x)cx=x,x=a1; elseif(a1<cx)cx=a1; if(a2>d)cd=d,d=a2; elseif(a2>......