CSP11

news/2024/11/15 11:06:37/文章来源:https://www.cnblogs.com/wlesq/p/18330136

CSP11

T1

image

暴力
#include <bits/stdc++.h>
#define speed() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define ll long long
#define ull unsigned long long
#define lid (rt<<1)
#define rid (rt<<1|1)
// #define endl '\n'
//#define int long long
#define pb push_back// #pragma comment(linker, ¡°/STACK:512000000,512000000¡±) 
using namespace std;
const int N = 2e5+5,mod=1e9+7,inf=1e9;
int n,m,dis[N];bool vis[N];
vector <int> edge[N];
struct Node
{int dis,u;bool operator < (const Node& A)const{return dis>A.dis;}
};
int st,en;
void dij(int st)
{for(int i=1;i<=n;i++)dis[i]=1e9;priority_queue <Node> q;q.push({0,st});dis[st]=0;while(q.size()){int u=q.top().u;q.pop();if(vis[u])continue;vis[u]=1;for(auto to:edge[u]){if(vis[to])continue;if(dis[to]>dis[u]+1){dis[to]=dis[u]+1;q.push({dis[to],to});}}}
}
inline ll dfs(const int u,const int step,const int tg)
{if(step>tg||(step==tg&&u!=en))return 0;//这两个特判优化不少if(u==en)return step==tg;vis[u]=1;ll res=0;for(auto to:edge[u]){if(vis[to])continue;res=(dfs(to,step+1,tg)+res)%mod;}vis[u]=0;return res;
}
int main()
{speed();
//	freopen("Fate1.in","r",stdin);
//	 freopen("Fate9.in","r",stdin);// freopen("in.in","r",stdin);// freopen("out.out","w",stdout);cin>>n>>m;cin>>st>>en;// cout<<"**********"<<endl;int u,v;for(int i=1;i<=m;i++){cin>>u>>v;edge[u].pb(v);edge[v].pb(u);}dij(st);memset(vis,0,sizeof vis);int tg=dis[en]+1;cout<<dfs(st,0,tg);return 0;
}

我们其实没必要\(dfs\)找一遍,其实可以直接\(BFS\),从起点开始,\(f\)表示最短路径的数量,\(g\)表示最短路径+1的数量
如何转移?,设当前为\(u->to\),\(dis_u==dis_{to}则g_{u}+=f_{to}\)\(dis_{to}=dis_u+1,则g_{to}+=g_u,f_{to}+=f_u\)
注意顺序一定不能换,否则\(g_u\)不上

点击查看代码
#include <bits/stdc++.h>
#define speed() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define ll long long
#define ull unsigned long long
#define lid (rt<<1)
#define rid (rt<<1|1)
// #define endl '\n'
//#define int long long
#define pb push_back
#define pii pair<int,int>
// #pragma comment(linker, ¡°/STACK:512000000,512000000¡±) 
using namespace std;
const int N = 2e5+5,mod=1e9+7,inf=1e9;
int n,m,dis[N],g[N],f[N],id[N];bool vis[N];
vector <int> edge[N];
vector <pii> G;
struct Node
{int dis,u;bool operator < (const Node& A)const{return dis>A.dis;}
};
int st,en;
void dij(int st)
{for(int i=1;i<=n;i++)dis[i]=1e9;priority_queue <Node> q;q.push({0,st});dis[st]=0;while(q.size()){int u=q.top().u;q.pop();if(vis[u])continue;vis[u]=1;for(auto to:edge[u]){if(vis[to])continue;if(dis[to]>dis[u]+1){dis[to]=dis[u]+1;q.push({dis[to],to});}}}
}
// unordered_map <int,map<int,int>> dp;
// inline ll dfs(const int u,const int step,const int tg)
// {
// 	if(step>tg||(step==tg&&u!=en))return 0;
// 	if(u==en)return step==tg;
// 	if(dp[u][step])return dp[u][step];
// 	// cout<<step<<endl;
// 	vis[u]=1;
// 	ll res=0;
// 	for(auto to:edge[u])
// 	{
// 		if(vis[to])continue;
// 		res=(dfs(to,step+1,tg)+res)%mod;
// 	}
// 	vis[u]=0;
// 	return dp[u][step]=res;
// }
int main()
{speed();
//	freopen("Fate1.in","r",stdin);
//	 freopen("Fate9.in","r",stdin);// freopen("in.in","r",stdin);// freopen("out.out","w",stdout);cin>>n>>m;cin>>st>>en;// cout<<"**********"<<endl;int u,v;G.pb({0,0});for(int i=1;i<=m;i++){cin>>u>>v;G.pb({u,v});edge[u].pb(v);edge[v].pb(u);}dij(st);memset(vis,0,sizeof vis);auto ans=[&](int st,int en){queue <int> q;q.push(st);f[st]=1;// vis[st]=1;while(q.size()){int u=q.front();q.pop();// if(vis[u])continue;// vis[u]=1;for(auto to:edge[u]){if(dis[u]==dis[to]){g[u]+=f[to];g[u]%=mod;// q.push(to);}}for(auto to:edge[u]){if(dis[to]==dis[u]+1){g[to]+=g[u];f[to]+=f[u];g[to]%=mod;f[to]%=mod;if(!vis[to])vis[to]=1,q.push(to);}}}return g[en];};ll p=ans(st,en);cout<<p<<endl;return 0;
}

T2

暴力

点击查看代码
#include  <bits/stdc++.h>
using namespace std;
const int N = 1e4+5;
int sum[N];
int n,a;
struct Fs
{int x,w,v;double dis;
}f[N];
bool cmp(Fs a,Fs b)
{return a.x<b.x;
}
bool cmpdis(Fs a,Fs b)
{return a.dis<b.dis;
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//	freopen("EVA1.in","r",stdin);cin>>n>>a;bool ev=1;for(int i=1;i<=n;i++){cin>>f[i].w>>f[i].x>>f[i].v;if(i>1&&f[i].v!=f[1].v)ev=0;	}	if(ev){
//		cout<<"****"<<endl;sort(f+1,f+1+n,cmp);for(int i=1;i<=n;i++)sum[f[i].x]+=f[i].w;for(int i=1;i<=f[n].x;i++)sum[i]+=sum[i-1];int ans=0;for(int i=1;i<=f[n].x;i++){ans=max(ans,sum[min(i+a,f[n].x)]-sum[i-1]);}cout<<ans<<endl;return 0;}
//	for(int i=1;i<=n;i++)
//	cout<<"****"<<endl;int ans=0;for(double t=0.0001;t<=1;t+=0.0001){for(int i=1;i<=n;i++){f[i].dis=f[i].x+f[i].v*t;}sort(f+1,f+1+n,cmpdis);for(int i=1;i<=n;i++)sum[i]=sum[i-1]+f[i].w;int st=1;for(int i=1;i<=n;i=-~i){while(f[i].dis-a>f[st].dis)st++;ans=max(ans,sum[i]-sum[st-1]);}}for(double t=0.001;t<=10;t+=0.02){for(int i=1;i<=n;i++){f[i].dis=f[i].x+f[i].v*t;}sort(f+1,f+1+n,cmpdis);for(int i=1;i<=n;i=-~i)sum[i]=sum[i-1]+f[i].w;int st=1;for(int i=1;i<=n;i=-~i){while(f[i].dis-a>f[st].dis)st++;ans=max(ans,sum[i]-sum[st-1]);}}	cout<<ans;return 0;
}
/*
3 10
1 15 55
10 20 55
100 25 55
*/

正解是枚举每一条鱼,设为\(i\)作为左端点(一定是最优的),通过相对速度,算出每一条鱼对它的贡献\(l_t,r_t\),进行差分即可
一些细节问题,
精度问题
还有判断\(r\)是负数的情况不能要
速度相等的情况要注意
由于精度问题\(l,r\)可能要互换位置,先要换位置,再判断是否\(r<0\)
关于差分时,右端点\(r\)要加上一个\(eps\),就是为了先让鱼进来,再让鱼出去,以满足答案最优

点击查看代码
#include  <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e4+5;
const double eps=1e-9; 
int sum[N];
int n,a,cnt[N],jcnt[N];
struct Fs
{int x,w,v;
}f[N];
bool cmp(Fs a,Fs b)
{return a.x<b.x;
}
map <double,int> tmm;
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);// freopen("in.in","r",stdin);// freopen("out.out","w",stdout);
//	freopen("EVA1.in","r",stdin);cin>>n>>a;for(int i=1;i<=n;i++){cin>>f[i].w>>f[i].x>>f[i].v;	}	sort(f+1,f+1+n,cmp);ll ans=0;for(int i=1;i<=n;i++){tmm.clear();ll res=f[i].w;for(int j=1;j<=n;j++){if(i==j)continue;if(f[j].v==f[i].v){if(f[j].x>=f[i].x&&f[j].x-f[i].x<=a)res+=f[j].w;// cout<<res<<endl;continue;}// if(f[j].x<f[i].x&&f[j].v<=f[i].v)continue;double l=1.0*(f[i].x-f[j].x)/(f[j].v-f[i].v);double r=1.0*(f[i].x-f[j].x+a)/(f[j].v-f[i].v);// cout<<t<<" "<<r<<rdl;// if(t<0)continue;if(l>r-eps)swap(l,r);//先要换位置,再判断是否r<0if(r<0)continue;l=max(l,0.0000);tmm[l]+=f[j].w;tmm[r+eps]-=f[j].w;// if(f[j].x>f[i].x&&f[j].v>=f[i].v&&f[j].x-f[i].x>a)continue;}ans=max(ans,res);for(auto it:tmm){res+=(it.second);ans=max(ans,res);}}cout<<ans;return 0;
}
/*
3 10
1 15 55
10 20 55
100 25 55
*/

T3

计数题
做法一:
排序\(a\)数组,然后,我们初始左右指针\(l=1,r=n\),在满足\(l<r企鹅a[l]+a[r]>=k\)的情况下不断让\(r\)指针右移,这样,一定会有一个边界,使得左端点\(a_l\)只能与\([r,n]\)\(a\)匹配,我们把他们加入到数列中,用\(ans\)乘上贡献,类似插空的思想,当前未放入\(a_l,a_r\),
数列中已经包含\([1,l-1],[r+1,n]\),这样就有\(n-r+l-1+1\)个空,再减去有\([1,l-1]\)元素周围不能放\(a_r,a_l\)所以,贡献为\(n-r+l-2\times (l-1)\),但是要注意最后还用相同数的情况,所以乘上相同数阶乘的逆元即可

点击查看代码
#include <bits/stdc++.h>
#define speed() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define ll long long
#define ull unsigned long long
#define lid (rt<<1)
#define rid (rt<<1|1)
#define endl '\n'
//#define int long long
#define pb push_back// #pragma comment(linker, ¡°/STACK:512000000,512000000¡±) 
using namespace std;
const int N = 2e5+5,mod=998244353,inf=1e9;
ll n,k,a[N],jie[N];
ll qpow(ll a,ll b)
{ll ans=1;while(b){if(b&1)ans=ans*a%mod;b>>=1;a=a*a%mod;}return ans;
}
ll calc(ll l,ll r)
{return (n-l-r+2);
}
int main()
{speed();// freopen("in.in","r",stdin);// freopen("out.out","w",stdout);cin>>n>>k;for(int i=1;i<=n;i++){cin>>a[i];}jie[0]=1;for(ll i=1;i<=n;i++)jie[i]=jie[i-1]*i%mod;sort(a+1,a+1+n);ll l=1,r=n;ll ans=1;while(l<=r){while(l<r&&a[r]+a[l]>=k){	ans=ans*calc(l,r)%mod;r--;}ans=ans*calc(l,r)%mod;l++;}ll cnt=1;a[n+1]=inf;for(int i=2;i<=n+1;i++){if(a[i]==a[i-1])cnt++;else{ans=ans*qpow(jie[cnt],mod-2)%mod;cnt=1;}}cout<<ans<<endl;// for()return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/773697.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ansible管理密码库文件

ansible可能需要访问密码或API密钥等敏感数据,以便能配置受管主机。通常,此信息可能以纯文本形式存储在清单变量或其他Ansible文件中。但若如此,任何有权访问Ansible文件的用户或存储,这些Ansible文件的版本控制系统都能够访问此敏感数据。这存在安全风险。使用Ansible随附…

Ansible忽略任务失败

在默认情况下,任务失败时会中止剧本任务,不过可以通过忽略失败的任务来覆盖此类行为。在可能出错且不影响全局的段中使用ignore_errors关键词来达到目的。 环境: 受控主机清单文件: [dev] 192.168.10.129 [all:vars] ansible_ssh_user=root ansible_ssh_pass=123 编写yum文…

React 的 KeepAlive 实战指南:深度解析组件缓存机制

Vue 的 Keep-Alive 组件是用于缓存组件的高阶组件,可以有效地提高应用性能。它能够使组件在切换时仍能保留原有的状态信息,并且有专门的生命周期方便去做额外的处理。该组件在很多场景非常有用,比如:tabs 缓存页面分步表单路由缓存 在 Vue 中,通过 KeepAlive 包裹内…

LangChain补充七:Hub和LangSmith入门

一:Hub简介 https://blog.csdn.net/DEVELOPERAA/article/details/139983286 (一)简介 1.早期 最开始的LangChainHub,类似于github一样,可以理解为LangChain 工具包 或者说 组件中心,里面提供了高质量的组件方便开发者使用。确确实实是一个分享和探索Prompt、链 和Agent的…

借助大语言模型快速升级你的 Java 应用程序

大家都知道我爱小 Q。在我“转码”的征程中,它就像上帝之手,在我本该枯燥漫长的学习进程中拉满快进条。 不仅是我,最近 Amazon Q Developer 还帮助 Amazon 一个由 5 人组成的团队在短短两天内将 1,000 多个生产应用程序从 Java 8 升级到 Java 17(每个应用程序的平均时间不到…

8080端口被占用

微服务项目,启动时发生8080端口占用,但是其他启动了并没有使用到8080端口。 cmd命令窗口查看: netstat -aon | findstr "8080"右键添加需要了解的列表查看8080端口占用的pid比如占用端口的服务是VMware NAT Servic。 在服务管理器(services.msc)中停止VMware NA…

[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-20 读写I2C接口的RTC时钟芯片

软件版本:Anlogic -TD5.9.1-DR1_ES1.1 操作系统:WIN10 64bit 硬件平台:适用安路(Anlogic)FPGA 实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台:https://milianke.tmall.com/ 登录"米联客"FPGA社区 http://www.uisrc.com 视频课程、答疑解惑! 1概述 …

【YashanDB知识库】如何远程连接、使用YashanDB?

问题现象 在各个项目实施中,我们经常遇到客户、开发人员需要连接和使用YashanDB但不知如何操作的问题,本文旨在介绍远程连接、使用YashanDB的几种方式。 问题的风险及影响 无风险 问题影响的版本 历史版本~23.2 问题发生原因 无 解决方法及规避方式 不需要规避 问题分析和处理…

GIS场景零代码拖拽式编辑,支持TMS/WMS/WMTS等多种GIS协议

在三维GIS领域,编辑场景和处理影像数据通常是一个复杂且费时的过程,但现在有了山海鲸可视化,这一切都变得简单有趣。这款免费可视化工具为您提供了零代码拖拽式编辑的体验,让您无需编程知识就能轻松创建和优化GIS场景。通过直观的界面,您只需动动鼠标就能完成从场景编辑到…

【攻防技术系列+代理转发】ICMPSH 工具

虚拟机环境搭建: 【Kali】,192.168.10.131 【window7】,192.168.10.1工具: ICMPSH(基于网络层) Wireshark实验开始前,确保两台主机可以ping通。如果遇到环境ping不通的情况,可以借鉴以下解决方案。 重启网卡:有来有回的过程,数据长度为74。 【kali】: sysctl -w net…

人大金仓踩坑指南

现在越来越多的项目要求-切换国产数据库系统,或达梦(性能高),或人大金仓(扩展性高,更稳定),跨平台如果上来就干,坑还是不少的,本人有幸踩个遍.1. 软件有效期,人大金仓可不便宜,不少政府采购网上都是标价10万+, 测试时候用专业版玩一玩就好到期后,可以直接下载其他版…

linux shell read 按列读取txt文本

前言全局说明一、说明 通常情况下,如果文本里有多列数据,会先读入,然后用 grep 和 awk 先拆分成行,在拆分成列。这样费时费力,遇到特殊字符行,还不好处理。 在解决别的问题时候,无意发现 read 有直接按列读取的功能。二、文件 2.1 存放两列数据的文件 文件名:list.txt…