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

暑假集训CSP提高模拟24

时间:2024-08-19 15:07:10浏览次数:13  
标签:24 cnt 400010 ll 集训 vis freopen CSP dis

暑假集训CSP提高模拟24

\(T1\) P268.与和 \(100pts\)

  • 原题: [ABC238D] AND and SUM

  • \(x,y\) 下界显然为 \(a\) ,不妨让 \(y=a,x=s-a\) 然后进行 \(check\) 。正确性由下一种做法可以进一步推导。

    点击查看代码
    int main()
    {
    	freopen("and.in","r",stdin);
    	freopen("and.out","w",stdout);
    	ll t,a,s,i;
    	scanf("%lld",&t);
    	for(i=1;i<=t;i++)
    	{
    		scanf("%lld%lld",&a,&s);
    		if(2*a<=s&&((s-a)&a)==a)
    		{
    			printf("Yes\n");
    		}
    		else
    		{
    			printf("No\n");
    		}
    	}
    	fclose(stdin);
    	fclose(stdout);
    	return 0;
    }
    
  • 一个更通用且容易证明的方法是 \(s-2a\) 在二进制表示下 \(1\) 的位置只能出现 \(a\) 在二进制表示下 \(0\) 的位置上,以此来进行 \(check\) 。

    • \(1\) 的位置不妨都让 \(x\) 这一位为 \(1\) ,接着便有了上面第一种做法。
    点击查看代码
    int main()
    {
    	freopen("and.in","r",stdin);
    	freopen("and.out","w",stdout);
    	ll t,a,s,i;
    	scanf("%lld",&t);
    	for(i=1;i<=t;i++)
    	{
    		scanf("%lld%lld",&a,&s);
    		if(2*a<=s&&((s-2*a)&(~a))==(s-2*a))
    		{
    			printf("Yes\n");
    		}
    		else
    		{
    			printf("No\n");
    		}
    	}
    	fclose(stdin);
    	fclose(stdout);
    	return 0;
    }
    

\(T2\) P239.函数 \(10pts\)

  • 原题: [ABC366F] Maximum Composition

  • 部分分

    • \(30pts\) :状压。

      点击查看代码
      ll a[200010],b[200010],f[2][(1<<20)+10];
      int main()
      {
      	freopen("func.in","r",stdin);
      	freopen("func.out","w",stdout);
      	ll n,k,maxx,ans=0,s,i,j;
      	cin>>n>>k;
      	for(i=1;i<=n;i++)
      	{
      		cin>>a[i]>>b[i];
      	}
      	for(s=0;s<=(1<<n)-1;s++)
      	{
      		f[0][s]=1;
      	}
      	for(i=1;i<=k;i++)
      	{
      		for(s=0;s<=(1<<n)-1;s++)
      		{
      			maxx=0;
      			for(j=1;j<=n;j++)
      			{
      				if((s>>(j-1))&1)
      				{
      					maxx=max(maxx,a[j]*f[(i-1)&1][s^(1<<(j-1))]+b[j]);
      				}
      			}
      			f[i&1][s]=maxx;
      		}
      	}
      	for(s=0;s<=(1<<n)-1;s++)
      	{
      		ans=max(ans,f[k&1][s]);
      	}
      	cout<<ans<<endl;
      	fclose(stdin);
      	fclose(stdout);
      	return 0;
      }
      
  • 正解

    • 观察到 \(DP\) 式子很容易想,但选择顺序貌似很难处理。
    • 考虑推式子,假设 \(f_{j}(f_{i}(x))>f_{i}(f_{j}(x))\) ,式子展开后有 \(a_{j}b_{i}+b_{j}>a_{i}b_{j}+b_{i}\) ,移项后有 \(\dfrac{b_{i}}{a_{i}-i}>\dfrac{b_{j}}{a_{j}-i}\) 。
    • 将 \(\{ f \}\) 按 \(\dfrac{b}{a-1}\) 降序排序,实际排序时将除法转成乘法。
    • 设 \(f_{i,j}\) 表示处理到第 \(i\) 个数时选择了 \(j\) 个数的最大值,状态转移方程为 \(f_{i,j}=\max(f_{i-1,j},a_{i}f_{i-1,j-1}+b_{i})\) ,边界为 \(f_{0,0}=1\) 。
    • 最终有 \(f_{n,k}\) 即为所求。
    点击查看代码
    struct node
    {
    	ll a,b;
    }c[200010];
    ll f[200010][15];
    bool cmp(node a,node b)
    {
    	return a.b*(b.a-1)>b.b*(a.a-1);
    }
    int main()
    {
    	ll n,k,i,j;
    	cin>>n>>k;
    	for(i=1;i<=n;i++)
    	{
    		cin>>c[i].a>>c[i].b;
    	}
    	sort(c+1,c+1+n,cmp);
    	f[0][0]=1;
    	for(i=1;i<=n;i++)
    	{
    		for(j=0;j<=k;j++)
    		{
    			f[i][j]=f[i-1][j];
    			if(j-1>=0)
    			{
    				f[i][j]=max(f[i][j],c[i].a*f[i-1][j-1]+c[i].b);
    			}
    		}
    	}
    	cout<<f[n][k]<<endl;
    	return 0;
    }
    

\(T3\) P238.袋鼠 \(6pts\)

  • 原题: luogu P5999 [CEOI2016] kangaroo
  • 部分分
    • \(6pts\) :爆搜。

      点击查看代码
      const ll p=1000000007;
      ll vis[2010],ans=0;
      void dfs(ll now,ll prev,ll sum,ll t,ll n)
      {
      	if(now==t)
      	{
      		ans=(ans+(sum==n))%p;
      	}
      	else
      	{
      		if(prev<now)
      		{
      			for(ll i=1;i<now;i++)
      			{
      				if(vis[i]==0)
      				{
      					vis[i]=1;
      					dfs(i,now,sum+1,t,n);
      					vis[i]=0;
      				}
      			}
      		}
      		else
      		{
      			for(ll i=now+1;i<=n;i++)
      			{
      				if(vis[i]==0)
      				{
      					vis[i]=1;
      					dfs(i,now,sum+1,t,n);
      					vis[i]=0;
      				}
      			}
      		}
      	}
      }
      int main()
      {
      	freopen("kang.in","r",stdin);
      	freopen("kang.out","w",stdout);
      	ll n,s,t,i;
      	cin>>n>>s>>t;
      	for(i=1;i<=n;i++)
      	{
      		if(i!=s)
      		{
      			memset(vis,0,sizeof(vis));
      			vis[i]=vis[s]=1;
      			dfs(i,s,2,t,n);
      		}
      	}
      	cout<<ans<<endl;
      	fclose(stdin);
      	fclose(stdout);
      	return 0;
      }
      
  • 正解

\(T4\) P240.最短路 \(8pts\)

  • 原题: CF464E The Classic Problem
  • 部分分
    • \(1 \sim 2\) :直接跑最短路,最后再取模。

      点击查看代码
      const ll p=1000000007;
      struct node
      {
      	ll nxt,to,x,w;
      }e[400010];
      ll head[400010],dis[400010],vis[400010],u[400010],v[400010],x[400010],cnt=0;
      void add(ll u,ll v,ll x,ll w)
      {
      	cnt++;
      	e[cnt].nxt=head[u];
      	e[cnt].to=v;
      	e[cnt].x=x;
      	e[cnt].w=w;
      	head[u]=cnt;
      }
      void dijstra(ll s,ll n)
      {
      	fill(dis+1,dis+1+n,1e18);
      	memset(vis,0,sizeof(vis));
      	priority_queue<pair<ll,ll> >q;
      	dis[s]=0;
      	q.push(make_pair(-dis[s],-s));
      	while(q.empty()==0)
      	{
      		ll x=-q.top().second;
      		q.pop();
      		if(vis[x]==0)
      		{
      			vis[x]=1;
      			for(ll i=head[x];i!=0;i=e[i].nxt)
      			{
      				if(dis[e[i].to]>dis[x]+e[i].w)
      				{
      					dis[e[i].to]=dis[x]+e[i].w;
      					q.push(make_pair(-dis[e[i].to],-e[i].to));
      				}
      			}
      		}		
      	}
      }
      int main()
      {
      	freopen("hellagur.in","r",stdin);
      	freopen("hellagur.out","w",stdout);
      	ll n,m,s,t,flag=1,i;
      	cin>>n>>m;
      	for(i=1;i<=m;i++)
      	{
      		cin>>u[i]>>v[i]>>x[i];
      		flag&=(x[i]<=30);
      	}
      	cin>>s>>t;
      	if(flag==1)
      	{
      		for(i=1;i<=m;i++)
      		{
      			add(u[i],v[i],x[i],(1ll<<x[i]));
      			add(v[i],u[i],x[i],(1ll<<x[i]));
      		}
      		dijstra(s,n);
      		if(dis[t]==1e18)
      		{
      			cout<<-1<<endl;
      		}
      		else
      		{
      			cout<<dis[t]%p<<endl;
      		}
      	}
      	else
      	{
      		cout<<"-1"<<endl;
      	}
      	fclose(stdin);
      	fclose(stdout);
      	return 0;
      }
      
    • \(8 \sim 9\) :观察到 \(x_{i}\) 互不相同,在最短路的更新过程一定不会产生进位(若产生了说明这条边重复走过,显然不优),且比较时只按二进制下最高位比较即可。具体实现时用二进制表示到每个点的最短路长度,可能需要一些诸如 short方法来保证空间复杂度正确。

总结

  • \(T2\) 赛前 \(5 \min\) 把原状压改成了爆搜想节省空间,结果挂了 \(20pts\) 。
  • \(T4\) 赛前 \(10 \min\) 发现把 freopen("hellagur.out","w",stdout); 写成了 freopen("hellagur.out","r",stdin);
  • 感觉自己偏随机化和乱搞做法的题不是很敢写,明知没有正确性的做法被自己 \(Pass\) 掉就没尝试写过看实际能拿多少分。

后记

标签:24,cnt,400010,ll,集训,vis,freopen,CSP,dis
From: https://www.cnblogs.com/The-Shadow-Dragon/p/18367260

相关文章

  • 2024年新版Python零基础从入门到进阶学习路线!
    Python基础初始Python基础语法流程控制-选择结构流程控制-循环结构字符串和正则函数入门函数高级数据结构-列表和元组数据结构-字典和集合IO和文件操作文件操作进阶面向对象入门面向对象三大特性面向对象应用异常处理常用内置模块序列化模块网络请求模块MySQL入门MySQL命......
  • test 2024.8.19
    test考试时PUCK:我们攻克了一个技术问题,现在可以用c++14了结果:评测机发神经吃我100分T1T2T3T4没错就是这道吃了我100pts一眼可以发现是一个很典的最大费用最大流模型,暴力建图发现边数\(n^2\)不可过注意到曼哈顿距离是两个绝对值构成的注意到\(|a|+|b|=\max(a+b,-a......
  • 题解:P10844 [EGOI2024] Infinite Race / 无限赛跑
    题解:P10844[EGOI2024]InfiniteRace/无限赛跑有n个人在环形跑道上跑步,和q次超越别人或被别人超越,别人要么在Anika前面,要么在后面怎么说呢,建议降红由于只有重复超过一个人才肯定是跑过一圈的,所以一个数组就行了,每超过一次就打上标记,不然去掉标记。#include<bits/stdc......
  • cdrx4专业版汉化免费安装包下载2024最新
    最近,我终于用上了CorelDRAWX4!这款软件的最新版本真的让我大开眼界,它不仅拥有强大的绘图和设计功能,还加入了一些让人惊喜的新特性。我要说的是,CorelDRAWX4的界面更加简洁明了了。所有的工具和菜单都被重新组织,使得用户能够更快速地找到所需的功能。而且,它还新增了一些实用的......
  • cdr软件X4破解版本安装包下载2024最新
    “coreldrawx4”的更新,让设计师们再次燃起了对这款软件的期待与好奇。作为一款专业的矢量图形绘制软件,它不仅拥有强大的绘图工具和丰富的特效资源,还提供了便捷的操作界面和高效的工作流程,是设计师们不可或缺的得力助手。在新版本中,“coreldrawx4”带来了多项令人惊喜的新功能......
  • hbu2024暑假进阶训练营开营测试
    目录7-1考试成绩7-2心理阴影面积7-1考试成绩题目RainSure同学在参加一场面试,一共有n道题目,他的初始分数为m分。RainSure回答错一道题目就会扣一分,但是分数不会小于0;回答正确一道题目就会加一分。给定一个长度为n的字符串,第i个字符如果为o,代表第i道题目RainSur......
  • 2024年高教社杯数学建模国赛B题思路解析+代码+论文
    2024年高教社杯全国大学生数学建模竞赛(以下简称国赛)将于9月5日晚6时正式开始。下文包含:2024国赛思路解析​、国赛参赛时间及规则信息说明、好用的数模技巧及如何备战数学建模竞赛C君将会第一时间发布选题建议、所有题目的思路解析、相关代码、参考文献、参考论文等多项资料,帮......
  • 2024年新SCI顶刊算法蛇鹭优化算法SBOA优化Transformer-LSTM模型的多变量时间序列预测
    matlabR2024a以上一、数据集二、2024年新SCI顶刊算法蛇鹭优化算法SBOA2024年,YFu受到自然界中鹭鹰生存行为启发,提出了鹭鹰优化算法(SecretaryBirdOptimizationAlgorithm,SBOA)。2.1算法思想SBOA生存需要不断地寻找猎物和躲避捕食者的追捕,探索阶段模拟鹭鹰捕食蛇,而......
  • 不用再找了,国内无限制使用GPT4o的方法【2024年最新】
     都知道ChatGPT很强大,聊聊天、写论文、搞翻译、写代码、写文案、审合同等等,无所不能~那么到底怎么使用呢?其实很简单了,国内AI产品发展也很快,很多都很好用了~我一直在用,建议收藏下来~  有最先进、最新的GPT模型,还有很多其他效率工具都是在各自领域,绝对领先地位的产品~......
  • 【2024-08-17】连岳摘抄
    23:59人之相知,贵相知心。夫妇居室,使两心不相知,则决然非嘉耦。父母不知子女心,何来有慈道。子女不知父母心,何来有孝道。一切做人道理,全从心中流出。                                        ......