当前位置: 首页 > news >正文

VP记录:Codeforces Round 873 (Div. 2) A~D1

传送门:CF

前题提要:因为本场比赛的D题让我十分难受.刚开始以为 r − l + 1 r-l+1 rl+1 r − l r-l rl应该没什么不同.但是做的时候发现假设是 r − l + 1 r-l+1 rl+1的话我们可以使用线段树来维护,但是 r − l r-l rl就让线段树维护的难度大大增加,这导致我十分烦躁,所以就不想做本场比赛的D2了

A题:A. Divisible Array

一道构造题.因为需要被下标整除,所以我们不妨直接将每一位的数字赋值成该下标,但是我们发现这样子的总和将会是 ( n + 1 ) ∗ n / 2 (n+1)*n/2 (n+1)n/2这样不一定被 n n n整除,但是此时我们只要将整体乘一个 2 2 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;
}
#define maxn 1000000
const double eps=1e-8;
#define	int_INF 0x3f3f3f3f
#define ll_INF 0x3f3f3f3f3f3f3f3f
int main() {int T=read();while(T--) {int n=read();for(int i=1;i<=n;i++) {cout<<2*i<<" ";}cout<<endl;}return 0;
}

B题:B. Permutation Swap

把玩一下题意之后不难发现.我们的 a [ i ] a[i] a[i]最终是要移动到下标为 a [ i ] a[i] a[i]的位置.那么我们需要移动的总距离就是 a b s ( a [ i ] − i ) abs(a[i]-i) abs(a[i]i).诶,此时我们想一下有多少种 k k k将会满足此次移动,我们会发现 k k k需要满足是 a b s ( a [ i ] − i ) abs(a[i]-i) abs(a[i]i)的因子才行.
所以此时我们只要对所有的 a b s ( a [ i ] − i ) abs(a[i]-i) abs(a[i]i)取一个 g c d gcd gcd就行了.
但是有一个细节需要注意,就是当我们的 a [ i ] a[i] a[i]就处于 a [ i ] a[i] a[i]的位置的时候,此时任意的 k k k对于该数字都是满足的,所以此时我们不需要管这个数字即可

#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;
}
#define maxn 1000000
const double eps=1e-8;
#define	int_INF 0x3f3f3f3f
#define ll_INF 0x3f3f3f3f3f3f3f3f
int gcd(int a,int b) {if(a%b==0) return b;else return gcd(b,a%b);
}
int a[maxn];
int main() {int T=read();while(T--) {int n=read();for(int i=1;i<=n;i++) a[i]=read();vector<int>b;for(int i=1;i<=n;i++) {int num=abs(a[i]-i);if(num==0) continue;else b.push_back(num);}int ans=b[0];for(int i=1;i<b.size();i++) {ans=gcd(ans,b[i]);}cout<<ans<<endl;}return 0;
}

C. Counting Orders

考虑对两个数组进行一个排序(从小到大).然后此时我们的两个数组应该满足所有的 a [ i ] < b [ i ] a[i]<b[i] a[i]<b[i].不然我们的答案就是0.下面简单证明一下这个结论:
假设此时我们的答案不为0.那么我们将需要处理一下 a [ i ] > b [ i ] a[i]>b[i] a[i]>b[i]的那一个数字.我们发现想要处理这个数字,我们就需要将后面的 i i i后面的数字换到 i i i位置.那么也就是将 i i i换到后面去才能满足题意.但是我们发现两个数组都是单调增的.此时我们的 a [ i ] a[i] a[i]已经偏小了,换到后面去不是更为偏小,所以是不可能满足题意的(还有一种情况是先与i前面的换,再将前面的换到后面,这种情况显然也是不行的)
那么此时我们考虑在这个的基础上算出最后的答案.考虑对于每一位的 a [ i ] a[i] a[i],我们先算出他能放在哪些位置,不难发现可以在b数组中用二分找到第一个大于 a [ i ] a[i] a[i]的位置,不妨记为 p o s 1 pos1 pos1(注意,b数组是单调的).那么此时我们可以放的位置显然就是 p o s − 1 pos-1 pos1.我们继续找 a [ i + 1 ] a[i+1] a[i+1]的可放位置数,记为 p o s 2 pos2 pos2.我们会发现存在这样的一个性质,就是a[i]可以放的位置显然a[i+1]也是可以放的,并且a[i]会占用a[i+1]的一个可行位置.所以此时的总贡献就是:
∏ i = 1 n p o s i − ( i − 1 ) \prod\limits_{i=1}^n {pos_i-(i-1)} i=1nposi(i1)
至此本题也就不难解决了

#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;
}
#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 n;vector<int>a,b;
signed main() {int T=read();while(T--) {n=read();a.clear();b.clear();for(int i=1;i<=n;i++) {int num=read();a.push_back(num);}for(int i=1;i<=n;i++) {int num=read();b.push_back(num);}sort(a.begin(),a.end());sort(b.begin(),b.end());int flag=0;for(int i=0;i<n;i++) {if(a[i]<=b[i]) {flag=1;break;} }if(flag) {cout<<0<<endl;continue;}int ans=1;for(int i=0;i<n;i++) {int pos=lower_bound(b.begin(),b.end(),a[i])-b.begin();ans=ans*(pos-i)%mod;}cout<<ans<<endl;}	return 0;
}

D1:Range Sorting (Easy Version)

首先需要注意的是对于一个区间的花费是 r − l r-l rl

然后我们发现对于一个位置的数字进行排序的花费是0.这就意味对于不需要排序的所有数字,我们也可以将其看做为对单个位置的数字进行排序!!.
然后我们考虑对于一个区间 [ l , r ] [l,r] [l,r],我们将其按照排序的区间来将其分块,举一个栗子:
1 , 2 , 4 , 3 1,2,4,3 1,2,4,3这样的区间,我们就将其分块为 1 2 4 , 3 1\;\;2\;\;4,3 124,3这三个区间,此时我们发现这样做的总贡献就是区间的长度减去块的个数!!,这个很好证明.因为我们的花费是 r − l r-l rl,所以我们没分出一个新的块,我们的贡献就是当前的长度-1.我们将其累加一下就会发现区间的总贡献就是总区间的长度减去块的个数.

当然对于上述的结论,我们需要一个前题,“就是对于每一个排序区间,它们都不是相交的,也就是进行不相交的进行排序才是最优的”,这个不难证明,限于篇幅,此处就不在赘述了

所以我们现在的问题就变成了计算一个区间中的块的个数.我们发现每一个块内的数字显然是单调递减的(这个很重要).考虑使用单调栈来维护每一个块的最大值(维护的栈是单调增的,这个也很重要).假设当前枚举到了区间中的 a [ i ] a[i] a[i],我们此时的值小于前面的数字,我们就需要将 a [ i ] a[i] a[i]换到之前的位置,那么此时需要换到哪一个位置呢.我们发现当前数字假设比块的最大值要小,并且因为我们块中的数字是呈单调减排列的,所以此时我们的该数字应该是放在这个块前面才行,也就是说此时的排序区间的左端点要管到最大值的那一个位置.所以此时这个数字很显然就可以合并到之前的那一个块中.我们对此进行合并即可.

假设当前枚举到的数字比之前的最大值要大,那么此时这个数字比之前的所有数字都要大,这就意味着当前数字目前来说并不需要进行排序,所以我们将其独立作为一个块

#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;
}
#define maxn 1000000
#define int long long
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();for(int i=1;i<=n;i++) a[i]=read();int ans=0;for(int l=1;l<=n;l++) {stack<int>s;for(int len=1;l+len-1<=n;len++) {int r=l+len-1;int flag=1;int maxx=a[r];while(!s.empty()&&a[r]<s.top()) {if(flag==1){maxx=s.top();flag=0;}s.pop();}if(flag==0) s.push(maxx);else s.push(a[r]);ans+=len-s.size();}}cout<<ans<<endl;}return 0;
}

相关文章:

VP记录:Codeforces Round 873 (Div. 2) A~D1

传送门:CF 前题提要:因为本场比赛的D题让我十分难受.刚开始以为 r − l 1 r-l1 r−l1与 r − l r-l r−l应该没什么不同.但是做的时候发现假设是 r − l 1 r-l1 r−l1的话我们可以使用线段树来维护,但是 r − l r-l r−l就让线段树维护的难度大大增加,这导致我十分烦躁,所以…...

【C++】函数提高

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01;时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、函数默认参数 3、函数占位参数 4、总结 1、缘起 以前学习过了函数的基本用法和功能&#xff0c;现在是时候学习函数…...

【可持续能源:让我们迈向绿色、可持续未来的道路】

作为未来的主要能源来源&#xff0c;可持续能源技术确实有潜力改变我们的世界。随着全球对传统化石燃料的依赖程度逐渐降低&#xff0c;可再生能源已成为许多国家推进能源转型的首选。 从太阳能和风能到地热能和潮汐能&#xff0c;可持续能源技术已经在许多方面取得了重大突破…...

ES6中数组新增了哪些扩展?

一、扩展运算符的应用 ES6通过扩展元素符...&#xff0c;好比 rest 参数的逆运算&#xff0c;将一个数组转为用逗号分隔的参数序列 console.log(...[1, 2, 3]) // 1 2 3console.log(1, ...[2, 3, 4], 5) // 1 2 3 4 5[...document.querySelectorAll(div)] // [<div>, …...

【算法】动态规划

一、基础知识 动态规划的基本思想&#xff1a;将待求解问题分解成若干个子问题&#xff0c;如果各个子问题不是独立的&#xff0c;不同的子问题的个数只是多项式量级&#xff0c;为避免大量的重复计算&#xff0c;用一个表记录所有已解决的子问题的答案&#xff0c;而在需要的…...

HNOI2014 世界树

洛谷P3233 [HNOI2014]世界树 题目大意 有一棵 n n n个点的树&#xff0c;每个点有一个编号&#xff0c;有 q q q次操作。对于每次操作&#xff0c;给出 m m m个点并称为议事点&#xff0c;树上各个点由离这个点最近的议事点管理&#xff08;如果有多个议事点离这个点最近&…...

在MyBatis XML文件中处理特殊符号的方法,如“>”、“<”、“>=”、“<=”这些符号XML会报错如何处理

前言 在MyBatis的XML映射文件中&#xff0c;我们经常需要使用特殊符号&#xff0c;比如"大于"、"小于"、"大于等于"、"小于等于"等比较操作符。然而&#xff0c;这些符号在XML中具有特殊的含义&#xff0c;因此需要进行特殊处理&…...

第三章--第一篇:什么是对话系统?

对话系统是一种人机交互的技术,旨在使计算机能够与人类进行自然而流畅的对话。它是人工智能领域的重要研究方向,具有重要的实际应用价值和广泛的普适性。 首先,对话系统的重要性在于它可以提供高效便捷的人机交互方式。传统的人机界面,如图形用户界面(GUI)和命令行界面(…...

项目基础搭建

一、项目创建 1.下载并安装nodejs 下载完成后&#xff0c;查看node版本 winR 快捷键&#xff0c;cmd确定&#xff0c;进入后台黑框 node -v查看npm安装路径 npm root -g安装cnpm镜像 npm install -g cnpm --registryhttps://registry.npm.taobao.org&#xff1a;查看npm版…...

PFCdocumentation_FISH Rules and Usage

目录 FISH Scripting FISH Rules and Usage Lines Data Types Reserved Names for Functions and Variables Scope of Variables Functions: Structure, Evaluation, and Calling Scheme Arithmetic: Expressions and Type Conversions Redefining FISH Functions Ex…...

如何完美卸载VS2015(2023年5月份实测有效)

使用控制面板卸载VS2015&#xff0c;出现正在配置您的系统&#xff0c;这可能需要一些时间&#xff0c;然后就出现卡住半个小时第二行的条都没有动的问题&#xff0c;这里提供vs2015以及以前版本的卸载方式 问题产生原因:他需要下载一些东西&#xff0c;然后由于你懂的网络原因…...

JavaScript如何声明和定义函数

JavaScript是一门非常有趣的编程语言&#xff0c;它可以让我们创建各种各样的函数来解决各种各样的问题。在JavaScript中&#xff0c;函数的声明和定义非常重要&#xff0c;因为它们决定了函数的行为和执行过程。 首先&#xff0c;让我们来看看JavaScript中函数的声明。在Java…...

微信小程序 WebSocket 通信 —— 在线聊天

在Node栏目就讲到了Socket通信的内容&#xff0c;使用Node实现Socke通信&#xff0c;还使用两个流行的WebSocket 库&#xff0c;ws 和 socket.io&#xff0c;在小程序中的WebSocket接口和HTML5的WebSocket基本相同&#xff0c;可以实现浏览器与服务器之间的全双工通信。那么本篇…...

VMware快照:简化虚拟化环境管理与数据保护

引言&#xff1a; 在虚拟化环境中&#xff0c;数据保护和灵活性是至关重要的。VMware快照作为一项强大的功能&#xff0c;为虚拟机管理者提供了便利和安全性。本文将介绍VMware快照的使用&#xff0c;以及它为用户带来的几个关键优势。 VMware快照是一项重要的功能&#xff0c…...

图的最短路径

最短路径算法对图结构没有特殊要求&#xff0c;不要求连通图&#xff0c;且有向图无向图均可。 最短路径算法目标是求得从某顶点出发&#xff0c;沿图的边到达另一顶点所经过的路径中&#xff0c;各边上权值之和最小的一条路径。解决最短路的问题有以下算法&#xff1a;Dijkst…...

RHCE----Shell变量和引用

1.变量的类型及含义 变量类型: 1、自定义变量: 在当前的shell命令行界面设置的变量是局部变量 例子&#xff1a; num1 namezhangsan 2、环境变量全局变量,通过export 导出后的局部变量是全局变量 、bash的初始化文件&#xff1a;/etc/profile&#xff1a;存放一些全局变量…...

【Redis】聊一下缓存雪崩、击穿、穿透、预热

缓存的引入带来了数据读取性能的提升&#xff0c;但是因此也引入新的问题&#xff0c;一个是数据双写一致性&#xff0c;另一个就是雪崩、击穿、穿透&#xff0c;那么如何解决这些问题&#xff0c;我们来说下对应的问题和解决方案 雪崩 缓存雪崩&#xff1a;同一时间内大量请…...

全景描绘云原生技术图谱,首个《云原生应用引擎技术发展白皮书》发布

5月12日&#xff0c;由神州数码主办、北京经开区国家信创园、中关村云计算产业联盟协办的2023通明湖论坛-云原生分论坛在京召开。论坛期间&#xff0c;神州数码联合北京通明湖信息技术应用创新中心、中国信通院和通明智云正式发布了《云原生应用引擎技术发展白皮书》&#xff0…...

【Python共享文件】——Python快速搭建HTTP web服务实现文件共享并公网远程访问

文章目录 1. 前言2. 视频教程3. 本地文件服务器搭建3.1 python的安装和设置3.2 cpolar的安装和注册 4. 本地文件服务器的发布4.1 Cpolar云端设置4.2 Cpolar本地设置 5. 公网访问测试6. 结语 1. 前言 数据共享作为和连接作为互联网的基础应用&#xff0c;不仅在商业和办公场景有…...

Mysql数据库分库分表

为什么使用分库分表&#xff1f; 传统的将数据集中存储至单一数据节点的解决方案&#xff0c;在性能、可用性和运维成本这三方面已经难于满足互联网的海量数据场景。 1&#xff09;性能 从性能方面来说&#xff0c;由于关系型数据库大多采用 B 树类型的索引&#xff0c;在数…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 原创笔记&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 上一篇&#xff1a;《数据结构第4章 数组和广义表》…...

Vue 3 + WebSocket 实战:公司通知实时推送功能详解

&#x1f4e2; Vue 3 WebSocket 实战&#xff1a;公司通知实时推送功能详解 &#x1f4cc; 收藏 点赞 关注&#xff0c;项目中要用到推送功能时就不怕找不到了&#xff01; 实时通知是企业系统中常见的功能&#xff0c;比如&#xff1a;管理员发布通知后&#xff0c;所有用户…...