首页 > 其他分享 >2024.9.27 模拟赛 CSP5

2024.9.27 模拟赛 CSP5

时间:2024-10-10 11:04:05浏览次数:9  
标签:tmp sz cnt 27 int 2024.9 CSP5 mx mod

模拟赛

T1 光

贪心,发现首先让最大的减 \(4\),这样最优并且不会涉及向下取整,等到数据范围小了以后直接 \(O(n^4)\) 暴力枚举。

code
#include<bits/stdc++.h>
using namespace std;
int a,b,c,d;
int ans=1e9;
#define mx(x,y) (x>y?(x):(y))
#define mi(x,y) (x<y?(x):(y))
int main()
{
	freopen("light.in","r",stdin);
	freopen("light.out","w",stdout);
	scanf("%d%d%d%d",&a,&b,&c,&d);
	int ans=0;
	while(a>4||b>4||c>4||d>4)	
	{
		int x=mx(a,mx(b,mx(c,d)));
		ans+=4;
		if(x==a) a-=4, b-=2, c-=2, d-=1;
		else if(x==b) b-=4, a-=2, d-=2, c-=1;
		else if(x==c) c-=4, a-=2, d-=2, b-=1;
		else if(x==d) d-=4, b-=2, c-=2, a-=1;
	}
	a=mx(a,0); b=mx(b,0); c=mx(c,0); d=mx(d,0);
	int tmp=1e9;
	for(int x=0;x<=a;x++)
		for(int y=0;y<=b;y++)
			for(int z=0;z<=c;z++)
			{
				int w=mx((a-x-(y>>1)-(z>>1))<<2,mx(mx(d-(x>>2)-(y>>1)-(z>>1),(c-z-(x>>1)-(y>>2))<<1),(b-y-(x>>1)-(z>>2))<<1));
				if(w<0) w=0;
				tmp=mi(tmp,x+y+z+w);
			}
	ans+=tmp;
	printf("%d\n",ans);
	return 0;
}

T2 爬

trick,按位考虑,如果爬完某个点上有奇数个蚂蚁这一位为一,那么就会有贡献。

先考虑第 \(i\) 位,点 \(u\)(\(u!=1\)),它的儿子中有 \(cnt\) 个儿子第 \(i\) 位为一。

发现这个点是否产生贡献只与自己和儿子是否跳有关,不妨直接让 \(cnt\) 表示包括自己在内,第 \(i\) 位为一的点的个数。

奇数个在这个点上的方案数就是:

\[\binom{cnt}{1}+\binom{cnt}{3}+\binom{cnt}{5}+\dots=2^{cnt-1} \]

在加上那些无关儿子任选的方案,减去只有一个点的方案,最后乘上其他点乱跳的方案,注意特判 \(1\) 号点不能向上跳。

化简后差不多都是 \(2\) 的次幂的形式,注意如果 \(cnt \lt 1\)、\(cnt \lt 2\) 的情况都要特判,因为组合数化简前无意义,不能正常化简。

code
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int N = 1e5+5,mod = 1e9+7;
int n,a[N];
vector<int> g[N];
LL _2[N],tmp,ans;
void dfs(int u,int m)
{
	for(int v:g[u]) dfs(v,m);
	int cnt=(a[u]>>m)&1,sz=1;
	for(int v:g[u]) cnt+=((a[v]>>m)&1),sz++;
	if(cnt==0||sz==1) return;
	if(u==1)
	{
		if(((a[u]>>m)&1)&&cnt>=2) tmp=(tmp+(_2[sz-2]+mod-1)%mod*_2[n-sz]%mod)%mod;
		else if(((a[u]>>m)&1)) tmp=(tmp+(_2[sz-1]+mod-1)%mod*_2[n-sz]%mod)%mod;
		else if(!((a[u]>>m)&1)) tmp=(tmp+_2[n-2]%mod)%mod;
	}
	else tmp=(tmp+(_2[sz-1]+mod-cnt)%mod*_2[n-sz-1]%mod)%mod;
}
int main()
{
	freopen("climb.in","r",stdin);
	freopen("climb.out","w",stdout);
	scanf("%d",&n);
	_2[0]=1; for(int i=1;i<=max(n,30);i++) _2[i]=(_2[i-1]<<1)%mod;
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=2;i<=n;i++) {int x; scanf("%d",&x); g[x].push_back(i);}
	for(int i=0;i<=30;i++) {tmp=0; dfs(1,i); ans=(ans+_2[i]*tmp%mod)%mod;}
	printf("%lld\n",ans);
	return 0;
}

T3 字符串

T3 放贪心…………

正解不是 DP,直接贪心。

想要吃 A、B 交替的的贡献,于是每 \(c\) 个 B 放一个 A,枚举交替放了多少组(必须枚举,不能贪心)。

然后剩下的每 \(a\) 个 A 有一个贡献,B 先补满,然后每 \(b\) 个 B 有一个贡献。

code
#include<bits/stdc++.h>
using namespace std;
int T,a,b,c,N,M;

int main()
{
	freopen("string.in","r",stdin);
	freopen("string.out","w",stdout);
	scanf("%d",&T);
	while(T--)
	{
		int ans=0;
		scanf("%d%d%d%d%d",&N,&M,&a,&b,&c);
		for(int i=0;i<=min(N,M/c);i++)
		{
			int k=i,sum=0,n=N,m=M;
			n-=k; m-=k*c; sum+=k*2;
			if(n) n--,sum++; if(m) m--,sum++; 
			sum+=n/a;
			sum+=((c-1)/b)*k; 
			int tmp=b-(c%b)+1; if(c%b==0) tmp=1;
			while(k&&m-tmp>=0) m-=tmp,sum++,k--;
			sum+=m/b;
			ans=max(ans,sum);
		}
		printf("%d\n",ans);	
	}
	return 0;
}

T4 奇怪的函数

首先容易想到,对于每一段,答案都是一个关于 \(x\) 的分段函数,分三段。

所以考虑分块或线段树维护分段函数

(懒了)

code
#include<bits/stdc++.h>
using namespace std;
const int N = 3e5+5;
int n,m,B,cnt,bl[N],s[1000],e[1000],l[1000],r[1000],rs[1000],pre[1000];
struct OP {int c,v;} op[N];

inline int f(int p)
{
	int res=0;
	for(int i=s[p];i<=e[p];i++)
		op[i].c==1?(res+=op[i].v):(op[i].c==2?(res=min(res,op[i].v)):(res=max(res,op[i].v)));
	return res;
}	

int main()
{
	freopen("function.in","r",stdin);
	freopen("function.out","w",stdout);
	scanf("%d",&n); B=sqrt(n); cnt=n/B;
	for(int i=1;i<=n;i++) scanf("%d%d",&op[i].c,&op[i].v);
	for(int i=1;i<=cnt;i++)
	{
		s[i]=e[i-1]+1; e[i]=e[i-1]+B; e[cnt]=n;
		pre[i]=0; l[i]=0; r[i]=1e9;
		for(int j=s[i];j<=e[i];j++)
		{
			bl[j]=i;
			if(op[j].c==1) pre[i]+=op[j].v;
			else if(op[j].c==2) r[i]=min(r[i],op[j].v-pre[i]);
			else if(op[j].c==3) l[i]=max(l[i],op[j].v-pre[i]);
		}
		rs[i]=f(i);
	}	
	scanf("%d",&m);
	while(m--)
	{
		int c,x,y; scanf("%d",&c);
		if(c==4)
		{
			scanf("%d",&x);
			for(int i=1;i<=cnt;i++)
			{
				if(l[i]<r[i]) 
				{
					if(x<l[i]) x=l[i];
					else if(x>r[i]) x=r[i];
					x+=pre[i];
				}
				else x=rs[i];
			}
			printf("%d\n",x);
		}
		else
		{
			scanf("%d%d",&x,&y);
			op[x].c=c; op[x].v=y;
			int p=bl[x]; pre[p]=0; l[p]=0; r[p]=1e9;
			for(int j=s[p];j<=e[p];j++)
			{
				if(op[j].c==1) pre[p]+=op[j].v;
				else if(op[j].c==2) r[p]=min(r[p],op[j].v-pre[p]);
				else if(op[j].c==3) l[p]=max(l[p],op[j].v-pre[p]);				
			}
			rs[p]=f(p);
		}
	}
	return 0;
}

标签:tmp,sz,cnt,27,int,2024.9,CSP5,mx,mod
From: https://www.cnblogs.com/ppllxx-9G/p/18448370

相关文章

  • P6277 [USACO20OPEN] Circus P
    做法来自浙江队长,因为其他的题解我一篇都看不懂。考察一条极长的二度链C,即左右端点度数不为\(2\),中间的点度数都等于\(2\),它把整张图分成了左右两部分A和B(端点既属于AB也属于C)。如果\(|C|\gen-k\),那么A和B都一定被占满了,C上的点一定会阻挡A和B之间互换,所......
  • 【读书笔记-《30天自制操作系统》-26】Day27
    本篇内容不多,主要是一些优化的工作。首先优化了应用程序,然后引入对应用程序的保护功能,最后引入库的概念。1.应用程序优化首先来解决上一篇中遗留的一个bug:使用ncst命令运行的应用程序,按下Shift+F1或者点击x按钮都无法关闭。分析上一篇新增的代码,没有发现问题,因此这个......
  • DAY27||回溯算法基础 | 77.组合| 216.组合总和Ⅲ | 17.电话号码的字母组合
    回溯算法基础知识一种效率不高的暴力搜索法。本质是穷举。有些问题能穷举出来就不错了。回溯算法解决的问题有:组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条件的子集排列问题:N个数按一定规......
  • 20222327 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    一.实验内容1.了解Linux系统下的基本操作命令,能够处理一些命令出现的error。2.掌握了栈与堆的概念以及在进程内存管理中的应用。3.了解基本的汇编语言指令及其功能。4.能够深刻理解BoF的原理以及如何运用payload完成BoF的攻击二.实验过程任务一直接修改程序机器指令,改变程......
  • python——celery异常consumer: Cannot connect to redis://127.0.0.1:6379/1: MISCON
    1.检查Redis日志:查看Redis的日志文件(通常位于/var/log/redis/redis-server.log或者根据你的配置文件中指定的位置),以获取有关错误原因的详细信息。2.检查磁盘空间:确保你的服务器有足够的磁盘空间。使用以下命令检查磁盘使用情况:bashdf-h如果磁盘空间不足,清理一些不必......
  • leetcode 刷题day37动态规划Part06背包问题( 322. 零钱兑换、279.完全平方数、139.单词
    322.零钱兑换思路:每种硬币的数量是无限的,是典型的完全背包问题。但是题目要求等于目标值的最小硬币个数。所以这里需要对动规五部曲进行分析。动规五部曲:1、确定dp数组以及下标的含义dp[j]:凑足总额为j所需钱币的最少个数为dp[j]2、确定递推公式凑足总额为j-coins[i......
  • SSM手游账号交易系统u2741 在线充值 购物车
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统内容:用户,游戏分类,手游账号,在线咨询,订单信息开题报告内容一、研究背景与意义随着数字化时代的发展,网络游戏已成为全球娱乐产业的重要组成部分,游戏账号......
  • 2024.9
    1.ARC130EIncreasingMinimum好莫名奇妙的题,不知道省选前为啥没做出来。直接变成分段问题:第\(i\)段的表示说这些元素在遍历到(没有做加法前)取值都为\(i\)。一个合法的分段方式需要满足:\(x\)在一个段里不重复出现。若\(x\)在第\(i\)段出现,则必须在\(j\gti\)段......
  • 20222427 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    1.实验内容(1)本周学习内容1.学习缓冲区溢出的基本原理。2.重温栈与堆的概念以及执行流程。3.逐步熟悉Linux系统对文件的处理流程,掌握基础的汇编与反汇编语言。(2)本周实验任务1.手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。2.利用foo函数的Bof漏洞,构造一个攻......
  • P3527 MET-Meteors 题解
    Solution单次二分:二分时间,做这个时间前的所有操作,然后线性统计。注意到可以整体二分,直接整体二分是\(O(n\log^2n)\)。考虑扫描序列,用线段树维护每个时间段内该位置的增加值,差分一下可以实现。将这棵线段树持久化一下,一个国家所有位置同时二分即可\(O(n\logn)\),可惜空间太......