Codeforces Round 943 (Div. 3) C-G

C. Assembly via Remainders

在这里插入图片描述

思路:

我们可以注意到,数组的长度只有 500 500 500 ,并且每个数的大小都在 500 500 500 以内,再看向这题,容易知道,当第一个数确定之后,之后所有的数字都会确定下来,我们枚举第一个数,然后得到整个序列,去判断序列是否合法即可。

#include <bits/stdc++.h>using namespace std;
const int N = 1e6 + 5;
typedef long long ll;
typedef pair<int, int> pll;
typedef array<ll, 3> p3;
// int mod = 998244353;
const int maxv = 4e6 + 5;
// #define endl "\n"void solve()
{	int n;cin>>n;vector<int> a(n);for(int i=1;i<n;i++) cin>>a[i];vector<int> ans(n);for(int i=1;i<=500+5;i++){ans[0]=i;for(int j=1;j<n;j++) ans[j]=ans[j-1]+a[j];int f=1;for(int j=1;j<n;j++){if(ans[j]%ans[j-1]!=a[j]){f=0;break;}}if(f){for(auto x: ans) cout<<x<<" ";cout<<endl;return ;}}
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;t = 1;cin >> t;while (t--){solve();}system("pause");return 0;
}

D. Permutation Game

在这里插入图片描述

思路:

容易知道,最优解一定是走到某个格子然后呆在该格子上即可,所以我们可以直接枚举走到的格子,然后取最大值。

#include <bits/stdc++.h>using namespace std;
const int N = 2e5 + 5;
typedef long long ll;
typedef pair<int, int> pll;
typedef array<ll, 3> p3;
// int mod = 998244353;
const int maxv = 4e6 + 5;
#define endl "\n"vector<int> e[N];
vector<ll> a(N);
int n,k;void add(int u,int v){e[u].push_back(v);
}bool st1[N],st2[N];
ll ans1=0,ans2=0;
void dfs1(int x,int time,ll sum)
{ll res=0;st1[x]=1;res=sum+a[x]*time;ans1=max(ans1,res);for(auto u: e[x]){if(st1[u]) continue;if(time==1) return  ;dfs1(u,time-1,sum+a[x]);}
}
void dfs2(int x,int time,ll sum)
{ll res=0;st2[x]=1;res=sum+a[x]*time;ans2=max(ans2,res);for(auto u: e[x]){if(st2[u]) continue;if(time==1) return ;dfs2(u,time-1,sum+a[x]);}
}void solve()
{	int s1,s2;cin>>n>>k>>s1>>s2;// k=min(k,n);memset(st1,0,sizeof st1);memset(st2,0,sizeof st2);ans1=ans2=0;for(int i=1;i<=n;i++) e[i].clear();vector<int> p(n+5);for(int i=1;i<=n;i++){cin>>p[i];add(i,p[i]);}for(int i=1;i<=n;i++) cin>>a[i];// cin>>s1>>s2;dfs1(s1,k,0);dfs2(s2,k,0);// cout<<ans1<<" "<<ans2<<endl;if(ans1>ans2) cout<<"Bodya"<<endl;else if(ans1<ans2 ) cout<<"Sasha"<<endl;else cout<<"Draw"<<endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;t = 1;cin >> t;while (t--){solve();}system("pause");return 0;
}

E. Cells Arrangement

在这里插入图片描述

思路:

**构造没什么好说的。

#include <bits/stdc++.h>using namespace std;
const int N = 1e6 + 5;
typedef long long ll;
typedef pair<int, int> pll;
typedef array<ll, 3> p3;
// int mod = 998244353;
const int maxv = 4e6 + 5;
// #define endl "\n"void solve()
{	int n;cin>>n;if(n==2){cout<<1<<" "<<1<<endl;cout<<1<<" "<<2<<endl;}else{for(int i=1;i<=n;i++){if(i==n-1){cout<<n-1<<" "<<n<<endl;}else cout<<i<<" "<<i<<endl;}}
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;t = 1;cin >> t;while (t--){solve();}system("pause");return 0;
}

F. Equal XOR Segments

在这里插入图片描述

思路

题目要求我们把给定的区间划分成 k k k 个,保证每一部分的异或值都相同, q q q 次询问,涉及到多次询问,还有区间异或问题,我们很容易想到,需要把异或前缀和数组给处理出来。
进而,我们考虑最简单的一种情况,即,整个区间的异或和为 0 0 0 时,这时候肯定是一个好数组,那么若区间异或和不为 0 0 0 ,这种时候,我们肯定只能把数组划分成奇数段,同时我们也会发现,当 k = 3 , 5 , 7 , 9 k=3,5,7,9 k=3,5,7,9 等等都是等效的,拿 5 5 5 来举例,我们可以将两个合并成一个 0 0 0 ,然后这样就只剩下三个部分。所以综上所述,这题只存在划分成两段或者是三段的情况。
再来考虑三段的情况如何进行处理:
在这里插入图片描述
如图,很容易得到, s [ x ] = s [ r ] s[x]=s[r] s[x]=s[r] s [ l − 1 ] = s [ y ] s[l-1]=s[y] s[l1]=s[y],所以我们可以把前缀异或值相同的下标放入一个桶中,然后我们去二分查找对应的 x , y x,y x,y 是否合法即可,即 l ≤ x < y ≤ r − 1 l\leq x<y\leq r-1 lx<yr1

#include <bits/stdc++.h>using namespace std;
const int N = 1e6 + 5;
typedef long long ll;
typedef pair<int, int> pll;
typedef array<ll, 3> p3;
// int mod = 998244353;
const int maxv = 4e6 + 5;
#define endl "\n"void solve()
{	int n,q;cin>>n>>q;vector<ll> a(n+5),s(n+5);map<ll,vector<int> > mp;mp[0].push_back(0);for(int i=1;i<=n;i++){cin>>a[i];s[i]=s[i-1]^a[i];mp[s[i]].push_back(i);}while(q--){int l,r;cin>>l>>r;if((s[l-1]^s[r])==0){cout<<"YES"<<endl;continue;}auto &v1=mp[s[l-1]];auto &v2=mp[s[r]];int y=lower_bound(v1.begin(),v1.end(),r)-v1.begin()-1;int x=lower_bound(v2.begin(),v2.end(),l)-v2.begin();if(y==v1.size()||y<0||x<0||x==v2.size()){cout<<"NO"<<endl;continue;}if(v1[y]<r&&v2[x]>=l&&v1[y]>v2[x]){cout<<"YES"<<endl;}else cout<<"NO"<<endl;}
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;t = 1;cin >> t;while (t--){solve();}system("pause");return 0;
}

G2. Division + LCP (hard version)

在这里插入图片描述

思路:

首先考虑简单版本,即 l = r l=r l=r 的情况,首先我们对整个字符串求出其 z z z 函数,其表示为从当前位置 i i i 开始与整个字符串 s s s 的最长公共前缀,那么接下来我们可以去二分 l c p lcp lcp 的长度,得到二分后的段数 c n t cnt cnt ,然后将 c n t cnt cnt l l l ,进行比较即可,很明显这个东西具有单调性,当我们二分的长度越小时,得到的 c n t cnt cnt 一定是越大的。

#include <bits/stdc++.h>using namespace std;
const int N = 1e6 + 5;
typedef long long ll;
typedef pair<int, int> pll;
typedef array<ll, 3> p3;
// int mod = 998244353;
const int maxv = 4e6 + 5;
// #define endl "\n"vector<int> z_algorithm(const string &s)
{int n = s.size();vector<int> a(n);a[0] = n;for (int i = 1, l = 0, r = 0; i < n; i++){if (i <= r)a[i] = min(a[i - l], r - i + 1);while (i + a[i] < n && s[i + a[i]] == s[a[i]])++a[i];if (i + a[i] - 1 > r)l = i, r = i + a[i] - 1;}return a;
}
void solve()
{int n, kl, kr;cin >> n >> kl >> kr;string s;cin >> s;vector<int> z = z_algorithm(s);int l = 1, r = n;auto check = [&](int x){int cnt = 0;for (int i = 0; i < n; i++){if (z[i] >= x){cnt++;i = i + x - 1;}}return cnt >= kl;};int ans = 0;while (l <= r){int mid = (l + r) / 2;if (check(mid)){ans = mid;l = mid + 1;}else{r = mid - 1;}}cout << ans << endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;t = 1;cin >> t;while (t--){solve();}system("pause");return 0;
}

再考虑复杂版本,我们需要求一段区间的 f f f值,我们是否还是可以利用简单版本的做法,当然是可以的,容易发现,最终的一个答案也具有单调性,即随着段数 k k k的上升,我们对应得到的答案一定是越来越小的,即 l c p lcp lcp 的长度一定会越来越小,其长度为 n k n\over k kn 。由此我们完全可以进行根号分治,当 k k k 小于某个阈值时,我们暴力的去运用简单版本的二分得到答案,当 k k k 大于该阈值时,我们就暴力的去枚举 l c p lcp lcp 的长度即可,因为最多只会枚举 n k n\over k kn次。
最终的时间复杂度为 n n l o g n + n n \sqrt nnlogn+n \sqrt n n nlogn+nn

#include <bits/stdc++.h>using namespace std;
const int N = 1e6 + 5;
typedef long long ll;
typedef pair<int, int> pll;
typedef array<ll, 3> p3;
// int mod = 998244353;
const int maxv = 4e6 + 5;
// #define endl "\n"vector<int> z_algorithm(const string &s)
{int n = s.size();vector<int> a(n);a[0] = n;for (int i = 1, l = 0, r = 0; i < n; i++){if (i <= r)a[i] = min(a[i - l], r - i + 1);while (i + a[i] < n && s[i + a[i]] == s[a[i]])++a[i];if (i + a[i] - 1 > r)l = i, r = i + a[i] - 1;}return a;
}int cal(int tar,int n,vector<int> &z)//二分暴力计算
{int l = 1, r = n;auto check = [&](int x){int cnt = 0;for (int i = 0; i < n; i++){if (z[i] >= x){cnt++;i = i + x - 1;}}return cnt >= tar;};int ans = 0;while (l <= r){int mid = (l + r) / 2;if (check(mid)){ans = mid;l = mid + 1;}else{r = mid - 1;}}return ans;
}void solve()
{int n, kl, kr;cin >> n >> kl >> kr;string s;cin >> s;vector<int> z = z_algorithm(s);//计算z函数int bk=(int)sqrt(n);//阈值vector<int> f(n+5);for(int len=1;len<=bk;len++){//大于阈值,暴力枚举长度int cnt=0;for(int i=0;i<n;i++){if(z[i]>=len){i=i+len-1;cnt++;}}f[cnt]=len;}for(int i=n;i>=0;i--) f[i]=max(f[i],f[i+1]);//后缀取最大值即可,因为具有单调性for(int i=kl;i<=kr;i++){if(i<=bk){cout<<cal(i,n,z)<<" ";}else cout<<f[i]<<" ";}cout<<endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;t = 1;cin >> t;while (t--){solve();}system("pause");return 0;
}

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

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

相关文章

leetcode-没有重复项的全排列-97

题目要求 思路 1.递归&#xff0c;如果num和n的元素个数一样就可以插入res中了&#xff0c;这个作为递归的结束条件 2.因为这个题是属于排列&#xff0c;并非组合&#xff0c;两者的区别是排列需要把之前插入的元素在回退会去&#xff0c;而组合不需要&#xff0c;因此会存在一…

14【PS作图】像素画尺寸大小

【背景介绍】本节介绍像素图多大合适 下图是160*144像素大小,有一个显示文本的显示器,还有一个有十几个键的键盘 像素画布尺寸 电脑16像素,但还有一个显示屏 下图为240*160 在场景素材,和对话素材中,用的是不同尺寸的头像,对话素材中的头像会更清楚,尺寸会更大 远处…

【软考高项】三十三、质量管理

一、管理基础 质量定义 国际标准&#xff1a;反映实体满足主体明确和隐含需求的能力的特性总和。 国家标准&#xff1a;一组固有特性满足要求的程度。固有特性是指在某事或某物中本来就有的&#xff0c;尤其是那种永久的可区分的特征。 ➢ 对产品来说&#xff0c;例如…

查看微信小程序主包大小

前言 略 查看微信小程序主包大小 在微信开发者工具右上角找到“详情->基本信息” 查看微信小程序主包构成 通过微信开发者工具中的“代码依赖分析”工具查看

Unity 性能优化之光照优化(七)

提示&#xff1a;仅供参考&#xff0c;有误之处&#xff0c;麻烦大佬指出&#xff0c;不胜感激&#xff01; 文章目录 前言一、测试目的一、实时光源是什么&#xff1f;二、开始测试1.场景中只有一个光照的数值情况2.添加4个点光源后4.结果 总结 前言 实时光源数量越多&#x…

分享一个国内可用的AIGC网站,免费无限制,支持AI绘画

背景 AIGC作为一种基于人工智能技术的自然语言处理工具&#xff0c;近期的热度直接沸腾&#x1f30b;。 作为一个AI爱好者&#xff0c;翻遍了各大基于AIGC的网站&#xff0c;终于找到一个免费&#xff01;免登陆&#xff01;手机电脑通用&#xff01;国内可直接对话的AIGC&am…

保持亮灯:监控工具如何确保 DevOps 中的高可用性

在快速发展的 DevOps 领域&#xff0c;保持高可用性 (HA) 至关重要。消费者期望应用程序具有全天候响应能力和可访问性。销售损失、客户愤怒和声誉受损都是停机的后果。为了使 DevOps 团队能够在问题升级为中断之前主动检测、排除故障并解决问题&#xff0c;监控工具成为这种情…

nginx--tcp负载均衡

mysql负载均衡 安装mysql yum install -y mariadb-server systemctl start mariadb systemctl enable mariadb ss -ntl创建数据库并授权 MariaDB [(none)]> create database wordpress; Query OK, 1 row affected (0.00 sec)MariaDB [(none)]> grant all privileges o…

设计模式(十一):外观模式

设计模式&#xff08;十一&#xff09;&#xff1a;外观模式 1. 外观模式的介绍2. 外观模式的类图3. 外观模式的实现3.1 创建一个接口3.2 创建接口的实现3.3 创建一个外观类3.4 测试 1. 外观模式的介绍 外观模式&#xff08;Facade Pattern&#xff09;属于结构型模式&#xf…

数据结构与算法之经典排序算法

一、简单排序 在我们的程序中&#xff0c;排序是非常常见的一种需求&#xff0c;提供一些数据元素&#xff0c;把这些数据元素按照一定的规则进行排序。比如查询一些订单按照订单的日期进行排序&#xff0c;再比如查询一些商品&#xff0c;按照商品的价格进行排序等等。所以&a…

IT养生知识之:子午流注

《子午流注口诀》 肺寅大卯胃辰宫&#xff0c; 脾巳心午小未中&#xff0c; 申膀酉肾心包戌&#xff0c; 亥焦子胆丑肝通。 何为子午流注&#xff1f; 子午流注是中医圣贤发现的一种规律&#xff0c;中医认为人体中十二条经脉对应着每日的十二个时辰&#xff0c;由于时辰在…

【Osek网络管理测试】[TG3_TC5]等待总线睡眠状态_1

&#x1f64b;‍♂️ 【Osek网络管理测试】系列&#x1f481;‍♂️点击跳转 文章目录 1.环境搭建2.测试目的3.测试步骤4.预期结果5.测试结果 1.环境搭建 硬件&#xff1a;VN1630 软件&#xff1a;CANoe 2.测试目的 验证DUT在满足进入等待睡眠状态的条件时是否进入该状态 …

WP Rocket插件下载:加速您的WordPress网站,提升用户体验

在互联网速度决定用户体验的今天&#xff0c;一个快速加载的网站对于吸引和保留访问者至关重要。WP Rocket插件&#xff0c;作为一款专为WordPress设计的高性能缓存插件&#xff0c;提供了一套完整的解决方案&#xff0c;帮助您优化网站性能&#xff0c;提升用户体验。 [WP Ro…

Django实验(远程访问+图片显示)

众所周知&#xff0c;Python除了不能生孩子什么都会。Python也是可以做web服务的。 Python做web有一个重点优势是&#xff1a;做一个快速的AI Demo。 第一步&#xff1a;安装一个版本5.0以上django 第二步&#xff1a;构建咱们的Django工程&#xff0c;我取名为BBQ django-adm…

【copilot 使用指南 - @workspace】

为什么需要workspace 默认情况下&#xff0c;copilot只能分析当前文件中的代码内容&#xff0c; 那么如何让copliot 跨文件分析&#xff0c;分析整个项目&#xff0c;分析整个代码目录下的代码&#xff0c;就要用到workspace&#xff0c;举例 &#xff1a;假设如下代码 index…

如何使用ArcGIS Pro进行选房分析

无论是研究城市规划布局还是寻找理想的住房&#xff0c;都需要综合考虑购物、医疗、教育和休闲等多方面因素&#xff0c;此时我们的GIS软件就可以派上用场了&#xff0c;这里为大家介绍一下如何使用 ArcGIS Pro 进行选房分析&#xff0c;希望能对你有所帮助。 数据来源 教程所…

解决mac出现npm install 卡在“sill idealTree buildDeps“的问题

问题出现场景&#xff1a; 在新建一个项目尝试npm install命令时&#xff0c;一直卡在“sill idealTree buildDeps“ 尝试过的无效解决方案包括&#xff1a; 切换/关闭梯子重启更换网络更换npm源更新删除 package.json 最终解决方案&#xff1a; 引起问题的原因是MacOS设置中…

sqlx执行案例

SQLx简介 SQLx是Rust语言中的一个异步SQL数据库连接库&#xff0c;它支持多种数据库&#xff0c;如PostgreSQL、MySQL和SQLite。SQLx提供了简单的API和异步执行查询的能力&#xff0c;使得Rust程序员可以轻松地与数据库交互1。 本章节以PostgreSQL为例。 目录结构 cargo.tom…

uniapp生成二维码(uQRCode)与自定义绘制样式与内容

二维码生成使用了一款基于Javascript环境开发的插件 uQRCode &#xff0c;它不仅适用于uniapp&#xff0c;也适用于所有Javascript运行环境的前端应用和Node.js。 uQRCode 插件地址&#xff1a;https://ext.dcloud.net.cn/plugin?id1287 目录 1、npm安装 2、通过import引…

Springboot集成Mybatispuls操作mysql数据库-03

MyBatis-Plus&#xff08;简称MP&#xff09;是一个MyBatis的增强工具&#xff0c;在MyBatis的基础上只做增强而不做改变。它支持所有MyBatis原生的特性&#xff0c;因此引入MyBatis-Plus不会对现有的MyBatis构架产生任何影响。MyBatis-Plus旨在简化开发、提高效率&#xff0c;…