牛客周赛 Round 35(A,B,C,D,E,F,G)

这场简单,甚至赛时90分钟不到就AK了。比赛链接,队友题解友链

刚入住学校监狱,很不适应,最近难受的要死,加上最近几场CF打的都不顺利,san值要爆掉了,只能慢慢补题了。

这场C是个滑动窗口,D是贪心,E是有点麻烦的构造,FG是数论。


A 小红的字符串切割

思路:

记录一下字符串长度,然后从中间拆开。

code:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;string s;int main(){cin>>s;cout<<s.substr(0,s.length()/2)<<endl<<s.substr(s.length()/2);return 0;
}

B 小红的数组分配

思路:

统计一下每个数字出现的次数,然后两个两个拿走,如果有一种数字剩下了奇数个,就说明这种数字不能平分给两个数组,直接返回-1。

code:

#include <iostream>
#include <cstdio>
#include <map>
using namespace std;
const int maxn=1e5+5;int n,a[maxn];
map<int,int> mp;int main(){cin>>n;for(int i=1,t;i<=2*n;i++){cin>>t;mp[t]++;}for(int i=1;i<=n;i++){if(mp.begin()->second==1){cout<<-1<<endl;return 0;}a[i]=mp.begin()->first;mp.begin()->second-=2;if(mp.begin()->second==0)mp.erase(mp.begin());}for(int i=1;i<=n;i++)cout<<a[i]<<" ";puts("");for(int i=1;i<=n;i++)cout<<a[i]<<" ";return 0;
}

C 小红关鸡

思路:

如果把鸡窝的位置放在数轴上,那么我们其实就是要找一段长为 k k k 的区间,使得这个区间包含的鸡窝(也就是数轴上的点)的个数最多。

这有点像滑动窗口。假设有个长为 k k k 的窗口,从最左边的鸡窝开始向右滑动,右端点每次移动到下一个鸡窝,然后把左边超出范围的鸡窝删掉,考虑用双端队列维护这个过程,每滑动一次就记录一下当前窗口中有多少鸡窝,取最大的即可。

code:

#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn=1e5+5;int n,k;
int a[maxn];
deque<int> q;int main(){cin>>n>>k;for(int i=1;i<=n;i++)cin>>a[i];sort(a+1,a+n+1);int ans=0;for(int i=1;i<=n;i++){q.push_back(a[i]);while(a[i]-q.front()>k)q.pop_front();ans=max(ans,(int)q.size());}cout<<1.*ans/n;return 0;
}

D 小红的排列构造

思路:

题意说白了就是修改数组中的某些数,让 1 ∼ n 1\sim n 1n 出现一次且仅一次。

贪心地来想,如果排列中的某个数在给出的数组中有的话,我们就可以保留其中一个。而多余的和超出范围( > n \gt n >n)的数我们就需要把它修改成其他数。

所以做法就比较明确了,统计一下不符合条件的下标,然后再给它们分配排列中没有用到的数字。

code:

#include <iostream>
#include <cstdio>
#include <set>
#include <vector>
using namespace std;int n;
vector<int> a;int main(){cin>>n;set<int> S;int cnt=0;for(int i=1,t;i<=n;i++){cin>>t;if(!S.count(t) && t<=n)S.insert(t);else {cnt++;a.push_back(i);}}cout<<cnt<<endl;int i=1;for(auto x:a){while(S.count(i))i++;cout<<x<<' '<<i<<endl;i++;}return 0;
}

E 小红的无向图构造

思路:

比较麻烦的一道构造。

先不考虑凑出 m m m 条边,单纯想怎么凑出满足 a a a 数组。考虑一棵树,深度其实就是它到根节点的距离,深度为 h h h 的点一定连着至少一个深度为 h − 1 h-1 h1 的点,并且它一定不能去连其他深度的点,否则它本身或者连接的另一个点的深度就会发生变化。

也就是说,至少要有 n − 1 n-1 n1 条边才能保证图联通。并且对一个距离 1 1 1 号节点距离 a i a_i ai 的点,至少要有一个距离为 a i − 1 a_i-1 ai1 的点给它连着。也就是不能断层。

另外因为不允许重边和自环,因此 m m m 太大的时候也是无解的。怎么找到这个最大值以及怎么构造呢?考虑深度为 h h h 的点一定只能连着深度为 h − 1 h-1 h1 h h h 的点,因此深度为 h h h 的点最多可以连出 s i z e h − 1 ∗ s i z e h size_{h-1}*size_{h} sizeh1sizeh C s i z e h 2 = s i z e h ∗ ( s i z e h − 1 ) 2 C_{size_h}^2=\dfrac{size_{h}*(size_{h}-1)}2 Csizeh2=2sizeh(sizeh1) 条边,我们算出这个最大的可以连边的数量,然后和 m m m 比较一下就知道有没有解了。

那么怎么连边呢。首先我们需要保证联通,所以需要先把最低限度的边连好。我们用个vector把每个深度的点存一下,然后深度为 h h h 的所有点先跟 深度为 h − 1 h-1 h1 的某个点连好边。然后再去连没有必要的边,并记录一下连了多少个,够了后面就不用再连没必要的边了。

code:

#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;int n,m,d[maxn];
vector<int> a[maxn];int main(){cin>>n>>m;for(int i=1;i<=n;i++){cin>>d[i];a[d[i]].push_back(i);}if(m<n-1){cout<<-1;return 0;}ll maxx=0,cnt=1;for(int i=1;a[i].size()!=0;i++){cnt+=a[i].size();maxx+=1ll*a[i-1].size()*a[i].size();maxx+=1ll*a[i].size()*(a[i].size()-1)/2;}if(maxx<m || cnt!=n){//m超出最大的边数 或 出现断层cout<<-1;return 0;}m-=n-1;vector<pair<int,int> > e;for(int i=1;a[i].size()!=0;i++){for(auto x:a[i])//必要的边e.push_back(make_pair(a[i-1][0],x));for(int j=1;j<a[i-1].size() && m;j++){//非必要的边 h-1 -> hfor(auto x:a[i]){e.push_back(make_pair(a[i-1][j],x));m--;if(!m)break;}}for(int j=0;j<a[i].size() && m;j++)for(int k=j+1;k<a[i].size() && m;k++){//非必要的边 h -> he.push_back(make_pair(a[i][j],a[i][k]));m--;if(!m)break;}}for(auto x:e)cout<<x.first<<" "<<x.second<<endl;return 0;
}

F,G 小红的子序列权值和

思路:

对一种选取方案,发现其实 1 1 1 对乘积的结果是没有影响的,所以先不看 1 1 1,只看 2 2 2 3 3 3。假如 n n n 个数里一共有 a a a 2 2 2 b b b 3 3 3。某种选取方案有 x x x 2 2 2 y y y 3 3 3,那么总的因子个数就是 ( x + 1 ) ∗ ( y + 1 ) (x+1)*(y+1) (x+1)(y+1)(乘积结果为 2 x ∗ 3 y 2^x*3^y 2x3y,对一个因子,从 x x x 2 2 2 里可以选 0 ∼ x 0\sim x 0x 2 2 2,从 y y y 3 3 3 里可以选 0 ∼ y 0\sim y 0y 3 3 3,总的方案数就是 ( x + 1 ) ∗ ( y + 1 ) (x+1)*(y+1) (x+1)(y+1)。这个结论可以推广,对 n = p 1 c 1 ∗ p 2 c 2 ∗ ⋯ ∗ p m c m n=p_1^{c_1}*p_2^{c_2}*\dots*p_m^{c_m} n=p1c1p2c2pmcm 的因子个数就是 ∏ i = 1 m ( c i + 1 ) \prod_{i=1}^{m}(c_i+1) i=1m(ci+1))。而选到这个方案总的次数就是从 a a a 2 2 2 里选 x x x 2 2 2,以及从 b b b 3 3 3 里选 y y y 3 3 3,也就是选取 x x x 2 2 2 y y y 3 3 3 的方案的总贡献是 C a x ∗ C b y ∗ ( x + 1 ) ∗ ( y + 1 ) C^x_a*C^y_b*(x+1)*(y+1) CaxCby(x+1)(y+1)

最后对每个选取方案,我们可以往里面添加 n − a − b n-a-b nab 1 1 1 中的任意个,也就是最后结果乘以 2 n − a − b 2^{n-a-b} 2nab,最后再减掉一个 什么都不选 的方案就行了。答案为: 2 n − a − b ∗ ∑ x = 0 a ∑ y = 0 b C a x ∗ C b y ∗ ( x + 1 ) ∗ ( y + 1 ) − 1 2^{n-a-b}*\sum_{x=0}^{a}\sum_{y=0}^{b}C^x_a*C^y_b*(x+1)*(y+1)-1 2nabx=0ay=0bCaxCby(x+1)(y+1)1 O ( n ) O(n) O(n) 预处理一下阶乘和阶乘的逆元,就可以 O ( n 2 ) O(n^2) O(n2) 进行累加,可以过 F 题。

其实你会发现 C a x C^x_a Cax ( x + 1 ) (x+1) (x+1) 这个部分和 y y y 没有一点关系,所以可以提出来,同理 C b y C^y_b Cby ( y + 1 ) (y+1) (y+1) 这个部分和 x x x 没有一点关系,所以可以提出来。于是就得到了: 2 n − a − b ∗ ∑ x = 0 a C a x ∗ ( x + 1 ) ∗ ∑ y = 0 b C b y ∗ ( y + 1 ) − 1 2^{n-a-b}*\sum_{x=0}^{a}C^x_a*(x+1)*\sum_{y=0}^{b}C^y_b*(y+1)-1 2nabx=0aCax(x+1)y=0bCby(y+1)1两个部分分开计算,时间复杂度 O ( n ) O(n) O(n),可以通过 G 题。

code:

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
const ll mod=1e9+7;ll n,a,b;
ll fac[maxn],ifac[maxn];ll qpow(ll a,ll b){b%=mod-1;ll base=a%mod,ans=1;while(b){if(b&1){ans*=base;ans%=mod;}base*=base;base%=mod;b>>=1;}return ans;
}
ll inv(ll x){return qpow(x,mod-2);}
ll C(int a,int b){//C_a^b return fac[a]*ifac[b]%mod*ifac[a-b]%mod;
}int main(){cin>>n;fac[0]=ifac[0]=1;for(int i=1;i<=n;i++)fac[i]=fac[i-1]*i%mod;ifac[n]=inv(fac[n]);for(int i=n;i>=1;i--)ifac[i-1]=ifac[i]*i%mod;a=b=0;for(int i=1,t;i<=n;i++){cin>>t;if(t==2)a++;else if(t==3)b++;}ll t1=0,t2=0;for(int y=0;y<=b;y++){t1=(t1+C(b,y)*(y+1))%mod;}for(int x=0;x<=a;x++){t2=(t2+C(a,x)*(x+1))%mod;}ll ans=t1*t2%mod;cout<<(qpow(2,n-a-b)*ans%mod-1+mod)%mod;return 0;
}

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

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

相关文章

冒泡排序 和 qsort排序

目录 冒泡排序 冒泡排序部分 输出函数部分 主函数部分 总代码 控制台输出显示 总代码解释 冒泡排序优化 冒泡排序 主函数 总代码 代码优化解释 qsort 排序 qsort 的介绍 使用qsort排序整型数据 使用qsort排序结构数据 冒泡排序 首先&#xff0c;我先介绍我的冒泡…

模糊搜索小案例

C#窗体实现数据录入与模糊搜索小案例 记录一下 主要代码 private void button1_Click(object sender, EventArgs e){string name textBox1.Text;string hometown textBox4.Text;string school textBox6.Text;string sex textBox5.Text;string lat textBox3.Text;string …

c#打印BarTend标签提示:具名数据源没有cuckoo*具名数据(解决)

c#打印BarTend标签提示&#xff1a;具名数据源没有cuckoo*具名数据&#xff08;解决&#xff09; 今天咕咕更新打印模板的时候遇到的问题&#xff0c;就是在模版中配置了字段名&#xff0c;但是启动c#应用&#xff0c;后端发送json数据打印的时候c#报错提示&#xff0c;没有在…

python 小游戏《2048》字符版非图形界面

参考链接&#xff1a; 闲谈2048小游戏和数组的旋转及翻转和转置 目录 2048 一、方阵类 二、随机插入1或2 三、 合并和递增 四、 判断和移动 五、 键盘控制 完整源代码 玩法过程 2048 上回说到2048小游戏中数组的各种旋转、翻转的方法&#xff0c;就是为代码编程作准…

第十六天-爬虫selenium库

目录 1.介绍 2.使用 selenium 1.安装 2.使用 1.测试打开网页&#xff0c;抓取雷速体育日职乙信息 2.通过xpath查找 3.输入文本框内容 send_keys 4.点击事件 click 5.获取网页源码&#xff1a; 6.获取cookies 7.seleniumt提供元素定位方式&#xff1a;8种 8.控制浏览…

Spring Security OAuth2如何自定义返回的 Token 信息

文章目录 Spring Security OAuth2如何自定义返回的 Token 信息定制不透明令牌的信息Springsecurity-oauth2之TokenEndPoint参考Spring Security OAuth2如何自定义返回的 Token 信息 Spring Boot+OAuth2,如何自定义返回的 Token 信息? 参考URL: https://www.jianshu.com/p/b7…

【Go】指针的声明和初始化

package mainimport "fmt"func main() {// 声明一个整数变量var num int 42// 声明一个指向整数的指针变量&#xff0c;并将其初始化为指向整数变量的地址var ptr *int &num// 打印整数变量的值和指针变量的值&#xff08;即整数变量的地址&#xff09;fmt.Pri…

2024第24届中国国际工业博览会新能源与智能网联汽车展电池制造展馆

2024第24届中国国际工业博览会新能源与智能网联汽车展电池制造展馆 时间&#xff1a;2024年9月24日-28日 地点&#xff1a;国家会展中心&#xff08;上海&#xff09; 主办单位&#xff1a;工业和信息化部、国家发展和改革委员会、科学技术部、商务部、中国科学院、中国工程…

【游记】GDOI2024

GDOI2024游记 老年退役选手。NOIP 218 分&#xff0c;GDOI 纯纯旅游。 Day -5 周日返校&#xff0c;开始停课。 开始攒 rp。 Day -4 模拟赛&#xff0c;犯困&#xff0c;啥也不会。 下午打球。 Day -3 模拟赛&#xff0c;不困&#xff0c;还是啥也不会。 下午打球。 …

CSS3单独制作移动端页面布局方式(流式布局、flex弹性布局)

目录 1. 流式布局(百分比布局)2. flex弹性布局(强烈推荐)2.1 介绍2.2 Flex容器常见属性2.2.1 flex-direction2.2.2 justify-content2.2.3 flex-wrap2.2.4 align-items2.2.5 align-content2.2.6 flex-flow 2.3 Flex项目常见属性2.3.1 flex2.3.2 align-self和order 1. 流式布局(百…

银河麒麟之Workstation安装

一、VMware Workstation简介 VMware Workstation是一款由VMware公司开发的虚拟化软件&#xff0c;它允许用户在一台物理计算机上运行多个操作系统&#xff0c;并在每个操作系统中运行多个虚拟机。VMware Workstation提供了一个可视化的用户界面&#xff0c;使用户可以轻松创建、…

程序环境和预处理(2)

文章目录 3.2.7 命名约定 3.3 #undef3.4 命令行定义3.5 条件编译3.6 文件包含3.6.1 头文件被包含的方式3.6.2 嵌套文件包含 4. 其他预处理指令 3.2.7 命名约定 一般来讲函数和宏的使用语法很相似&#xff0c;所以语言本身没法帮我们区分二者&#xff0c;那我们平时的一个习惯是…

linux条件判断之if-then

if..then是最常见的条件判断语句&#xff0c;简而言之&#xff0c;就是当符合某个条件判断的时候&#xff0c;就予以进行某项工作。 1.if-then格式 if-then格式1&#xff1a; if [ 条件判断表达式 ];then 当条件判断表达式成立时&#xff0c;需执行的命令 fi if-then格式2…

Redis安全加固策略:绑定Redis监听的IP地址 修改默认端口 禁用或者重命名高危命令

Redis安全加固策略&#xff1a;绑定Redis监听的IP地址 & 修改默认端口 & 禁用或者重命名高危命令 1.1 绑定Redis监听的IP地址1.2 修改默认端口1.3 禁用或者重命名高危命令1.4 附&#xff1a;redis配置文件详解&#xff08;来源于网络&#xff09; &#x1f496;The Beg…

驱动开发面试复习

创建字符设备 1 创建设备号 alloc_chrdev_region 2.创建cdev cdev_init 3.添加一个 cdev,完成字符设备注册到内核 cdev_add 4.创建类 class_create 5.创建设备 device_create 1.内核空间与用户空间数据 copy_from_user 和copy_to_user 俩个函数来完成。 copy_from_user 函数…

618快递准点到达,别忘了感谢它!

进入6月以来&#xff0c;全国快递日均业务量飞速上涨。 虽然618大促是电商的主场&#xff0c;但作为不可或缺的物流环节&#xff0c;为了这场年中大考&#xff0c;快递企业在此期间也使尽浑身解数&#xff0c;竞相比拼配送速度。那么&#xff0c;为了更快的时效&#xff0c;快递…

uniapp 的video播放如何实现小窗功能

在页面中使用<video>组件来展示视频&#xff0c;并设置好相应的属性和事件监听&#xff1a; <video src"video.mp4" play"onVideoPlay" pause"onVideoPause"></video>在页面的data中定义一个变量来表示是否开启小窗模式&#…

【Wio Terminal】使用WiFi(3)- Wi-F的高级使用

使用WiFi&#xff08;3&#xff09; Wi-F的高级使用HTTPClient 的使用HTTP GETHTTPs GETHTTP POSTWebServerHTTP Authentication Web ServerDNSServermDNSmDNS-SDWiFiManager Wi-F的高级使用 本节介绍了一些WiFi的高级库用法&#xff0c;如HTTPClient、DNSServer和WebServer库…

美国亚利桑那州立大学宣布与OpenAI建立合作伙伴关系!

美国亚利桑那州立大学 (Arizona State University) 在官网宣布—— 将与OpenAI建立合作伙伴关系&#xff01; 该校也成为了第一个与OpenAI合作的高等教育机构。 来源&#xff1a;亚利桑那州立大学官网 亚利桑那州立大学校长表示&#xff1a; “我们认识到人工智能系统将持续…

高并发IO底层原理浅析(四)

Java NIO中的Selector&#xff08;选择器&#xff09;是一个用于检测多个非阻塞通道&#xff08;Channel&#xff09;是否准备就绪进行读写操作的关键组件&#xff0c;它实现了I/O多路复用技术。在单个线程中&#xff0c;Selector可以监听和管理多个Channel上的事件&#xff0c…