首页 > 其他分享 >2024.9.30 CSP

2024.9.30 CSP

时间:2024-10-10 18:23:32浏览次数:9  
标签:cnt return int 2024.9 30 偶数 vs freopen CSP

模拟赛

赛后看着分哗啦啦的往下掉。

T1 median

找中位数,赛时假做法 A 了,

没想到直接搜。。。

code
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+5,mod = 998244353;
int n;
int a[6][N],ans,f[6][4];
unordered_map<int,bool> mp;
int dfs(int p,int l,int e,int g)
{
	if(p>5) return 1;
	int res=0;
	if(l<2&&f[p][1]) res=(res+1ll*dfs(p+1,l+1,e,g)*f[p][1])%mod;
	if(f[p][2]) res=(res+1ll*dfs(p+1,l,e+1,g)*f[p][2])%mod;
	if(g<2&&f[p][3]) res=(res+1ll*dfs(p+1,l,e,g+1)*f[p][3])%mod;
	return res;
}
int main()
{
	freopen("median.in","r",stdin);
	freopen("median.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=5;i++)
	{
		for(int j=1;j<=n;j++) scanf("%d",&a[i][j]);
		sort(a[i]+1,a[i]+1+n);
	}
	for(int i=1;i<=5;i++)
	{
		for(int j=1;j<=n;j++)
		{
			int mid=a[i][j];
			if(mp[mid]) continue;
			mp[mid]=1;
			memset(f,0,sizeof(f));
			for(int k=1;k<=5;k++)
			{
				f[k][1]=upper_bound(a[k]+1,a[k]+1+n,mid)-a[k]-1;
				f[k][3]=n-(lower_bound(a[k]+1,a[k]+1+n,mid)-a[k])+1;
				f[k][2]=f[k][1]+f[k][3]-n;
				f[k][1]-=f[k][2]; f[k][3]-=f[k][2];
			}
			int res=dfs(1,0,0,0);
			ans=(ans+1ll*mid*res)%mod;
		}
	}
	printf("%d\n",ans);
	return 0;
}

T2 travel

细节较多,发现有两种情况会使 \(f\) 是发散的。

  1. 有环。

  2. 一条路径上有两个自环。

注意差分约束或者 tarjan 判环。

重学 tarjan

code
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5+5;
int n,m;
int head[N],tot,du[N],zh[N];
struct E {int u,v;} e[N<<1];
inline void add(int u,int v) {e[++tot]={head[u],v}; head[u]=tot;}
queue<int> q;
bool vs[N];
bool dfs(int u,int cnt)
{
	cnt++; vs[u]=1;
	for(int i=head[u];i;i=e[i].u)
	{
		int v=e[i].v; if(!du[v]||vs[v]) continue;
		if(dfs(v,cnt)) return 1;
	}
	return cnt>=1;
}

bool dfs1(int u,bool p)
{
	vs[u]=1; if(zh[u]) p=1;
	for(int i=head[u];i;i=e[i].u)
	{
		int v=e[i].v; if(vs[v]) continue;
		if(p&&zh[v]) return 1;
		if(dfs1(v,p)) return 1;
	}
	return 0;
}

int main()
{
	freopen("travel.in","r",stdin);
	freopen("travel.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		int x,y; scanf("%d%d",&x,&y);
		if(x==y) zh[x]++;
		else add(x,y), du[y]++;
	}
	for(int i=1;i<=n;i++) if(!du[i]) q.push(i);
	for(int i=1;i<=n;i++)
	{
		if(zh[i]>=2) {printf("Yes\n"); return 0;}
	}
	for(int i=1;i<=n;i++) if(!vs[i])
	{
		if(dfs1(i,0)) {printf("Yes\n"); return 0;}
	}
	memset(vs,0,sizeof(vs));
	while(!q.empty())
	{
		int u=q.front(); q.pop();
		for(int i=head[u];i;i=e[i].u)
		{
			int v=e[i].v; du[v]--;
			if(!du[v]) q.push(v);
		}
	}
	for(int i=1;i<=n;i++) if(du[i]&&!vs[i])
	{
		if(dfs(i,0)) {printf("Yes\n"); return 0;}
	}
	printf("No\n");
	return 0;
}

T3 game

博弈论捏。

发现 \({1,1}\) 的情况先手必输。

然后考虑有什么性质。

如果把所有数放在数轴上的话:

对于一个个数为奇数且每个数出现次数不全为偶数的局面,我们选取最大的数然后分给其他的,都能得到一个每个数都出现偶数次的局面

如果每个数都出现偶数次,那下一个状态一定不可能还是每个数出现偶数次。

所以如果一开始每一个数都出现偶数次,那么先手必输,否则后手必输。

注意判断 \(n\) 的奇偶。如果奇数个必赢。

code
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
int T,n,a[N];

int main()
{
	freopen("game.in","r",stdin);
	freopen("game.out","w",stdout);
	scanf("%d",&T);
	while(T--)
	{
		int x=0,y=0;
		scanf("%d\n",&n);
		for(int i=1;i<=n;i++) scanf("%d",&a[i]);
		sort(a+1,a+1+n);
		if(n&1) {printf("Yes\n"); continue;}
		bool fl=0;
		for(int i=1;i<n;i+=2) if(a[i]!=a[i+1]) {printf("Yes\n"); fl=1; break;}
		if(!fl) printf("No\n");
	}
	return 0;
}

标签:cnt,return,int,2024.9,30,偶数,vs,freopen,CSP
From: https://www.cnblogs.com/ppllxx-9G/p/18456886

相关文章

  • 2024.9.25 多校 模拟赛
    模拟赛假做法上大分。T1几何bitset优化dp。有空学,先挂个暴力。code#include<bits/stdc++.h>usingnamespacestd;constintN=5e5+5;intT,n,m,t;chars[N],x[55],y[55];unordered_map<int,unordered_map<int,bool>>f[N];unordered_map<int,unordered_map<i......
  • 2024.9.28 模拟赛 CSP6
    模拟赛单\(log\)双\(log\)不如三\(log\)。T1一般图最小匹配简单dp,水。\(O(n^2)\)其实也是可反悔贪心的板子,可以\(O(n\log(n))\)做。考虑排序后求差分数组,就变成不能选相邻的。然后就是可反悔贪心板子。用双向链表(记录前驱后继)维护,然后放进堆里。板dp#include<b......
  • [赛记] csp-s模拟10
    欧几里得的噩梦-pts看见是个线性基的题就没打;其实也不是线性基,只不过模拟了一下它的过程;考虑插入一位数时它能不能被表示,其实就是它异或上线性基中的某些值后可不可以为$0$,那么我们就可以将插入的单独一位数与$0$连边,将两位数互相连边,这样每插入一位数时看看它与$0$......
  • Day3 备战CCF-CSP练习
    Day3题目描述目前在一个很大的平面房间里有\(n\)个无线路由器,每个无线路由器都固定在某个点上。任何两个无线路由器只要距离不超过\(r\)就能互相建立网络连接。除此以外,另有\(m\)个可以摆放无线路由器的位置。你可以在这些位置中选择至多\(k\)个增设新的路由器。你的......
  • DDA3020 Learning of Linear Regression
    DDA3020Homework1Duedate:Oct14,2024InstructionsThedeadlineis23:59,Oct14,2024.Theweightofthisassignmentinthefinalgradeis20%.Electronicsubmission:TurninsolutionselectronicallyviaBlackboard.Besuretosubmityourhomework......
  • [赛记] csp-s模拟8 && csp-s模拟9
    HZOI大作战15pts赛时暴力跳父亲15pts;正解:发现在树上对于向上找大于这个数的操作具有随意划分性,所以考虑倍增,设$f_{i,j}$表示从$i$这个点向上跳$2^j$个比它大的数能跳到哪里,于是我们只需处理出向上跳一个(也就是$f_{i,0}$)的,然后$ST$表预处理即可;具体地,对于......
  • PTA 作业三 继承与多态 JAVA 面向对象程序设计7-1 周长计算器-1分数 30作者 Ma 单位
    7-1周长计算器-1分数30作者 Ma单位 山东科技大学1、定义一个接口Shape用于表示图形,其包含一个doublelength()的方法用于求周长。2、定义三角形类Triangle、长方形类Rectangle、圆形类Circle分别实现接口Shape3、定义测试类ShapeTest并使用Shape接口定义变......
  • 20222306 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    1.实验内容1.1本周学习内容①Linux基础知识基本的shell命令(例如:ls、cd、cp、touch、cat、su等等)在Linux中熟练使用编译器gcc、调试器gdb,尤其是gdb调试指令(例如:设置断点break/clear、启用/禁用断点enable/disable、运行程序run、继续运行continue、单步代码跟入函数step、查看......
  • 2024.9.27 模拟赛 CSP5
    模拟赛无T1光题贪心,发现首先让最大的减\(4\),这样最优并且不会涉及向下取整,等到数据范围小了以后直接\(O(n^4)\)暴力枚举。code#include<bits/stdc++.h>usingnamespacestd;inta,b,c,d;intans=1e9;#definemx(x,y)(x>y?(x):(y))#definemi(x,y)(x<y?(x):(y......
  • GB 18030及生僻字治理
     名词解释:编码字符集codedcharacterset一组无歧义的规则,用以建立一个字符集和该字符集中的字符及其编码表示之间的对应关系,通常也指按照这种规则确定的文字的有序集合。示例:1.GB18030是我国制订的以汉字为主并包含多种我国少数民族文字(例如藏、蒙古、傣、彝、朝鲜、维......