比赛记录:Codeforces Round 936 (Div. 2) A~E

传送门:CF

[前题提要]:赛时一小时过了A~D,E感觉也不是很难(甚至感觉思维难度是小于D的),感觉这回是自己不够自信了,要是自信一点深入想一下应该也能做出来,咱就是说,如果E和D换一下,结果也是一样的,虽上大分,但是心里很不服,故记录一下


A - Median of an Array

当时网卡加载了5min,去了副站才看到题,真是醉了.
对于本题,观察一下,什么时候我们给中位数改变了之后,中位数依旧不变.不难发现应该是原本处于中位数右边的数此时被挤到了现在中位数的位置.那么本题的答案显然就是中位数右边和中位数相等的数的个数.

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define root 1,n,1
#define ls (rt<<1)
#define rs (rt<<1|1)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {ll x=0,w=1;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';return x*w;
}
inline void print(__int128 x){if(x<0) {putchar('-');x=-x;}if(x>9) print(x/10);putchar(x%10+'0');
}
#define maxn 1000000
const double eps=1e-8;
#define	int_INF 0x3f3f3f3f
#define ll_INF 0x3f3f3f3f3f3f3f3f
int a[maxn];
int main() {int T=read();while(T--) {int n=read();for(int i=1;i<=n;i++) {a[i]=read();}sort(a+1,a+n+1);int num=a[(n+1)/2];int cnt=0;for(int i=(n+1)/2;i<=n;i++) {if(a[i]==num) {cnt++;}}cout<<cnt<<endl;}return 0;
}

B - Maximum Sum

很显然我们每一次操作应该选最大的一个字段和.那么此时问题就变成了求最大子段和的问题.对于如何求最大子段和,是个简单的dp问题,此处就不在赘述了.
对于我们选择的最大子段和 s u m sum sum,我们刚开始对其进行一次操作,显然我们的总和多了 s u m sum sum的贡献,我们再操作一次,多了 s u m ∗ 2 sum*2 sum2的贡献,不难发现最后显然多了 2 k ∗ s u m − s u m 2^k*sum-sum 2ksumsum的贡献,直接求即可.

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define root 1,n,1
#define ls (rt<<1)
#define rs (rt<<1|1)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {ll x=0,w=1;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';return x*w;
}
inline void print(__int128 x){if(x<0) {putchar('-');x=-x;}if(x>9) print(x/10);putchar(x%10+'0');
}
#define maxn 1000000
#define int long long
const int mod=1e9+7;
const double eps=1e-8;
#define	int_INF 0x3f3f3f3f
#define ll_INF 0x3f3f3f3f3f3f3f3f
int a[maxn];
signed main() {int T=read();while(T--) {int n=read();int k=read();int sum1=0;for(int i=1;i<=n;i++) {a[i]=read();sum1+=a[i];sum1=sum1%mod;}int ans=-int_INF;int sum=0;for(int i=1;i<=n;i++) {sum+=a[i];if(sum<0) {ans=max(ans,sum);sum=0;}else {ans=max(ans,sum);}}if(ans<0) {cout<<(sum1%mod+mod)%mod<<endl;}else {int ANS=1;for(int i=1;i<=k;i++) {ANS=ANS*2%mod;}ans=(ans%mod+mod)%mod;cout<<((ANS*ans%mod+sum1-ans)%mod+mod)%mod<<endl;}}return 0;
}

C - Tree Cutting

典题.这种二分答案+贪心切割的 t r i c k trick trick经常出现.当时看到直接秒了.
不难发现答案满足单调性,因为我们切割的次数越多,就会导致我们每一块的大小越小,那么我们二分出来的答案
越小就越容易满足我们的限制,答案越大就越不满足.

所以我们进行二分答案.对于我们二分出来的答案 m i d mid mid,我们不难想到从下往上进行切割,此时应该有一个贪心的想法,就是一旦当前子树的大小大于我们的 m i d mid mid,我们就把它切割了.然后以此来满足我们的最大切割数.

现在来想一下这样做的正确性.考虑这样的一个子树 u u u,它有着 v 1 , v 2 , v 3 . . . v n v_1,v_2,v_3...v_n v1,v2,v3...vn,不妨假设此时的 u u u是从下往上第一个满足子树大小大于等于 m i d mid mid的情况.我们会发现此时我们只能删掉u和它的父亲这条连边才能使我们的贡献+1,对于删掉u子树的任意一条边都是不满足我们的情况的(因为这种删法都会导致一个小于mid的子树出现).此时来想一下如果我们不删掉u是否更优.如果我们此时不删掉u,意味着u要和它的某个祖先一起删除,但是此时u自己就满足了删除情况,所以我们为什么要分配u更多的节点呢,我们为什么不把这部分多余的节点给其他部分呢?

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define root 1,n,1
#define ls (rt<<1)
#define rs (rt<<1|1)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {ll x=0,w=1;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';return x*w;
}
inline void print(__int128 x){if(x<0) {putchar('-');x=-x;}if(x>9) print(x/10);putchar(x%10+'0');
}
#define maxn 1000000
const double eps=1e-8;
#define	int_INF 0x3f3f3f3f
#define ll_INF 0x3f3f3f3f3f3f3f3f
vector<int>edge[maxn];int n,k;
int Size[maxn];int cnt;
void dfs(int u,int pre_u,int mid) {Size[u]=1;for(auto v:edge[u]) {if(v==pre_u) continue;dfs(v,u,mid);Size[u]+=Size[v];}if(cnt) {if(Size[u]>=mid) {cnt--;Size[u]=0;}}
}
int check(int mid) {cnt=k;dfs(1,0,mid);return cnt<=0&&Size[1]>=mid;
}
int main() {int T=read();while(T--) {n=read();k=read();for(int i=1;i<=n-1;i++) {int u=read();int v=read();edge[u].push_back(v);edge[v].push_back(u);}int l=1,r=n;int ans=1;while(l<=r) {int mid=(l+r)>>1;if(check(mid)) {ans=mid;l=mid+1;}else {r=mid-1;}}cout<<ans<<endl;for(int i=1;i<=n;i++) {Size[i]=0;edge[i].clear();}}return 0;
}

D - Birthday Gift

对于这种位运算题,最一般的想法应该是逐位考虑.
考虑对所有数字进行拆分.
考虑如果x的某一位是0,那么显然我们每一段的异或结果该位都应该是0,那么贪心的去想,如果某个数字该位是0,我们应该尽量的将其自行当做一块,否则我们需要再找一个该位是1的数字和他放在一块.方便起见,可以使用并查集来完成这一部分.当然,如果一个数字找不到和他一起的数字,此时显然是不行的,之后也就没必要讨论下去了.

for(int j=1;j<=n;j++) {if(v[j][i]) {int l=j;while(j+1<=n&&v[j+1][i]==0) {j++;	fa[find(j)]=find(l);}if(j+1>n) {flag=1;break;}else {fa[find(j+1)]=find(l);j++;}
}

考虑如果x的某一位是1,那么此时我们有两种情况,我们可以使当前位是0,或者是1.
如果当前位我们使其变为0,那么后面所有位我们都将可以随便取,也就是后面的情况将不会影响我们的分块,所以此时的情况就是我们答案的一种情况,那么此时怎么分配才最优呢,不难发现其实我们在x的某一位是0的时候已经考虑过了,那时的分配方案就是最优的.
如果当前位我们还是选择将其变为1,那么只要所有数字当前位存在1即可,我们此时的最优分配方案就是不进行任何操作.此时细心的同学可能存在疑问,“因为存在之前位置的影响,或者当前位根本没有1,我们此时可能不存在使当前位变为1的情况”.对于上述这种情况,我们发现它其实是我们将其选择变为0的一种特殊情况,所以此时的答案其实是已经考虑进去了,所以虽然此时情况不存在,但是后续必然是没有直接将其变为0优秀的,因为我们把其当做1,后续会增加更多的限制,所以我们可以将其忽略.

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define root 1,n,1
#define ls (rt<<1)
#define rs (rt<<1|1)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {ll x=0,w=1;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';return x*w;
}
inline void print(__int128 x){if(x<0) {putchar('-');x=-x;}if(x>9) print(x/10);putchar(x%10+'0');
}
#define maxn 1000000
#define int long long
const double eps=1e-8;
#define	int_INF 0x3f3f3f3f
#define ll_INF 0x3f3f3f3f3f3f3f3f
int a[maxn];
vector<int>v[maxn];int fa[maxn];int temp[maxn];
int find(int x) {if(fa[x]==x) return fa[x];else return fa[x]=find(fa[x]);
}
signed main() {int T=read();while(T--) {int n=read();int x=read();for(int i=1;i<=n;i++) {a[i]=read();fa[i]=i;}for(int i=1;i<=n;i++) {for(int j=0;j<=30;j++) {if(a[i]&(1<<j)) {v[i].push_back(1);}else {v[i].push_back(0);}}}vector<int>vx;for(int j=0;j<=30;j++) {if(x&(1<<j)) vx.push_back(1);else vx.push_back(0);}int flag=0;int kkk=0;int ANS=-int_INF;for(int i=30;i>=0;i--) {if(vx[i]==0) {int cnt=0;for(int j=1;j<=n;j++) {if(v[j][i]) {int l=j;while(j+1<=n&&v[j+1][i]==0) {j++;	fa[find(j)]=find(l);}if(j+1>n) {flag=1;break;}else {fa[find(j+1)]=find(l);j++;}}}}else {for(int j=1;j<=n;j++) {temp[j]=fa[j];}int cnt=0;int kkk=0;for(int j=1;j<=n;j++) {if(v[j][i]) {int l=j;int flag=0;while(j+1<=n&&v[j+1][i]==0) {j++;	fa[find(j)]=find(l);}if(j+1>n) {kkk=1;break;}else {fa[find(j+1)]=find(l);j++;}}}if(kkk==0) {int ans=0;for(int i=1;i<=n;i++) {if(find(i)==i) {ans++;}}ANS=max(ANS,ans);}for(int j=1;j<=n;j++) {fa[j]=temp[j];}}if(flag) {break;}}if(flag) {if(ANS!=-int_INF) cout<<ANS<<endl;else cout<<-1<<endl;} else {int ans=0;for(int i=1;i<=n;i++) {if(find(i)==i) {ans++;}}ANS=max(ANS,ans);cout<<ANS<<endl;		}//clearfor(int i=1;i<=n;i++) {v[i].clear();}vx.clear();}return 0;
}

E - Girl Permutation

令我意难平的一道题.感觉当时只差一点点深入思考就可以想出来了,但是当时心里想它是一道E题而放弃了(哭.
首先不难发现序列最大值的位置是固定的,显然是 p [ m 1 ] p[m1] p[m1],或者是 s [ 1 ] s[1] s[1]位置.显然我们应该左右分开来考虑,那么对于任意一遍,我们先进行一波选数操作,此时贡献多了个 C ( n , p [ m 1 ] − 1 ) C(n,p[m1]-1) C(n,p[m1]1).
考虑左边,我当时赛时的想法是直接再来波 C ( p [ m 1 ] − 1 , m 1 − 1 ) C(p[m1]-1,m1-1) C(p[m1]1,m11)但是这种想法显然是错的.虽然我们任意取 m 1 − 1 m1-1 m11个数字,此时m1-1个数字的顺序是固定的,但是此时会多很多种情况,就比如可能会存在1 2 3这种选择,但是此时我们的1不在最开始的位置,但是因为是前缀最大值,所以1的左边的数字必须都比1要小,但是显然是不存在比1小的数字的,所以此时这种情况是错误的.那么我们该怎么避免上述这种情况呢.其实我们可以逐位进行考虑.
在这里插入图片描述
显然此时7的位置的数只能选最大值.并且此时我们会发现6这个位置的数字需要比5和7要小,并且1~4的数字也要比5要小,这一点十分关键.这意味着,对于剩下来的6个数字,我们必须将最大的那个数字分配给5,然后6这个位置是可以在剩下的5个数中随便选一个数的.上面那句话是本题的关键,需细细理解.考虑完5和6之后,我们再来看一下3,4的位置该如何取数,类似的,我们不难会发现2这个位置此时应该填剩下的4个数中的最大值,然后3和4在2填完之后可以随便填.诶,我们会发现这种填数方式似乎存在的某种有趣的规律.

我们会发现我们当前的前缀最大值其实是除它之后的那个前缀最大值之外的最大值,所以这个数的取数的固定的,并且在这个数取完之后,他之后的区间中的数字是可以任意取的

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define root 1,n,1
#define ls (rt<<1)
#define rs (rt<<1|1)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {ll x=0,w=1;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';return x*w;
}
inline void print(__int128 x){if(x<0) {putchar('-');x=-x;}if(x>9) print(x/10);putchar(x%10+'0');
}
#define maxn 1000000
#define int long long
const int mod=1e9+7;
const double eps=1e-8;
#define	int_INF 0x3f3f3f3f
#define ll_INF 0x3f3f3f3f3f3f3f3f
int qpow(int a,int b) {int ans=1;while(b) {if(b&1) ans=ans*a%mod;b>>=1;a=a*a%mod;}return ans;
}
int fac[maxn],in_fac[maxn];
void init(int limit=2e5) {fac[0]=1;for(int i=1;i<=limit;i++) {fac[i]=fac[i-1]*i%mod;}in_fac[limit]=qpow(fac[limit],mod-2);for(int i=limit-1;i>=0;i--) {in_fac[i]=in_fac[i+1]*(i+1)%mod;}
}
int C(int a,int b) {return fac[a]*in_fac[b]%mod*in_fac[a-b]%mod;
}
int A(int a,int b) {return fac[a]*in_fac[a-b]%mod;
}
int p[maxn],s[maxn];
signed main() {init();int T=read();while(T--) {int n=read();int m1=read();int m2=read();for(int i=1;i<=m1;i++) {p[i]=read();}for(int i=1;i<=m2;i++) {s[i]=read();}if(p[m1]!=s[1]||p[1]!=1||s[m2]!=n) {cout<<0<<endl;continue;}int ans=1;int num=p[m1]-1;for(int i=m1-1;i>=1;i--) {ans=ans*A(num-1,p[i+1]-p[i]-1)%mod;num=p[i]-1;}num=n-s[1];for(int i=2;i<=m2;i++) {ans=ans*A(num-1,s[i]-s[i-1]-1)%mod;num=n-s[i];}cout<<ans*C(n-1,p[m1]-1)%mod<<endl;}return 0;
}

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

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

相关文章

手机网页视频批量提取工具可导出视频分享链接|爬虫采集下载软件

解放你的抖音视频管理——全新抖音批量下载工具震撼上线&#xff01; 在这个信息爆炸的时代&#xff0c;如何高效地获取、管理和分享视频内容成为了许多用户的迫切需求。为了解决这一难题&#xff0c;我们研发了全新的视频批量下载工具&#xff0c;让你轻松畅享海量音视频资源。…

SQL中条件放在on后与where后的区别

数据库在通过连接两张或多张表来返回记录时&#xff0c;都会生成一张中间的临时表&#xff0c;然后再将这张临时表返回给用户。 在使用left jion时&#xff0c;on和where条件的区别如下&#xff1a; on条件是在生成临时表时使用的条件&#xff0c;不管on中的条件是否为真&…

2024年 前端JavaScript Web APIs 第四天 笔记

4.1-日期对象的使用 4.2-时间戳的使用 4.3-倒计时案例的制作 4.4-查找DOM节点 4.5-增加节点以及学成在线案例 4.6-克隆节点和删除节点 4.7-M端事件 4.8-swiper插件的使用 4.9-今日综合案例-学生信息表 B站 <!DOCTYPE html> <html lang"en"><head>&…

ubuntu下samba匿名读写服务器

目的&#xff1a; 局域网内&#xff0c;ubuntu下&#xff0c;创建SAMBA文件共享服务器。匿名读写权限。为了开发项目组文件共享传输方便。 环境&#xff1a; X86_64电脑一台。 操作系统&#xff1a; Ubuntu 20.04 LTS 64位。 安装samba $ sudo apt-get install samba创建…

浅谈智能微型断路器在学校改造项目中的应用-安科瑞 蒋静

南浜路初中是昆山市重点建设的教育民生项目。当地政府对于这所学校非常重视&#xff0c;当然也有着很高的期望。南浜路初中的到来能够进一步促进昆山市义务教育阶段的发展&#xff0c;提升义务教育水平。 现场图片 智能网关 可连接至多16台智能微型断路器&#xff1b;可查看各…

UNI-APP读取本地JSON数据

首先要把json文件放在static文件夹下 然后在要读取数据的页面导入 import data from ../../static/data.json读取数据&#xff1a; onLoad() {console.log(data, data)}, 打印出来的就是JSON文件里的数据了

时序预测 | Matlab基于BiTCN-LSTM双向时间卷积长短期记忆神经网络时间序列预测

时序预测 | Matlab基于BiTCN-LSTM双向时间卷积长短期记忆神经网络时间序列预测 目录 时序预测 | Matlab基于BiTCN-LSTM双向时间卷积长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab基于BiTCN-LSTM双向时间卷积长短期记忆神经网络时…

为什么光模块会发生故障?

当SFP光模块发生故障时&#xff0c;技术人员需要立即找出原因并进行修复&#xff0c;否则&#xff0c;1G链路可能会中断。本指南将为初次接触光模块领域的企业提供一些SFP光模块修复解决方案的支持。 SFP光模块故障的主要原因 SFP光模块故障通常发生在发送端和接收端。最常见…

C++夯实基础

C在线学习笔记 第一阶段&#xff1a;基础 一、环境配置 1.1.第一个程序&#xff08;基本格式&#xff09; ​ #include <iosteam> using namespace std;int main(){cout<<"hello world"<<endl;system("pause"); }​ 模板 #include…

eth 交易案例分析9

交易hash: 先用0.26eth买入了多个GPT&#xff0c;然后用这多个GPT 在uniswap3 兑换了1.69 个eth&#xff0c; 疑问点&#xff1a;买入的 DLP 什么意思&#xff1f;

C++第十弹---类与对象(七)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、再谈构造函数 1.1、构造函数体赋值 1.2、初始化列表 1.3、explicit关键字 2、static成员 2.1、概念 2.2、特性 2.3、面试题 总结 1、再…

制作nuget包并上传到nuget.org

下面是一个详细的步骤指南&#xff0c;用于创建一个简单的 C# NuGet 包并将其发布到 NuGet.org。我们将创建一个简单的数学库作为示例。 步骤 1: 创建一个新的类库项目 首先&#xff0c;我们需要创建一个新的类库项目。这可以通过 Visual Studio 或者 .NET CLI 完成。 使用 …

[linux][调度] 内核抢占入门 —— 线程调度次数与 CONFIG_PREEMPTION

在工作中&#xff0c;如果你正在做开发的工作&#xff0c;正在在写代码&#xff0c;这个时候测试同事在测试过程中测出了问题&#xff0c;需要你来定位解决&#xff0c;那么你就应该先暂停写代码的工作&#xff0c;转而来定位解决测试的问题&#xff1b;如果你正在定位测试的问…

mysql事务及存储引擎

目录 什么是事务 事务的ACIP特性 事务之间的影响 mysql隔离级别 事务隔离级别的作用范围 事务控制语句 mysql存储引擎 什么是事务 事务是一种机制、一个操作序列&#xff0c;包含了一组数据库操作命令&#xff0c;并且把所有的命令作为一个整体一起向系统提交或撤销操作…

AI预测福彩3D第15弹【2024年3月21日预测--第3套算法重新开始计算第4次测试】

今天咱们继续对第3套算法进行第4次测试&#xff0c;第3套算法加入了012路的权重。废话不多说了&#xff0c;直接上结果吧~ 最终&#xff0c;经过研判分析&#xff0c;2024年3月21日福彩3D的七码预测结果如下&#xff1a; 百位&#xff1a;4 5 7 1 0 6 2 十位&#xff1a;3 1 5 …

QML 布局管理器之GridLayout 项目demo

一.气体控制效果图 二.界面布局代码实现 //DottedLline.qml 虚线绘制 import QtQuick 2.12 import QtQuick.Shapes 1.12Shape {id:canvaswidth: parent.widthheight: parent.heightShapePath{strokeStyle: ShapePath.DashLinestartX: 8startY: 10dashPattern: [1, 3]PathLine{…

在Linux搭建Emlog博客结合内网穿透实现公网访问本地个人网站

文章目录 前言1. 网站搭建1.1 Emolog网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试总结 前言 博客作为使…

Flink入门知识点汇总(二)

具体内容请看b站尚硅谷课程&#xff01; 32_Flink运行时架构_提交流程_Yarn应用模式_哔哩哔哩_bilibili 窗口 Flink的窗口并不是静态准备好的&#xff0c;而是动态创建的。数据流到达时不会准备24个或者其他完整数量的桶&#xff0c;而是当下桶接满了&#xff0c;才临时又拿新…

web前端之小功能聚集、简单交互效果

MENU 纯CSS实现可编辑文字霓虹灯闪烁效果css之实现流水文字、闪烁、荧光、炫酷web前端之文本擦除效果与下划线结合css之下划线动画 纯CSS实现可编辑文字霓虹灯闪烁效果 效果图 html <h1 contenteditable"true">Hello World</h1>style * {margin: 0;pa…

C/C++在线参考手册的使用技巧

cppreference.com是一个在线的C/C参考手册&#xff0c;是C/C学习者最常用的网站。 网址&#xff1a;cppreference.com 1&#xff0e;搜索 不知道为什么这个网站总是不能正常搜索&#xff0c;实在是太不方便了。 有两个退而求其次的方法&#xff1a; (1)通过搜索引擎指定域名…