2025牛客暑期多校训练营2(部分补题)

题目链接:牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ

B  Bitwise Perfect

思路

考虑到由2^{x}+2^{y}==>2^{x\bigoplus y},那么只有x\bigoplus y变小的时候对答案的贡献才能够减少,从二进制的角度考虑什么时候变小,只有min(x,y)中的最高位1异或之后变成0那么就一定变小,否则一定变大

代码

#include<bits/stdc++.h>
using namespace std;#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 
#define int long long
#define vi vector<int>
#define vb vector<bool>
typedef pair<int,int> pll;const int N=2e5+10;
const int inf=1e18;
const int mod=998244353;int cal(int x){int mx=0;for(int i=0;i<=63;i++){if((1ll<<i)<=x){mx=i;}else{break;}}return mx;
}void f(int x,vi& cnt){for(int i=0;i<63;i++){if((x>>i)&1){cnt[i]++;}}
}void solve(){int n;cin>>n;vi a(n+10);vi ct(65,0);vi cnt(65,0);for(int i=1;i<=n;i++){cin>>a[i];f(a[i],cnt);}for(int i=1;i<=n;i++){if(cnt[cal(a[i])]>1){cout<<"NO\n";return;}}cout<<"YES\n";
}
signed main() {vcoistntcout<<fixed<<setprecision(2);int _=1;cin>>_;while(_--) solve();return 0;
}

F Field of Fire 

思路

由01组成的环形数组,模拟一遍过程得知

我们把所有连续0的长度统计出来,我们要选择最大的一段将一段给用火烧掉,其余的全部火势正常蔓延,T秒后统计答案

那么最长的一段对答案的贡献为max(0,len-T-1),其余的为max(0,len-2*T)

代码

#include<bits/stdc++.h>
using namespace std;#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 
#define int long long
#define vi vector<int>
#define vb vector<bool>
typedef pair<int,int> pll;const int N=2e5+10;
const int inf=1e18;
const int mod=998244353;void solve(){int n,t;cin>>n>>t;string s;cin>>s;s=" "+s;vi v;int mx=0;int i=1;while(s[i]!='1'){i++;}int pre=i-1;while(i<=n){int ti=i+1;while(ti<=n&&s[ti]!='1'){ti++;}if(ti!=n+1){v.push_back(ti-i-1);mx=max(mx,ti-i-1);}i=ti;}int xi=n;int suf=0;while(s[xi]!='1'){suf++;xi--;}mx=max(mx,suf+pre);v.push_back(suf+pre);sort(v.begin(),v.end(),greater<int>());int ans=0;if(mx<=t+1){cout<<0<<"\n";return;}else{ans+=(mx-t-1);}for(int i=1;i<v.size();i++){if(v[i]>=2*t){ans+=v[i]-2*t;}else{break;}}cout<<ans<<"\n";}
signed main() {vcoistntcout<<fixed<<setprecision(2);int _=1;cin>>_;while(_--) solve();return 0;
}

I Identical Somehow

思路

我们可以发现当x与y都不是1,我们令k=1,那么一定是相等的

如果x与y中有一个为1,那么就无法构造输出-1

代码

#include<bits/stdc++.h>
using namespace std;#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 
#define int long long
#define vi vector<int>
#define vb vector<bool>
typedef pair<int,int> pll;const int N=2e5+10;
const int inf=1e18;
const int mod=998244353;void solve(){int x,y;cin>>x>>y;if(min(x,y)==1){cout<<"-1"<<"\n";return;}cout<<"1\n";
}
signed main() {vcoistntcout<<fixed<<setprecision(2);int _=1;cin>>_;while(_--) solve();return 0;
}

A Another Day of Sun

思路

我们可以将开头加入0,那么根据题意我们要找的便是01串出现的次数和

我们考虑每个01串对于整体的贡献,我们用cnt表示-1出现的次数

考虑进-1,有以下四种情况可以产生贡献:

{0 1} :2^{cnt}

{0 -1}:2^{cnt-1}

{-1 1}:2^{cnt-1}

{-1 -1}:2^{cnt-2}

代码

#include<bits/stdc++.h>
using namespace std;#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 
#define int long long
#define vi vector<int>
#define vb vector<bool>
typedef pair<int,int> pll;const int N=5e5+10;
const int inf=1e18;
const int mod=998244353;vi pw(N);
void init(){pw[0]=1;for(int i=1;i<N;i++){pw[i]=(pw[i-1]*2)%mod;}
}void solve(){int n;cin>>n;vi a(2);int cnt=0;for(int i=1;i<=n;i++){int x;cin>>x;if(x==-1) cnt++;a.push_back(x);}n=n+1;int ans=0;for(int i=1;i<n;i++){if(a[i]==0&&a[i+1]==1) ans=(ans+pw[cnt])%mod;if(a[i]==0&&a[i+1]==-1) ans=(ans+pw[cnt-1])%mod;if(a[i]==-1&&a[i+1]==1) ans=(ans+pw[cnt-1])%mod;if(a[i]==-1&&a[i+1]==-1) ans=(ans+pw[cnt-2])%mod;}cout<<ans<<"\n";
}
signed main() {vcoistntcout<<fixed<<setprecision(2);int _=1;init();cin>>_;while(_--) solve();return 0;
}

L Love Wins All

思路

我们可以考虑将排列转化成图,然后发现最后一定是由多个环组成的

发现如果存在奇数环那么只能是2个,否则只能为0,因为根据题意我们要选择两人禁婚,要么在没有奇数环的情况下在偶数环中选择两个,否则有奇数环的时候只能每个奇数环各选一个

在有奇数环的情况下:

我们在两个奇数环各选一个奇数环剩下的人只能有一种匹配情况,其余偶数环每个有2种匹配可能(要注意n=2的情况下匹配情况只有1种)

没有奇数环的情况下:

我们可能选择任意偶数环中的两个,其余每个环为2种可能(要注意n=2的情况下匹配情况只有1种),对于一个偶数环来说选择两个的情况为\frac{n^{2}}{4}种,(n/2)*(n/2)从一半中各选一个

代码

#include<bits/stdc++.h>
using namespace std;#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 
#define int long long
#define vi vector<int>
#define vb vector<bool>
typedef pair<int,int> pll;const int N=5e5+10;
const int inf=1e18;
const int mod=998244353;int ksm(int a,int b){int ans=1;while(b){if(b&1){ans=(ans*a)%mod;}a=((a%mod)*(a%mod))%mod;b>>=1;}return ans;
}struct DSU {                //并查集应用模板vector<int>p,siz;       //p表示祖先,siz表示这个组合有多少个DSU(int n):p(n),siz(n,1) {      //初始化iota(p.begin(),p.end(),0);  //p[i]=i}int find(int x) {while(x!=p[x]) x=p[x]=p[p[x]];return x;}bool same(int x,int y) {return find(x)==find(y);}bool merge(int x, int y) {x=find(x),y=find(y);if (x==y) return false;siz[x]+=siz[y],p[y]=x;return true;}int size(int x) {return siz[find(x)];}
};void solve(){int n;cin>>n;vi a(n+10);DSU dsu(n+10);for(int i=1;i<=n;i++){cin>>a[i];dsu.merge(i,a[i]);}map<int,bool> mp;vi v;int cnt=0;int c2=0;for(int i=1;i<=n;i++){if(!mp[dsu.find(i)]){mp[dsu.find(i)]=true;int x=dsu.size(i);v.push_back(x);if(x==2) c2++;if(x%2) cnt++;}}if(cnt!=2&&cnt!=0){cout<<0<<"\n";return;}int ct=v.size();int ans=0;if(cnt==2){ans=1;int d=ksm(2,ct-c2-2);for(auto x:v){if(x%2){ans=(ans*x)%mod;}}ans=(ans*d)%mod;}else{ans=0;for(auto x:v){if(x==2){ans=(ans+(x*x/4)*ksm(2,ct-c2))%mod;}else{ans=(ans+(x*x/4)*ksm(2,ct-1-c2))%mod;}}}cout<<ans<<"\n";
}
signed main() {vcoistntcout<<fixed<<setprecision(2);int _=1;cin>>_;while(_--) solve();return 0;
}

G Geometry Friend

思路

如果点在多边形的内部,我们找到距离最远的一个或多个点,以其为直径转一个完整的圆,最大的夹角即为答案;

如果点在多边形的外部,我们发现距离最近的点有且仅有一个点,我们需要转一个圆,答案为2*pi

代码

#include<bits/stdc++.h>
using namespace std;#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 
#define int long long
#define vi vector<int>
#define vb vector<bool>
typedef pair<int,int> pll;const int N=2e5+10;
const int inf=1e18;
const int mod=998244353;const long double pi=acosl(-1);
struct node{int x,y;
};node dir(node a,node b){return {b.x-a.x,b.y-a.y};
}
int cross(node a,node b){return a.x*b.y-a.y*b.x;
}void solve(){int n,x,y;cin>>n>>x>>y;vector<node> p(n+1);for(int i=1;i<=n;i++){cin>>p[i].x>>p[i].y;}bool f=true;    //判断(x,y)在多边形内部还是外部for(int i=1;i<=n;i++){if(cross( dir(p[i],p[(i%n)+1]), dir(p[i],{x,y}) )<0){f=false;break;}}if(!f){cout<<2*pi<<"\n";}else{auto dis=[&](node no)->int{return (no.x-x)*(no.x-x)+(no.y-y)*(no.y-y);};int mx=0;for(int i=1;i<=n;i++) mx=max(mx,dis(p[i]));vector<long double> v;for(int i=1;i<=n;i++){if(mx==dis(p[i])){v.push_back(atan2(p[i].x-x,p[i].y-y));}}sort(v.begin(),v.end());long double res=0.0;for(int i=0;i<v.size()-1;i++){res=max(res,v[i+1]-v[i]);}res=max(res,v[0]-v.back()+2*pi);cout<<res<<"\n";}}
signed main() {vcoistntcout<<fixed<<setprecision(15);int _=1;cin>>_;while(_--) solve();return 0;
}

H Highway Upgrade

思路

最终答案肯定是我们只对某一条边进行缩减,然后求得的最短路

正向和反向分别跑最短路算法,用d1[i]表示从节点1到节点i的最短距离,用dn[i]表示从节点i到节点n的最短距离

对于边(u_i,v_i)若对其进行k次缩减,那答案便为d1[u_i]+dn[v_i]+t_i-w_i*k,发现只有k是未知的,这是一条直线,我们可以将所有边形成的直线统计,每次询问k找最小

然后我们可以将其维护成下凸包,因其满足一个类似与开口向上的二次函数,可以用二分来找最小值

代码

#include<bits/stdc++.h>
using namespace std;#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 
#define int long long
#define vi vector<int>
#define vb vector<bool>
typedef pair<int,int> pll;const int N=2e5+10;
const int inf=1e18;
const int mod=998244353;void solve(){int n,m;cin>>n>>m;vector< vector<array<int,3>> > e(n+10);vector< vector<array<int,3>> > g(n+10);vi us(m+1),vs(m+1),ts(m+1),ws(m+1);for(int i=1;i<=m;i++){int u,v,t,w;cin>>u>>v>>t>>w;us[i]=u;vs[i]=v;ts[i]=t;ws[i]=w;e[u].push_back({v,t,w});g[v].push_back({u,t,w});}//跑最短路vi d1(n+10,inf);vi dn(n+10,inf);auto dij=[&](int s,vi& dis,vector<vector<array<int,3>>> &edg)->void{vector<bool> vis(n+10,false);priority_queue<pll,vector<pll>,greater<pll>> pq;pq.push({0,s});dis[s]=0;while(!pq.empty()){auto [t,u]=pq.top();pq.pop();if(vis[u]) continue;vis[u]=true;for(auto& tmp:edg[u]){int v=tmp[0];int w=tmp[1];if(dis[v]>t+w){dis[v]=t+w;pq.push({dis[v],v});}}}};dij(1,d1,e); //从1出发到节点x的最短距离dij(n,dn,g); //从n出发到节点x的最短距离//将所有直线统计first表示斜率,second表示截距vector<pll> lines;for(int i=1;i<=m;i++){lines.push_back({-ws[i],d1[us[i]]+dn[vs[i]]+ts[i]});}sort(lines.rbegin(),lines.rend()); //斜率绝对值从小到大//下凸包vector<pll> h;  //记录凸点h.push_back({0,d1[n]});for(auto [k,y]:lines){while(h.size()>1){      //利用叉积保持凸包auto [k1,y1]=h[h.size()-2];auto [k2,y2]=h[h.size()-1];if((__int128)1*(y1-y2)*(k2-k)<=(__int128)1*(y2-y)*(k1-k2)) h.pop_back();else break;}h.push_back({k,y});}//二分查找最低点int siz=h.size();auto f=[&](int i,int t)->int{if(i<0||i>=siz) return inf;return t*h[i].first+h[i].second;};int q;cin>>q;while(q--){int k;cin>>k;int l=0,r=siz-2;while(l<=r){int mid=(l+r)>>1;if(f(mid,k)>=f(mid+1,k)) l=mid+1;else r=mid-1;}cout<<f(l,k)<<"\n";}}
signed main() {vcoistntcout<<fixed<<setprecision(2);int _=1;cin>>_;while(_--) solve();return 0;
}

D Donkey Thinks...

思路

此题赛时出挺少的,但补题的时候发现思路倒是挺清晰的,就是卡的很极限。。。

形式化题目我们要求\sum h_i-(V-\sum s_i)*\sum d_i,看数据发现V是很小的,那么我们不妨枚举V,也就是将\sum s_i=S变成一个常数,x=V-S

然后每个物品的价值变成h_i-x*d_i,跑一遍恰好装满背包的背包dp

发现这样是过不了的因为时间复杂度太高了

我们考虑优化,对于体积为i的物品我们只需要枚举前\left \lfloor \frac{S}{i} \right \rfloor个价值最大的,这里要用到nth_element库函数(精华所在)

代码

#include<bits/stdc++.h>
using namespace std;#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 
#define int long long
#define vi vector<int>
#define vb vector<bool>
typedef pair<int,int> pll;const int N=2e5+10;
const int inf=1e18;
const int mod=998244353;void solve(){int n,v;cin>>n>>v;vi h(n+1),s(n+1),d(n+1);for(int i=1;i<=n;i++){cin>>h[i]>>s[i]>>d[i];}int ans=0;for(int S=1;S<=v;S++){int x=v-S;vector<vi> va(S+1);for(int i=1;i<=n;i++){if(s[i]<=S){va[s[i]].emplace_back(x*d[i]-h[i]);}}vi dp(S+1,-inf);dp[0]=0;for(int i=1;i<=S;i++){int k=min(S/i,(int)va[i].size());nth_element(va[i].begin(), va[i].begin() + k - 1, va[i].end());for(int idx=0;idx<k;idx++){for(int cur=S;cur>=i;cur--){dp[cur]=max(dp[cur],dp[cur-i]-va[i][idx]);}}}ans=max(ans,dp[S]);}cout<<ans<<"\n";
}
signed main() {vcoistntcout<<fixed<<setprecision(2);int _=1;cin>>_;while(_--) solve();return 0;
}

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

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

相关文章

Nginx的location匹配规则

Nginx的location匹配规则 为什么你的Nginx配置总是不生效&#xff1f; 改了Nginx配置无数次&#xff0c;reload命令执行了几十遍&#xff0c;浏览器访问时却依然返回404&#xff1f;运维工程师小张上周就遇到了这个问题&#xff1a;明明配置了location /static/ { root /var/ww…

USB 2.0 vs USB 3.0:全面技术对比与选择指南

USB 2.0 vs USB 3.0&#xff1a;全面技术对比与选择指南 引言 在当今数字时代&#xff0c;USB接口已成为连接设备与计算机的最普遍标准之一。从2000年USB 2.0的发布到2008年USB 3.0的问世&#xff0c;USB技术经历了显著的演进。本文将深入比较这两种广泛使用的USB标准&#xff…

DApp架构设计与开发流程指南

目录 DApp架构设计与开发流程指南 引言:DApp的核心特性 一、DApp架构设计 1.1 分层架构设计 各层核心组件: 1.2 典型架构模式 1.2.1 全去中心化架构 1.2.2 混合架构(推荐) 二、开发流程 2.1 敏捷开发流程 2.2 详细开发阶段 阶段1:需求分析与设计(1-2周) 阶段2:智能合约…

Windows下odbc配置连接SQL Server

一、查看SQL Server服务是否启动打开SQL Server 2022配置管理器查看SQL Server运行状态&#xff0c;可以设置 启动或停止服务二、windows下如何配置ODBC数据源1、Windows搜索栏中输入“ODBC数据源管理器”并选择“以管理员身份运行”来打开它2、添加新的数据源ODBC数据源管理器…

MySQL—表设计和聚合函数以及正则表达式

文章目录一、第一范式&#xff08;原子性&#xff09;二、第二范式&#xff08;消除部分依赖&#xff09;三、第三范式&#xff08;消除传递依赖&#xff09;四、表设计五、聚合函数六、正则表达式MySQL 的三大范式&#xff08;1NF、2NF、3NF&#xff09;是关系型数据库设计的核…

基于Electron打包jar成Windows应用程序

基于Electron打包jar成Windows应用程序简介注意编译及命令&#xff1a;运行效果登录界面用户管理界面界面全屏锁屏界面文档查看界面简介 本文介绍了一种将maven jar包打包成Windows下EXE可执行程序的方法。 Maven打包Java Web应用成jar&#xff0c;Electron封装jar成Windows …

Autosar RTE实现观测量生成-基于ETAS软件

文章目录前言观测量定义arTypedPerInstanceMemoryPorts Measurable工具链配置及使用Port中的配置arTypedPerInstanceMemory观测量生成文件分析总结前言 之前我们在XCP中&#xff0c;对于标定量和观测量并没有严格按照Autosar标准中定义&#xff0c;Autosar RTE中对标定量和观测…

【REACT18.x】creat-react-app在添加eslint时报错Environment key “jest/globals“ is unknown

今天在创建新项目的时候&#xff0c;给cra创建的项目添加eslint支持&#xff0c;出现如下报错 添加eslint npx eslint --init页面报错 Compiled with problems:ERROR [eslint] package.json eslint-config-react-app/jest#overrides[0]:Environment key "jest/globals&…

Linux的例行性工作 -- (练习)

1、atd和crond两个任务管理程序的区别 答&#xff1a; atd 专为一次性任务设计&#xff0c;允许用户在特定未来时间点&#xff08;绝对或相对时间&#xff09;执行单次命令后就结束。 crond 则是周期性任务的调度核心&#xff0c;通过配置文件&#xff08;crontab&#xff09;实…

《Java语言程序设计》1.6 复习题

1.6.1 什么是Java语言规范?计算机有严格的使用规则。如果编写程序时没有遵循这些规则&#xff0c;计算机就不能理解程序。Java语言规范和Java API定义了Java的标准。Java语言规范(Java language specification)是对Java程序设计语言的语法和语义的技术定义。应用程序接口(Appl…

【机器学习深度学习】什么是量化?

目录 前言 一、量化的基本概念 1.1 量化对比示例 1.2 量化是如何实现的&#xff1f; 二、为什么要进行量化&#xff1f; 2.1 解决模型体积过大问题 2.2 降低对算力的依赖 2.3 加速模型训练和推理 2.4 优化训练过程 2.5 降低部署成本 小结&#xff1a;量化的应用场…

告别 T+1!解密金融级实时数据平台的构建与实践

在数字金融浪潮下&#xff0c;数据处理的“实时性”已不再是加分项&#xff0c;而是逐渐成为决定业务价值的核心竞争力。然而&#xff0c;金融机构在追求实时的道路上&#xff0c;往往陷入一个新的困境&#xff1a;实时分析系统与离线大数据平台形成了两套独立的“烟囱”&#…

[Python] -项目实战7- 用Python和Tkinter做一个图形界面小游戏

一、为什么从小游戏入门GUI? 趣味性强:小游戏直观、有趣,一学就上手。 系统掌握事件驱动:了解按钮点击、键盘响应、图形刷新机制。 扎实基础:为日后构建更复杂应用奠定 GUI 编程基础。 二、选定游戏:猜数字小游戏 🎯 这个小游戏界面简单,核心机制是:3 个按钮分别…

【18】MFC入门到精通——MFC(VS2019)+ OpenCV 显示图片的3种方法

MFC (VS2019)+ OpenCV,显示图片的3种方法 1 方法介绍 2 方法一:嵌套OpenCV窗口显示图片 2.1 建立供工程 添加控件 2.2 引用头文件 2.3 找到OnInitDialog()函数,在其中添加如下代码 2.4 在button触发函数中加入代码(就是你双击button进入的函数) 2.5 注意事项 3 方法二:…

以“融合进化 智领未来”之名,金仓Kingbase FlySync:国产数据库技术的突破与创新

目录开篇&#xff1a;国产数据库的历史性跨越一、KFS 产品定位及发展历程回顾1.1 Kingbase FlySync 发展1.2 Kingbase FlySync与Oracle GoldenGate的对比分析1.2.1 Kingbase FlySync 功能优势1.2.2 技术架构对比1.2.3 性能与扩展性二、数字化时代的新挑战2.1 决策实时性要求越来…

服务器配置错误漏洞

文章目录一、文件解析漏洞1.Apache HTTPD多后缀解析漏洞二、目录遍历漏洞1.Apache目录遍历漏洞2.Nginx目录穿越漏洞服务器配置错误漏洞指因服务器&#xff08;含系统、Web服务、数据库等&#xff09;的参数设置、权限分配、组件配置等不当&#xff0c;导致的安全问题&#xff0…

大模型预测输尿管上段结石技术方案大纲

目录 1. 术前阶段 2. 术中阶段 3. 术后阶段 4. 并发症风险预测 5. 根据预测定手术方案 6. 麻醉方案 7. 术后护理 8. 统计分析 9. 技术验证方法 10. 实验证据 11. 健康教育与指导 12. 完整术方案流程图(Mermaid) 1. 术前阶段 步骤 关键要素 可编辑字段 1.1 影像采集 CT-IVU / …

docker compose 编排容器 mysql Springboot应用

写一个docker-compose.yml文件 内容如下&#xff1a; services:db:image: "docker.xuanyuan.me/library/mysql:8.3.0"restart: unless-stoppedhostname: dbports:- "3306:3306"container_name: mysqlenvironment:- "MYSQL_ROOT_PASSWORD1234"m…

React 中 props 的最常用用法精选+useContext

✅ React 最常用 props 用法 10 例✅ 1. 传递字符串 / 数字 / 布尔值function UserCard({ name, age, isVip }) {return (<div>{name} - {age} - {isVip ? VIP : 普通用户}</div>); }<UserCard name"张三" age{18} isVip{true} />✅ 2. 传递函数&…

离散型制造企业的可视化破局:设备OEE动态看板与工艺路径模拟实践

内容摘要离散型制造企业面临着设备效率低下、生产过程不透明、工艺路径复杂等诸多挑战。如何通过可视化手段提升设备效率和生产透明度&#xff0c;成为企业亟待解决的问题。设备整体效率&#xff08;OEE&#xff09;动态看板和工艺路径模拟是两个关键的可视化工具&#xff0c;能…