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

暑假集训CSP提高模拟1

时间:2024-07-18 18:51:55浏览次数:6  
标签:cnt frac limits 位不为 ll 集训 暑假 sum CSP

暑假集训CSP提高模拟1

\(T1\) T2687. Start

\(T2\) T807. mine

  • 原题: CF404D Minesweeper 1D

  • 设 \(f_{i,0/1/2/3/4}\) 分别表示处理到第 \(i\) 位时,第 \(i\) 位为雷/第 \(i\) 位不为雷,第 \(i-1,i+1\) 位不为雷/第 \(i\) 位不为雷,第 \(i-1\) 位不为雷,第 \(i+1\) 位为雷/第 \(i\) 位不为雷,第 \(i-1\) 位为雷,第 \(i+1\) 位不为雷/第 \(i\) 位不为雷,第 \(i-1,i+1\) 位为雷的方案数,状态转移方程(如果存在这个状态的话)为 \(\begin{cases} f_{i,0}=f_{i-1,0}+f_{i-1,2}+f_{i-1,4} \\ f_{i,1}=f_{i-1,1}+f_{i-1,3} \\ f_{i,2}=f_{i-1,1}+f_{i-1,3} \\ f_{i,3}=f_{i-1,0} \\ f_{i,4}=f_{i-1,0} \end{cases}\) ,边界为 \(f_{0,1}=f_{0,2}=1\) 。

  • 最终,有 \(f_{|s|,0}+f_{|s|,1}+f_{|s|,3}\) 即为所求。

    点击查看代码
    const ll p=1000000007;
    ll f[1000010][5];
    char s[1000010];
    int main()
    {
    	ll n,i;
    	cin>>(s+1);
    	n=strlen(s+1);
    	f[0][1]=f[0][2]=1;
    	for(i=1;i<=n;i++)
    	{
    		if(s[i]=='?')
    		{
    			f[i][0]=(f[i-1][0]+f[i-1][2]+f[i-1][4])%p;
    			f[i][1]=(f[i-1][1]+f[i-1][3])%p;
    			f[i][2]=(f[i-1][1]+f[i-1][3])%p;
    			f[i][3]=f[i-1][0];
    			f[i][4]=f[i-1][0];
    		}
    		if(s[i]=='*')
    		{
    			f[i][0]=(f[i-1][0]+f[i-1][2]+f[i-1][4])%p;
    		}
    		if(s[i]=='0')
    		{
    			f[i][1]=(f[i-1][1]+f[i-1][3])%p;
    		}
    		if(s[i]=='1')
    		{
    			f[i][2]=(f[i-1][1]+f[i-1][3])%p;
    			f[i][3]=f[i-1][0];
    		}
    		if(s[i]=='2')
    		{
    			f[i][4]=f[i-1][0];
    		}
    	}
    	cout<<(f[n][0]+f[n][1]+f[n][3])%p<<endl;
    	return 0;
    }
    
  • 貌似还有列出方程组后,手动解带状矩阵,求自由元数量的高级做法,但我不会,暂时咕了。

\(T3\) T2790. 小凯的疑惑

  • 最终能组成的数一定能表示成 \(k \times \gcd(x,y)(k \in \mathbb{N})\) 的形式,即最终能组成的数 \(\bmod \gcd(x,y)=0\) 。

  • 当 \(d \ne 1\) 时存在无数个正整数不能被如此表示。

  • 当 \(d=1\) 时

    • 由弱化版 luogu P3951 [NOIP2017 提高组] 小凯的疑惑 / [蓝桥杯 2013 省] 买不到的数目 的结论,有不能被 \(x,y\) 表示的最大整数为 \(xy-x-y\) 。
    • 又因为剩余系的性质,有当 \(a\) 跑遍模 \(y\) 的完全剩余系时 \(ax\) 也跑遍模 \(y\) 的完全剩余系。
    • 考虑从完全剩余系入手,枚举 \(a \in [0,y)\) 即可不重不漏地算完。
      • 设 \(c=ax+by(b \le 0 \le a)\) ,移项有 \(ax-c=-by\) 。当 \(ax\) 确定时,因为 \(c \ge 1\) 有 \(-b \in [1, \left\lfloor \dfrac{ax}{y} \right\rfloor]\) 。
    • 最终,有 \(\begin{aligned} \sum\limits_{i=0}^{y-1} \left\lfloor \frac{ix}{y} \right\rfloor &=\frac{\sum\limits_{i=0}^{y-1} (ix)-\sum\limits_{i=0}^{y-1} (ix \bmod y)}{y} \\ &=\frac{x \times \sum\limits_{i=0}^{y-1}i-\sum\limits_{i=0}^{y-1}i}{y} \\ &=\frac{\frac{xy(y-1)}{2}-\frac{y(y-1)}{2}}{y} \\ &=\frac{(x-1)(y-1)}{2} \end{aligned}\) 即为所求。
    点击查看代码
    ll gcd(ll a,ll b)
    {
    	return b?gcd(b,a%b):a;
    }
    int main()
    {
    	ll x,y;
    	cin>>x>>y;
    	cout<<(gcd(x,y)==1?(x-1)*(y-1)/2:-1)<<endl;
    	return 0;
    }
    

\(T4\) T2810. 春节十二响

  • 原题: luogu P5290 [十二省联考 2019] 春节十二响

  • 对于以 \(x\) 为根的子树内的节点分段时一定是和以 \(fa_{x}\) 为根的子树内除以 \(x\) 为根的子树外的其他子树的节点在同一个段。

  • 从贪心的角度分析,大的数和大的数在一起一定是最优的,优先队列或可并堆维护。

  • 启发式合并维护即可。

    点击查看代码
    struct node
    {
    	ll nxt,to;
    }e[200010];
    ll head[200010],a[200010],cnt=0;
    priority_queue<ll>q[200010],ls;
    void add(ll u,ll v)
    {
    	cnt++;
    	e[cnt].nxt=head[u];
    	e[cnt].to=v;
    	head[u]=cnt;
    }
    void dsu_merge(ll x,ll y)
    {
    	if(q[x].size()<q[y].size())
    	{
    		swap(q[x],q[y]);
    	}
    	while(q[y].empty()==0)
    	{
    		ls.push(max(q[x].top(),q[y].top()));
    		q[x].pop();
    		q[y].pop();
    	}
    	while(ls.empty()==0)
    	{
    		q[x].push(ls.top());
    		ls.pop();
    	}
    }
    void dfs(ll x)
    {
    	for(ll i=head[x];i!=0;i=e[i].nxt)
    	{
    		dfs(e[i].to);
    		dsu_merge(x,e[i].to);
    	}
    	q[x].push(a[x]);
    }
    int main()
    {
    	ll n,u,v,ans=0,i;
    	cin>>n;
    	for(i=1;i<=n;i++)
    	{
    		cin>>a[i];
    	}
    	for(i=2;i<=n;i++)
    	{
    		cin>>u;
    		v=i;
    		add(u,v);
    	}
    	dfs(1);
    	while(q[1].empty()==0)
    	{
    		ans+=q[1].top();
    		q[1].pop();
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    

总结

后记

标签:cnt,frac,limits,位不为,ll,集训,暑假,sum,CSP
From: https://www.cnblogs.com/The-Shadow-Dragon/p/18309828

相关文章

  • 【比赛】暑假集训CSP提高模拟1
    T1Start10Pts题面(较长)大模拟。点击查看代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintinf=INT_MAX;stringnm[10]={"","D","B","A","C","E","PASS","......
  • 2023HACSP-J补测
    都快忘了自己还打过这个比赛了,所以来补一下。完整题目在这里查看。Day0来到郑州,寻找考场。幸好提前来了,因为考场大门就5m宽(HA用不用这么穷啊喂,来JZYZ不好么),开车转了20min才找到。旅馆离考场很近,走路就能到。和zjyDALAO住隔壁,晚上去他那里写了一会题就去睡了。Day1早上......
  • 2024 暑假集训杂题选做
    目录写在前面CF1981DCF1992F写在最后写在前面我是飞物。CF1981D2400妈的好诡异的题场上拿到这题我都不知道我要干啥呃呃考虑到每个合数均为若干质数的乘积,则若构造方案中有合数,可以将合数替换为质数从而减少使用的权值的种类数,于是仅需考虑使用质数构造,则此时并不需要考虑具......
  • 【java计算机毕设】网上购书管理系统MySQL servlet JSP项目设计源代码 期末寒暑假作业
    目录1项目功能2项目介绍3项目地址1项目功能【java计算机毕设】网上购书管理系统MySQLservletJSP项目设计源代码期末寒暑假作业小组作业 2项目介绍系统功能:servlet网上购书管理系统包括管理员、用户两种角色。管理员功能包括订单管理(已处理,未处理),顾客管理(添......
  • 2024信友队蓝润暑期集训提高1班②Day6
    知识总结拓扑排序给定一个有向图,找到一个拓扑排序,使得图中所有顶点都在拓扑排序中出现,且任意两个相邻顶点间都有路径相连。算法:找到入度为0的顶点,加入拓扑排序序列。对于剩余的顶点,如果其入度为0,则加入拓扑排序序列;否则,将其所有入边的顶点的入度减1。重复步骤2,直到所......
  • 暑假Java自学每日进度总结1
    今日所学:一.常用的cmd命令:1>盘符:2>dir(显示当前文件所有目录)3>cd目录(打开该目录)4>cd..(回到上一目录)5>cd(回到当前盘符初始态)6>cls(清屏)7>exit(退出cmd命令界面)8>cd目录1\目录2...(打开多级目录)二.创建用cmd打开软件的快捷方式:使用环境变量:1>电脑2>属性3>高......
  • 2024QBXT暑假j组精英营Day2
    \(一\)\(数据结构\)\(1\)\(链表\)\(1.0\)\(介绍\)链表分为单向链表和双向链表单向链表即当前链表只指向下一个元素双向链表即对于每个元素,记录其前面一个元素,也记录其后面一个元素。链表不建议使用STL的某些元素进行替代,手写链表更为方便。\(1.1\)\(单向链表\)\(1.......
  • 喜欢dp动态规划的第二天(暑假提升)
    不要失去信心,只要坚持不懈,就终会有成果。——钱学森dp动态规划题目详解--第二天前言1、最长定差子序列2、最长等差数列3、等差数列划分II-子序列4、回文子串5、总结前言由于上一期的动态规划我觉的太过于繁琐,所以这次简化一下操作,题目概念解析将不会再写,我直......
  • 暑期集训shellcode5(手搓机器码)
    拖进ida里面反汇编再让人工智能分析(我是废物)(后来给源码了,直接上源码)#include<string.h>#include<stdio.h>#include<stdlib.h>#include<inttypes.h>#include<capstone/capstone.h>#include<sys/mman.h>intupkeep(){setvbuf(stdin,NULL,_IONB......
  • 2024信友队蓝润暑期集训提高1班②Day1
    知识总结原理:每一步都采取局部最优解,取到最终的最优解。常见时间复杂度$O(n)$或$O(nlog(n))$后者一般带排序。用法:通过数据规模和题目信息联想贪心算法常见时间复杂度猜测结论验证合理性​-归纳法​-反证法(相邻交换法):如果交换方案中相邻的两个元素/任意......