2023湖南省赛游记/题解

省赛拖了大哥们的后腿,感觉随便补个正常一队水平的人,我们一队肯定能AK。只能说自己真的菜,全程帮不上什么忙,还负贡献,真的想笑

B
暴力sg

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
constexpr int N=1e6;
int sg[N+5];
int vis[N+5];
void getsg(){for (int i=1;i<=N;i++){// vis[sg[i-1]]=i;int res=sqrt(1.0*i);if (i==res*res){for (int k=1;k<=res;k++){vis[sg[i-(i-res*res+k*res)]]=i;}}else{for (int k=0;k<=res;k++){vis[sg[i-(i-res*res+k*res)]]=i;}}while (vis[sg[i]]==i){sg[i]++;}}
}
void yrzr(){getsg();int n;std::cin>>n;int sum=0;for (int i=1;i<=n;i++){int x;std::cin>>x;sum^=sg[x];}if (sum){std::cout<<"First\n";}else{std::cout<<"Second\n";}
}

D
大哥赛后说是HN省选dp原题(见状压dp P3188 [HNOI2007] 梦幻岛宝珠),然后这个题比那个题范围还要大,看完题解发现是贪心题,但是还是按位分组的思想去解决问题
首先对于一个目标物品来说,它的需求可以表示为几个二进制位的组合,然后我们分解每一个目标物品到位上,然后将其按位合并,最后可以表示为一个二进制串(用数组表示)
然后对于每一件物品,重量小的物品可以合并成大物品,但大物品不能拆解成小物品,所以我们按位从小到大枚举目标物品数组,贪心地用小物品去满足当前位的数量,然后将剩下的物品贪心地两两合并成下一位的物品。

简要的说就是:目标物品总体可以表示为一个数组,然后拥有的物品贪心从小到大去填补目标重量

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
constexpr int inf=1e9;
std::priority_queue<int,std::vector<int>,std::greater<int>> q[5105];
void yrzr(){int n;std::cin>>n;for (int i=1;i<=n;i++){int x,y;std::cin>>x>>y;q[x].push(y);}int m;std::cin>>m;std::vector<int> sum(5105);while (m--){int t,h;std::cin>>t>>h;while (h){if (h&1) sum[t]++;h>>=1;t++;}}for (int i=0;i<=5100;i++){if (sum[i]>=2){int temp=sum[i],p=i;sum[i]=0;while (temp){if (temp&1) sum[p]++;temp>>=1;p++;}}}int ans=0;for (int i=0;i<=5100;i++){if (q[i].size()<sum[i]){std::cout<<"-1\n";return;}for (int j=1;j<=sum[i];j++){ans+=q[i].top();q[i].pop();}while (q[i].size()>=2){int temp=q[i].top();q[i].pop();temp+=q[i].top();q[i].pop();q[i+1].push(temp);}}std::cout<<ans;
}

F
图论题,首先Floyed求出一个字母变成另一个字母的最小花费,然后对于两个不同的字母,暴力预处理出他们变成同样字母的最小花费。最后A串不动,枚举B串位置,求最小即可

可能有重边,输入时 d i s dis dis取最小

#include <bits/stdc++.h>
#define int long long
#define ull unsigned long long
constexpr int inf=1e16;
void yrzr(){int n,m;std::cin>>n>>m;std::vector<int> a(n),b(n);for (int i=0;i<n;i++){std::cin>>a[i];}for (int i=0;i<n;i++){std::cin>>b[i];}std::vector<std::vector<int>> dis(405,std::vector<int>(405,inf)),c(405,std::vector<int>(405,inf));for (int i=1;i<=m;i++){int x,y,z;std::cin>>x>>y>>z;dis[x][y]=std::min(dis[x][y],z);}for (int i=1;i<=400;i++){dis[i][i]=c[i][i]=0;}for (int k=1;k<=400;k++){for (int i=1;i<=400;i++){for (int j=1;j<=400;j++){dis[i][j]=std::min(dis[i][j],dis[i][k]+dis[k][j]);}}}for (int i=1;i<=400;i++){for (int j=1;j<=400;j++){for (int k=1;k<=400;k++){c[i][j]=std::min(c[i][j],dis[i][k]+dis[j][k]);}}}int ans=inf;for (int i=0;i<n;i++){int sum=0;bool ok=1;for (int j=0;j<n;j++){if (c[a[j]][b[(j+i)%n]]==inf){ok=0;break;}else{sum+=c[a[j]][b[(j+i)%n]];}}if (ok){ans=std::min(ans,sum);}}if (ans==inf){std::cout<<"-1\n";}else{std::cout<<ans<<"\n";}
}

I
数位dp,不知道省赛脑子犯了什么抽,受前几天一道数位dp,直接把状态数组压入map暴力记忆化的影响,想当然的觉得这题也是这么做,大哥直接提出时间复杂度是不够的。后面大哥们说是数位dp加个容斥。

补题的时候也一直在想数位dp+容斥,发现自己容斥不出来(容斥见识的得太少了),看了题解后发现只要一个数位dp就可以了

突然发现这题的思想其实跟前几天做的数位dp是一样的,甚至状态更简单,我们最重要的状态其实就只有当前位第几位,然后还要知道现在有多少个不同的数,这就足够了。因为对于这10个数字来说,后面的数字它只有两种身份,之前选了/没选,所以当前位相同,之前不同的数字个数相同,剩下的方案数就相同,就可以用记忆化。(赛时真的蠢傻了,这种套路思想学数位dp的时候见过很多了)

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
constexpr ll mod=1e9+7;
ll f[200005][12][2][2];
int now[12];
void yrzr(){int n;std::cin>>n;std::vector<int> a(n+1),b(n+1);for (int i=1;i<=n;i++){char ch;std::cin>>ch;a[i]=ch-'0';}for (int i=1;i<=n;i++){char ch;std::cin>>ch;b[i]=ch-'0';}reverse(a.begin()+1,a.end());reverse(b.begin()+1,b.end());int A;std::cin>>A;std::function<ll(int,int,int,int)> dfs=[&](int len,int sum,int dif1,int dif2){if (len==0){return 1LL*(sum==A);}if (sum>A){return 0LL;}if (dif1&&dif2&&f[len][sum][dif1][dif2]){return f[len][sum][dif1][dif2];}int x=(dif1?0:a[len]),y=(dif2?9:b[len]);ll res=0;for (int i=x;i<=y;i++){if (now[i]){now[i]++;res=(res+dfs(len-1,sum,dif1|(a[len]!=i),dif2|(b[len]!=i)))%mod;now[i]--;}else{now[i]++;res=(res+dfs(len-1,sum+1,dif1|(a[len]!=i),dif2|(b[len]!=i)))%mod;now[i]--;}}if (dif1&&dif2) f[len][sum][dif1][dif2]=res;return res;};std::cout<<dfs(n,0,0,0);}

J
分别枚举圆心在三个坐标轴,然后二分圆的半径,接下来考虑怎么check,对于一个点来说,我们去计算出它在球内时,圆心所在的区间,存下区间左右端点和权值(表示是左端点还是右端点),遍历一遍看是否有点满足题意即可

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
constexpr int N=1e5+5;
int n;
ll x[N],y[N],z[N];
struct node{double pos;int val;
}a[N<<1];
bool check(double r){int cnt=0;for (int i=1;i<=n;i++){double res=r*r-y[i]*y[i]-z[i]*z[i];if (res<0) continue;res=sqrt(res);a[++cnt]={x[i]-res,1};a[++cnt]={x[i]+res,-1};}std::sort(a+1,a+1+cnt,[&](node i,node j){return i.pos<j.pos;});int sum=0;for (int i=1;i<=cnt;i++){sum+=a[i].val;if (sum>=n/2){return 1;}}cnt=0;for (int i=1;i<=n;i++){double res=r*r-x[i]*x[i]-z[i]*z[i];if (res<0) continue;res=sqrt(res);a[++cnt]={y[i]-res,1};a[++cnt]={y[i]+res,-1};}std::sort(a+1,a+1+cnt,[&](node i,node j){return i.pos<j.pos;});sum=0;for (int i=1;i<=cnt;i++){sum+=a[i].val;if (sum>=n/2){return 1;}}cnt=0;for (int i=1;i<=n;i++){double res=r*r-x[i]*x[i]-y[i]*y[i];if (res<0) continue;res=sqrt(res);a[++cnt]={z[i]-res,1};a[++cnt]={z[i]+res,-1};}std::sort(a+1,a+1+cnt,[&](node i,node j){return i.pos<j.pos;});sum=0;for (int i=1;i<=cnt;i++){sum+=a[i].val;if (sum>=n/2){return 1;}}return 0;
}
void yrzr(){std::cin>>n;for (int i=1;i<=n;i++){std::cin>>x[i]>>y[i]>>z[i];}double l=0,r=1e6;for (int i=0;i<=50;i++){double mid=(l+r)/2;if (check(mid)){r=mid;}else{l=mid;}}std::cout<<std::fixed<<std::setprecision(7)<<l;
}

K
补的时候相成状压了,然后状压+矩阵加速???,发现不会写
然后看了题解知道是容斥了,所以以后对于这种小数据除了状压也有可能是容斥

想到容斥就很好做了,每次直接暴力二进制枚举哪些城市不去,在转移的矩阵和答案矩阵上去掉那些转移点,然后dp矩阵加速即可

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
constexpr ll mod=1e9+9;
constexpr int N=25;
struct Matrix{int lenn,lenm;ll a[N][N];Matrix() {memset(a,0,sizeof(a));}Matrix operator*(const Matrix &b)const{if (lenm==b.lenn){Matrix res;res.lenn=lenn;res.lenm=b.lenm;for (int i=1;i<=lenn;i++){for (int j=1;j<=b.lenm;j++){for (int l=1;l<=lenm;l++){res.a[i][j]=(res.a[i][j]+a[i][l]*b.a[l][j]%mod)%mod;}}}return res;}}Matrix operator+(const Matrix &b)const{if (lenn==b.lenn&&lenm==b.lenm){Matrix res;res.lenn=lenn;res.lenm=lenm;for (int i=1;i<=lenn;i++){for (int j=1;j<=lenm;j++){res.a[i][j]=a[i][j]+b.a[i][j];}}return res;}}Matrix operator-(const Matrix &b)const{if (lenn==b.lenn&&lenm==b.lenm){Matrix res;res.lenn=lenn;res.lenm=lenm;for (int i=1;i<=lenn;i++){for (int j=1;j<=lenm;j++){res.a[i][j]=a[i][j]-b.a[i][j];}}return res;}}};
int s[10],n,m,k,d;
int a[25][25];
ll solve(int mask){Matrix e,f,ans;ans.lenn=1;ans.lenm=f.lenn=f.lenm=e.lenn=e.lenm=n;std::vector<int> vis(n+1);for (int i=1;i<=n;i++){for (int j=1;j<=n;j++){e.a[i][j]=a[i][j];}f.a[i][i]=1;ans.a[1][i]=1;}for (int i=1;i<=k;i++){if (mask&(1<<(i-1))){int x=s[i];for (int j=1;j<=n;j++){e.a[x][j]=e.a[j][x]=0;}vis[x]=1;ans.a[1][x]=0;}}int temp=d;while (temp){if (temp&1) f=f*e;e=e*e;temp>>=1;}ans=ans*f;ll sum=0;for (int i=1;i<=n;i++){if (vis[i]) continue;sum=(sum+ans.a[1][i])%mod;}return sum;
}
void yrzr(){std::cin>>n>>m>>k>>d;d--;for (int i=1;i<=k;i++){std::cin>>s[i];}for (int i=1;i<=m;i++){int x,y;std::cin>>x>>y;a[x][y]=a[y][x]=1;}ll ans=0;for (int i=0;i<(1<<k);i++){if (__builtin_popcount(i)&1){ans=(ans-solve(i)+mod)%mod;}else{ans=(ans+solve(i))%mod;}}std::cout<<ans;
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Java安全之servlet内存马分析

目录 前言 什么是中间键 了解jsp的本质 理解servlet运行机制 servlet的生命周期 Tomcat总体架构 查看Context 的源码 servlet内存马实现 参考 前言 php和jsp一句话马我想大家都知道&#xff0c;早先就听小伙伴说过一句话木马已经过时了&#xff0c;现在是内存马的天下…

在Windows11家庭中文版中启用Copilot(预览版)

1、下载ViveTool-vx.x.x.zip 2、解压下载的压缩包ViveTool-vx.x.x.zip 3、复制ViveTool文件夹的路径 4、按下wins&#xff0c;打开搜索 5、输入cmd&#xff0c;并选择“以管理员身份运行” 6、在cmd中输入以下命令&#xff0c;进入ViveTool文件夹&#xff1a; cd ViveTool…

BASH shell脚本篇4——函数

这篇文章介绍下BASH shell中的函数。之前有介绍过shell的其它命令&#xff0c;请参考&#xff1a; BASH shell脚本篇1——基本命令 BASH shell脚本篇2——条件命令 BASH shell脚本篇3——字符串处理 函数是代码重用的最重要方式。Bash函数可以定义为一组命令&#xff0c;在b…

python使用mitmproxy和mitmdump抓包在手机上抓包(三)

现在手机的使用率远超过电脑&#xff0c;所以这篇记录用mitmproxy抓手机包&#xff0c;实现手机流量监控。 环境&#xff1a;win10 64位&#xff0c;Python 3.10.4&#xff0c;雷电模拟器4.0.78&#xff0c;android版本7.1.2&#xff08;设置-拉至最底部-关于平板电脑&#xf…

Redis与分布式-哨兵模式

接上文 Redis与分布式-主从复制 1.哨兵模式 启动一个哨兵&#xff0c;只需要修改配置文件即可&#xff0c; sentinel monitor lbwnb 1247.0.0.1 6001 1先将所有服务关闭&#xff0c;然后修改配置文件&#xff0c;redis Master&#xff0c;redis Slave&#xff0c;redis Slave…

自定义类型:结构体、位段、枚举、联合

文章目录 前言1. 结构体a. 关键字&#xff1a;structb. 结构体基础知识&#xff1a;c. 结构体声明&#xff1a;d. 特殊的声明e. 结构的自引用f. 结构体变量的定义与初始化<font color red>g. 结构体内存对齐h. 结构体传参 2. 位段a. 设计目的&#xff1a;节省空间b. 什么…

【开发篇】七、RedisTemplate与StringRedisTemplate + Jedis与Lettcus

文章目录 1、RedisTemplate详解2、常用方法3、关于IDEA的报黄4、RedisTemplate和StringRedisTemplate的区别5、如何通用RedisTemplate和StringRedisTemplate6、Jedis7、Jedis的连接池8、封装Jedis工具类8、RedisTemplate底层实现技术切换 1、RedisTemplate详解 RedisTemplate是…

HTML5+CSS3+JS小实例:鼠标滚轮水平滚动

实例:鼠标滚轮水平滚动 技术栈:HTML+CSS+JS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content="…

探索ClickHouse——连接Kafka和Clickhouse

安装Kafka 新增用户 sudo adduser kafka sudo adduser kafka sudo su -l kafka安装JDK sudo apt-get install openjdk-8-jre下载解压kafka 可以从https://downloads.apache.org/kafka/下找到希望安装的版本。需要注意的是&#xff0c;不要下载路径包含src的包&#xff0c;否…

centos7卸载docker

菜鸟教程-常见命令&#xff1a;https://www.runoob.com/docker/docker-command-manual.html 1. 准备工作&#xff1a; 1.1 杀死docker有关的容器&#xff1a; docker kill $(docker ps -a -q)1.2 删除所有docker容器&#xff1a; docker rm $(docker ps -a -q)1.3 删除所有d…

wordpress搭建自己的博客详细过程以及踩坑

WordPress作为一款开源的内容管理系统&#xff08;CMS&#xff09;&#xff0c;具有诸多优势。首先&#xff0c;它的易用性使得即使对于没有编程经验的用户来说也能轻松上手&#xff0c;通过直观的用户界面和友好的管理工具&#xff0c;用户可以方便地创建、编辑和发布内容。其…

【python学习第12节 pandas】

文章目录 一&#xff0c;pandas1.1 pd.Series1.2 pd.date_range1.3 pd_DataFrame1.4浏览数据1.5布尔索引1.6设置值1.7操作1.8合并1.8.1concat&#xff08;&#xff09;函数1.8.2 merge()函数 一&#xff0c;pandas 1.1 pd.Series pd.Series 是 Pandas 库中的一个数据结构&…

爆文采集器-热点爆文章采集工具

当信息在互联网上迅速传播&#xff0c;新闻迅速变化&#xff0c;自媒体创作者和信息追踪者们都希望能够捕捉到瞬息万变的热点话题&#xff0c;以吸引更多的关注和流量。爆文采集器成为了一项关键的工具&#xff0c;有助于他们在信息的海洋中找到并分享最新、最热门的内容。 热点…

AOP:分页参数统一校验

需求说明 为了保证系统的安全性&#xff0c;需要对所有的 查询列表 接口&#xff0c;添加分页参数&#xff0c;并对分页参数进行校验&#xff0c; &#xff0c;保证参数的合法性。 比如&#xff0c; pageSize&#xff08;每页显示条数&#xff09;&#xff0c;如果不做校验&a…

SpringCloud Alibaba - 基于 FeignClient 整合 Sentinel,实现“线程隔离”和“熔断降级”

目录 一、FeignClient 整合 Sentinel 1.1、整合原因 1.2、实现步骤 1.2.1、修改 OrderService 中的 application.yml 文件 1.2.2、给 FeignClient 编写失败后的降级逻辑 二、线程隔离 2.1、线程隔离的两种方式 2.1.1、线程池隔离 2.1.2、信号量隔离&#xff08;Sentin…

国庆10.01

TCPselect 代码 服务器 #include<myhead.h> #include<sqlite3.h> #define PORT 6666 //端口号 #define IP "192.168.0.104" //IP地址//键盘事件 int jp(fd_set tempfds,int maxfd) {char buf[128] ""; //用来接收数据char buf1[128] …

电流流过电阻时会减小吗?

我相信很多人刚接触电路时都会有这个想法&#xff1a;由于电阻会抵抗或阻碍电荷的流动&#xff0c;假如现在电流往一个方向流动&#xff0c;且电路中只有一个电阻器&#xff0c;那么从电流流出的地方到刚接触电阻中间应该有有高电流&#xff0c;从电阻刚流出到最后应该有低电流…

使用WPS自动化转换办公文档: 将Word, PowerPoint和Excel文件转换为PDF

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Ubuntu配置深度学习环境(TensorFlow和PyTorch)

文章目录 一、CUDA安装1.1 安装显卡驱动1.2 CUDA安装1.3 安装cuDNN 二、Anaconda安装三、安装TensorFlow和pyTorch3.1 安装pyTorch3.2 安装TensorFlow2 四、安装pyCharm4.1 pyCharm的安装4.2 关联anaconda的Python解释器 五、VScode配置anaconda的Python虚拟环境 前言&#xff…

Java下正面解除警告Unchecked cast: ‘java.lang.Object‘ to ‘java.util.ArrayList‘

就是我在反序列化时&#xff0c;遇到这样一个警告&#xff1a; Unchecked cast: java.lang.Object to java.util.ArrayList<com.work1.Student>然后我去网上查&#xff0c;有些人说用SuppressWarnings(“unchecked”)去忽略警告&#xff0c;但是我觉得作为一名合格的程序…