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.mzph.cn/news/92971.shtml

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

相关文章

Nginx之动静分离解读

目录 基本概念 基本入门 location匹配顺序 补充&#xff1a;URLRewrite 基本概念 动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来&#xff0c;动静资源做好了拆分以后&#xff0c;我们就可以根据静态资源的特点将其做缓存操作&#x…

计算机组成与结构

目录 一、计算机硬件组成 二、中央处理单元 1、功能 2、CPU的组成 三、校验码 四、体系结构的分类 1、按处理机数量分类 2、Flynn分类 五、指令系统 1、指令 2、寻址方式 3、指令系统 #CISC&#xff08;复杂指令集计算机&#xff09; RISC&#xff08;精简指令集…

JavaSE学习之--抽象类,接口,内部类

&#x1f495;"没有眼泪我们就会迷路&#xff0c;彻底变成石头&#xff0c;我们的心会变成冰凌&#xff0c;吻会变成冰块。"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;JavaSE学习之--抽象类&#xff0c;接口&#xff0c;内部类 目录 一.抽象…

OpenCV实现视频的读取、显示、保存

目录 1&#xff0c;从文件中读取视频并播放 1.2代码实现 1.3效果展示 2&#xff0c;保存视频 2.1 代码实现 2.2 结果展示 1&#xff0c;从文件中读取视频并播放 在OpenCV中我们需要获取一个视频&#xff0c;需要创建一个VideoCapture对象,指定你要读取的视频文件&am…

基于微信小程序的模拟考试小程序的设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

量化交易全流程(四)

本节目录 数据准备&#xff08;数据源与数据库&#xff09; CTA策略 数据源&#xff1a; 在进行量化分析的时候&#xff0c;最基础的工作是数据准备&#xff0c;即收集数据、清理数据、建立数据库。下面先讨论收集数据的来源&#xff0c;数据来源可分为两大类&#xff1a;免…

SLAM从入门到精通(tf的使用)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在ros的机器人学习过程中&#xff0c;有一件事情是肯定少不了的。那就是坐标系的转换。其实这也很容易理解。假设有一个机器人&#xff0c;它有一个…

推荐算法——Apriori算法原理

0、前言&#xff1a; 首先名字别读错&#xff1a;an pu ruo ao rui 【拼音发音】Apriori是一种推荐算法推荐系统&#xff1a;从海量数据中&#xff0c;帮助用户进行信息的过滤和选择。主要推荐方法有&#xff1a;基于内容的推荐、协同过滤推荐、基于关联规则的推荐、基于知识的…

Spring整合RabbitMQ——生产者

1.生产者整合步骤 添加依赖坐标&#xff0c;在producer和consumer模块的pom文件中各复制一份。 配置producer的配置文件 配置producer的xml配置文件 编写测试类发送消息

《HelloGitHub》第 90 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 https://github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 …

javascript: Sorting Algorithms

// Sorting Algorithms int JavaScript https://www.geeksforgeeks.org/sorting-algorithms/ /** * file Sort.js * 1. Bubble Sort冒泡排序法 * param arry * param nszie */ function BubbleSort(arry, nszie) {var i, j, temp;var swapped;for (i 0; i < nszie - 1; i)…

设计模式——5. 原型模式

1. 说明 原型模式(Prototype Pattern)是一种创建型设计模式,其核心思想是通过复制(克隆)一个现有对象来创建新的对象,而不是通过实例化类来创建。这意味着在原型模式中,新对象的创建不需要知道具体的类,而是通过复制现有对象的属性和状态来创建。原型模式通常包括一个…

动态规划算法(1)--矩阵连乘和凸多边形剖分

目录 一、动态数组 1、创建动态数组 2、添加元素 3、删除修改元素 4、访问元素 5、返回数组长度 6、for each遍历数组 二、输入多个数字 1、正则表达式 2、has.next()方法 三、矩阵连乘 1、什么是矩阵连乘&#xff1f; 2、动态规划思路 3、手推m和s矩阵 4、完…

2024智慧养老展,北京老博会,北京远程医疗展,适老科技展

CBIAIE智慧养老展-专注于智慧养老发展&#xff0c;以科技提升老年人的晚年幸福&#xff1b; 2024第11届中国&#xff08;北京&#xff09;国际智慧养老产业展览会 The 2024 China (Beijing) international pension Industry Exhibition 时间&#xff1a;2024年04月10日—12日…

MySQL——四、SQL语句(下篇)

MySQL 一、常见的SQL函数1、数学函数2、日期函数3、分组函数(聚合函数)4、流程控制函数 二、where条件查询和order by排序三、分组统计四、多表关联查询1、交叉连接CROSS2、内连接inner3、外连接&#xff1a;outer4、子查询 五、分页查询 一、常见的SQL函数 1、length(str):获…

【生物信息学】计算图网络中节点的中心性指标:聚集系数、介数中心性、度中心性

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 3. IDE 三、实验内容 0. 导入必要的工具 1. 生成邻接矩阵simulate_G: 2. 计算节点的聚集系数 CC(G): 3.计算节点的介数中心性 BC(G) 4. 计算节点的度中心性 DC(G) 5. 综合centrality(G) 6. 代…

第3章-指标体系与数据可视化-3.1.2-Seaborn绘图库

目录 3.1.2 Seaborn绘图库 1. 带核密度估计的直方图 2. 二元分布图 一维正态分布 联合分布

xilinx的原语的使用

xilinx的原语的使用 在学习FPGA实现千兆网时需要GMII转RGMII&#xff0c;这就涉及了原语的使用&#xff0c;特此记录&#xff01; 一、原语 与RGMII接口相关的原语&#xff1a; BUFG:全局时钟网络 BUFIO&#xff1a;只能采集IO的数据&#xff0c;采集IO数据的时候延时是最低的…

【【萌新的Risc-V学习之再看读不懂的流水线设计-10】】

萌新的Risc-V学习之再看读不懂的流水线设计-10 我们将流水线和之前案例中洗衣服的例子进行对照 我们把整个流水线分为5个阶段 也就是做成五级流水线 IF: 取指令ID: 指令译码和读寄存器堆EX: 执行或计算地址MEM: 数据存储器访问WB: 写回 我先在这里表述一下基本的几个指令的用…

四、cadence ic 617 ——添加工艺库文件

1.打开软件 linux界面与window不同,打开软件是由代码实现的。 打开软件时要在设定的工作区域打开,因为软件使用时会返回很多文件,在设定的工作区打开软件,这些文件就会返回到工作区域内。 输入ls回车,可以查询当前所在目录下的文件 输入cd+空格+文件名可以进入该文件 输…