Codeforces Round #956 (Div. 2) and ByteRace 2024

A.思维:https://codeforces.com/contest/1983/problem/A

AC代码:

#include<bits/stdc++.h>
using namespace std;
int t;
int n;
int main(){cin>>t;while(t--){cin>>n;for(int i=1;i<=n;i++) cout<<i<<" ";cout<<endl;}
}

B.思维:https://codeforces.com/contest/1983/problem/B

比较考验观察能力:

1.每一次操作都不改变每一行每一列在模3意义下的总和。

因此,要保证可以转化过去,就得保证每一行列在模3意义下的总和相等。

2.满足了条件1就一定可以转化过去,我们不妨从上到下,从左到右考虑每一个点,假如他和B一样就跳过,否则一定可以用2/1补上。这样我们一定可以使(n-1)*(m-1)的矩阵和B一样,加上条件1,最后一行列也相等,证毕!

AC代码:

#include<bits/stdc++.h>
using namespace std;
int a[550][550],b[550][550];
int t,n,m;
int main(){cin>>t;while(t--){cin>>n>>m;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){char c;cin>>c;a[i][j]=(int)(c-'0');}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){char c;cin>>c;b[i][j]=(int)(c-'0');}}int f=1;for(int i=1;i<=n;i++){int sum1=0,sum2=0;for(int j=1;j<=m;j++){sum1+=a[i][j];sum2+=b[i][j];}if(sum1%3!=sum2%3) f=0;}for(int j=1;j<=m;j++){int sum1=0,sum2=0;for(int i=1;i<=n;i++){sum1+=a[i][j];sum2+=b[i][j];}if(sum1%3!=sum2%3) f=0;}if(f) cout<<"YES"<<endl;else cout<<"NO"<<endl;}
}

C.双指针:https://codeforces.com/contest/1983/problem/C

枚举中间一个分段即可。

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll t,n;
ll a[200010],b[200010],c[200010],tot;
ll suma[200010],sumb[200010],sumc[200010];
struct node{int l,r;
}res[4];
int bian(ll* sum1,ll* sum2,ll* sum3){int j=1;for(int i=1;i<=n-1;i++){while(sum2[j]-sum2[i-1]<tot&&j<n-1) j++;//看看两边是否合法if(sum3[n]-sum3[j]>=tot&&sum2[j]-sum2[i-1]>=tot&&sum1[i-1]-sum1[0]>=tot){res[1]={1,i-1},res[2]={i,j},res[3]={j+1,n};return 1;} }return -1;
}
int main(){cin>>t;while(t--){cin>>n;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++) cin>>b[i];for(int i=1;i<=n;i++) cin>>c[i];for(int i=1;i<=n;i++){suma[i]=suma[i-1]+a[i];sumb[i]=sumb[i-1]+b[i];sumc[i]=sumc[i-1]+c[i];}tot=suma[n]%3==0?suma[n]/3:suma[n]/3+1;if(bian(sumb,suma,sumc)==1){cout<<res[2].l<<" "<<res[2].r<<" "<<res[1].l<<" "<<res[1].r<<" "<<res[3].l<<" "<<res[3].r<<endl;}else if(bian(sumc,suma,sumb)==1) cout<<res[2].l<<" "<<res[2].r<<" "<<res[3].l<<" "<<res[3].r<<" "<<res[1].l<<" "<<res[1].r<<endl;else if(bian(suma,sumb,sumc)==1) cout<<res[1].l<<" "<<res[1].r<<" "<<res[2].l<<" "<<res[2].r<<" "<<res[3].l<<" "<<res[3].r<<endl;else if(bian(sumc,sumb,suma)==1) cout<<res[3].l<<" "<<res[3].r<<" "<<res[2].l<<" "<<res[2].r<<" "<<res[1].l<<" "<<res[1].r<<endl;else if(bian(suma,sumc,sumb)==1) cout<<res[1].l<<" "<<res[1].r<<" "<<res[3].l<<" "<<res[3].r<<" "<<res[2].l<<" "<<res[2].r<<endl;else if(bian(sumb,sumc,suma)==1) cout<<res[3].l<<" "<<res[3].r<<" "<<res[1].l<<" "<<res[1].r<<" "<<res[2].l<<" "<<res[2].r<<endl;else{cout<<-1<<endl;}}
}

D.思维+逆序对:​​​​​​https://codeforces.com/contest/1983/problem/D

首先,我们可以观察到:

1.r-l\geqslant 1的交换等价于若干个r-l=1的交换,于是条件等于两者相邻交换,交换次数相等,问是否可以变一样。

2.对于两个序列,相邻交换相同次数不改变逆序对的相对奇偶,也就是说一开始逆序对奇偶不同的一定不可以变成相等序列。

3.反之奇偶相同一定可以,因为他们一定差2的倍数,而我们可以通过1与2交换,再2与1交换抵消若干个2.

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll; 
ll t,n;
ll a[100010],b[100010];
ll a1[100010],b1[100010];
ll cnt;
ll a2[100010];
ll e=2,ee=1;
void merge(ll i,ll mid,ll j,ll* a){ll x1=i,x2=mid+1,f=i;while(x1<=mid&&x2<=j){if(a[x1]<=a[x2]){a2[f++]=a[x1++];}else{a2[f++]=a[x2++];cnt+=mid-x1+1;}}while(x1<=mid){a2[f++]=a[x1++];}while(x2<=j){a2[f++]=a[x2++];}for(int h=i;h<=j;h++){a[h]=a2[h];}
}
void mergesort(int l,int r,ll* a){if(l<r){int mid=(l+r)/e;mergesort(l,mid,a);mergesort(mid+ee,r,a);merge(l,mid,r,a);}
}
ll qiu(ll* a){ll k=ee;mergesort(k,n,a);return cnt;
}
int main(){cin>>t;while(t--){cin>>n;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++) a1[i]=a[i];for(int i=1;i<=n;i++) cin>>b[i];for(int i=1;i<=n;i++) b1[i]=b[i];sort(a1+1,a1+n+1);sort(b1+1,b1+n+1);int f=0;for(int i=1;i<=n;i++){if(a1[i]!=b1[i]){f=1;break;}}if(f){cout<<"NO"<<endl;continue;}cnt=0;ll k1=qiu(a);cnt=0;ll k2=qiu(b);//cout<<k1<<" "<<k2<<" ";if(k1%2==k2%2) cout<<"YES"<<endl;else cout<<"NO"<<endl; }
}

E.数学期望:https://codeforces.com/contest/1983/problem/E

我们假设0为特殊球,1为普通球,假设存在一个排列:00101100.

那么Alice取的就是001和1.

接下来我们考虑每一个1对答案Alice的贡献:

因为有n-k个1,那么Alice取的都是奇数位:即(n-k+1)/2个末尾1段。

所以贡献:(S1/(n-k))*((n-k+1)/2)

考虑特殊球:

我们有n-k个1,也就是有n-k+1个空隙可以放0,因此每一个空隙相当于放了k/(n-k+1)个0,而Alice取得的是奇数段,因此贡献为:

((n-k+2)/2)*k/(n-k+1)*s2/k

也就是:((n-k+2)/2)*s2/(n-k+1)

加起来既可以,对手就是总的减去Alice即可。

AC代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 1e9+7;
int n,k;
const int maxn = 5e5;
int v[maxn],sumA,sumB;
int chA,chB;
int qpow(int a,int b){int res=1;while(b){if(b&1) res=(res*a)%mod;b>>=1;a=a*a%mod;}return res;
}
signed main(){int t;cin>>t;while(t--){sumA=sumB=chA=chB=0;cin>>n>>k;for(int i=1;i<=n;i++){cin>>v[i];if(i<=k) sumA=(sumA+v[i])%mod;else sumB=(sumB+v[i])%mod;}chA=ceil((n-k+1)*1.0/2);chB=ceil((n-k+1)/2);int ans=(int)ceil((n-k)*1.0/2)*qpow(n-k,mod-2)%mod*sumB%mod+chA*qpow(chA+chB,mod-2)%mod*sumA%mod;ans%=mod;cout<<ans<<' '<<(sumA+sumB+mod-ans)%mod<<'\n';}
}

F.二分+01Trie:https://codeforces.com/contest/1983/problem/F

联系上次ABC上的kth不难想到先二分出一个mid,现在的问题就是有多少子对的值是小于等于它的。

我们不妨先固定r,它的贡献就是离他最近的又满足a[l]异或上a[r]小于等于mid的l的下标。

联系到二进制异或的运算可以想到01Trie,对于每一个r,我们把它和mid放目前建立好的01Trie比较,假如在一个分支上mid是1,那么我们往异或r为0的路径走就一定可以,我们对pos进行更新。然后继续往1的方向走保证考虑所有情况。反之mid那位为0,那么我们就只可以往0的方向走。最后走到头因为等于也算再更新。

实在找不到我们就用上一次可以的pos。

此时还有最后一个问题,在对pos更新时如何快速知道与r异或的l的最大下标?

我们再开一个数组在add操作中把最新的值的走的路径上的最大下标进行更新维护即可。

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll; 
int t,n;
ll k;
int a[500010];
int tr[5000100][2];
int tot=1; 
int ck[5000100];
int find(int x,int mid){int now=1;int pos=0;for(int i=29;i>=0;i--){int k1=((x>>i)&1),k2=((mid>>i)&1);if(k2==0){now=tr[now][k1];}else{pos=max(pos,ck[tr[now][k1]]);now=tr[now][1-k1];}}pos=max(pos,ck[now]);return pos;
}
void add(int id,int x){int now=1;for(int i=29;i>=0;i--){if((x>>i)&1){if(tr[now][1]==0) tr[now][1]=++tot;now=tr[now][1];}else{if(tr[now][0]==0) tr[now][0]=++tot;now=tr[now][0];}ck[now]=max(id,ck[now]);}
}
ll check(int mid){ll ans=0;//小于等于mid的数量 int pos=0;//右边界 for(int i=1;i<=n;i++){pos=max(pos,find(a[i],mid));ans=ans+pos;add(i,a[i]);}//清空for(int i=0;i<=tot;i++) ck[i]=0;for(int i=0;i<=tot;i++){tr[i][0]=tr[i][1]=0;} tot=1;return ans;
}
int main(){cin>>t;while(t--){cin>>n>>k;for(int i=1;i<=n;i++) cin>>a[i];int l=0,r=(1<<30)-1;while(l<r){int mid=(l+r)/2;if(check(mid)>=k)//check(mid):小于等于mid的数量{r=mid;} else l=mid+1;}cout<<l<<endl;}
}

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

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

相关文章

《浅谈如何培养树立正确的人工智能伦理观念》

目录 摘要&#xff1a; 一、引言 二、《机械公敌》的情节与主题概述 三、人工智能伦理与法律问题分析 1.伦理挑战 2.法律问题 四、培养正确的人工智能伦理观念的重要性 五、培养正确的人工智能伦理观念的途径与方法 1.加强教育与宣传 2.制定明确的伦理准则和规范 3.…

Doris全方位教程+应用实例

Impala性能稍领先于presto,但是presto在数据源支持上非常丰富&#xff0c;包括hive、图数据库、传统关系型数据库、Redis等 缺点&#xff1a;这两种对hbase支持的都不好&#xff0c;presto 不支持&#xff0c;但是对hdfs、hive兼容性很好&#xff0c;其实这也是顺理成章的&…

Swift学习入门,新手小白看过来

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a;不…

java-数据结构与算法-02-数据结构-06-双端队列

1. 概述 双端队列、队列、栈对比 注1&#xff1a; Java 中 LinkedList 即为典型双端队列实现&#xff0c;不过它同时实现了 Queue 接口&#xff0c;也提供了栈的 push pop 等方法 注2&#xff1a; 不同语言&#xff0c;操作双端队列的方法命名有所不同&#xff0c;参见下表 接…

day05 Router、vuex、axios

配置 router和vuex需要在创建vue项目的时候&#xff0c;开始的时候选择Manually select features&#xff0c;于是就可以在下一个创建配置讯问中选择router和vuex。 axios则需要执行命令行&#xff1a; npm install axios -S 之后再在需要发送请求的view导入即可。 router…

Chapter 20 Python包

欢迎大家订阅【Python从入门到精通】专栏&#xff0c;一起探索Python的无限可能&#xff01; 文章目录 前言一、自定义包1. 什么是Python包&#xff1f;2. 目录结构3. 导入方式4. __all__变量 二、第三方包1. 什么是第三方包&#xff1f;2. 安装第三方包 前言 在 Python 中&am…

PHP反序列化漏洞

一.PHP的序列化和反序列化 &#xff08;1&#xff09;.作用 PHP的序列化和反序列化是PHP中用于存储或传输PHP的值的一个过程。序列化是将变量转换为可存储或传输的字符串的过程&#xff0c;而反序列化则是将这些字符串转换回PHP变量的过程。这两个过程在PHP开发中非常有用&am…

vue element-ui日期控件传参

前端&#xff1a;Vue element-ui <el-form-item label"过期时间" :rules"[ { required: true, message: 请选择过期时间, trigger: blur }]"><el-date-picker v-model"form.expireTime" type"date" format"yyyy-MM-dd&…

Linux--序列化与反序列化

序列化 序列化是指将数据结构或对象状态转换成可以存储或传输的格式的过程。在序列化过程中&#xff0c;对象的状态信息被转换为可以保持或传输的格式&#xff08;如二进制、XML、JSON等&#xff09;。序列化后的数据可以被写入到文件、数据库、内存缓冲区中&#xff0c;或者通…

当年很流行,现在已经淘汰的Java技术,请不要学了!【建议收藏】

在Java技术的发展历程中&#xff0c;确实有一些曾经流行但现在已经被淘汰或不再推荐使用的技术。了解这些技术可以帮助你避免学习过时的知识&#xff0c;从而更高效地提升自己的技能。 以下是一些曾经流行但现在已经不太推荐学习的Java技术&#xff1a; 1. Servlet 2.x&#x…

谷粒商城实战笔记-71-商品服务-API-属性分组-前端组件抽取父子组件交互

文章目录 一&#xff0c;一次性创建所有的菜单二&#xff0c;开发属性分组界面1&#xff0c;左侧三级分类树形组件2&#xff0c;右侧分组列表3&#xff0c;左右两部分通信3.1 子组件发送数据3.2&#xff0c;父组件接收数据 Vue的父子组件通信父组件向子组件传递数据子组件向父组…

【odoo17】后端py方法触发右上角提示组件

概要 在前面文章中&#xff0c;有介绍过前端触发的通知服务。 【odoo】右上角的提示&#xff08;通知服务&#xff09; 此文章则介绍后端触发方法。 内容 直接上代码&#xff1a;但是前提一定是按钮触发&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; def bu…

自动化测试 pytest 中 scope 限制 fixture使用范围!

导读 fixture 是 pytest 中一个非常重要的模块&#xff0c;可以让代码更加简洁。 fixture 的 autouse 为 True 可以自动化加载 fixture。 如果不想每条用例执行前都运行初始化方法(可能多个fixture)怎么办&#xff1f;可不可以只运行一次初始化方法&#xff1f; 答&#xf…

17.延迟队列

介绍 延迟队列&#xff0c;队列内部是有序的&#xff0c;延迟队列中的元素是希望在指定时间到了以后或之前取出和处理。 死信队列中&#xff0c;消息TTL过期的情况其实就是延迟队列。 使用场景 1.订单在十分钟内未支付则自动取消。 2.新创建的店铺&#xff0c;如果十天内没…

【Ant Design Vue的更新日志】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 以下是Ant Design Vue的更新日志 版本1.7.0(发布日期:2023年4月) …

TCP/IP协议——使用Socket套接字实现

目录 Socket 使用Socket实现TCP客户端和服务器的过程 使用Socket搭建TCP服务器 线程优化 向客户端发送消息 连接的断开 客户端主动断开 服务端主动断开 服务器完整的程序 使用Socket编写客户端程序连接TCP服务器 Socket Socket是一种网络通信协议&#xff0c;它允许…

渗透测试:筑牢网络安全的坚固防线

在当今这个互联网高度发达的时代&#xff0c;网络安全已成为维护社会稳定和经济发展的重要基石。随着互联网的普及&#xff0c;网络攻击手段日益复杂多变&#xff0c;各类安全威胁层出不穷。为了有效应对这些挑战&#xff0c;渗透测试作为一种重要的安全测试与评估方法&#xf…

arduino程序-数字输出-学用led(led电路及相关函数)(基础知识)

arduino程序-数字输出-学用led&#xff08;led电路及相关函数&#xff09;&#xff08;基础知识&#xff09; 1-10 数字输出1-学用ledLED发光二极管LED电压特性电阻 1-11 数字输出arduino控制LEDLed与arduino连接电路图高电平及低电平含义 1-10 数字输出1-学用led 元器件初步介…

关于 AGGLIGATOR(猛禽)网络宽频聚合器

AGGLIGATOR 是一个用于多个链路UDP/IP带宽聚合的工具软件&#xff0c;类似MTCP的作用&#xff0c;不过它是针对UDP/IP宽频聚合的。 举个例子&#xff1a; 中国大陆有三台公网服务器&#xff0c;中国香港有一台大带宽服务器。 那么&#xff1a; AGGLIGATOR 允许中国大陆的客户…