2023牛客暑期多校赛第五场 B.Circle of Mistery
文章目录
- 题目大意
- 题解
- 最优解及计算方法
- 一个性质
- 实现
- 参考代码
题目大意
给出长度为 n ( 1 ≤ n ≤ 1 0 3 ) n(1\leq n \leq 10^3) n(1≤n≤103) 的数组 w w w 和 k ( − 1 0 6 ≤ k ≤ 1 0 6 ) k(-10^6\leq k\leq 10^6) k(−106≤k≤106)。
要求构造一个排列 a a a ,连边 ( i , a i ) (i,a_i) (i,ai),显然的,会构成一个个环,要求至少一个环权值 w i w_i wi 之和大于 k k k。
且该排列中逆序数对最少。
题解
最优解及计算方法
显然的,为了使逆序数对最少,
我们仅对一个符合条件的环进行操作。其他的位置 a i = i a_i=i ai=i。
考虑逆序数对最小的情况,
我们构造 p a i = a i + 1 ( 1 ≤ i < s i z ) p s i z = a 1 p_{a_i}=a_{i+1}(1\leq i<siz)\ p_{siz}=a_1 pai=ai+1(1≤i<siz) psiz=a1
a 1 a_1 a1左边的数或 a n a_n an 右边的数没有贡献,
环里的数除了最右边每个贡献为 1 1 1 ,
a 1 ≤ i ≤ a n a_1 \leq i \leq a_n a1≤i≤an且不在环中的数贡献为 2 2 2 .
a n s = s i z − 1 + ( n − s i z − ( a 1 − 1 ) − ( n − a n ) ) ∗ 2 = 2 ∗ ( a n − a 1 ) − l + 1 ans=siz-1+(n-siz-(a_1-1)-(n-a_n))*2=2*(a_n-a_1)-l+1 ans=siz−1+(n−siz−(a1−1)−(n−an))∗2=2∗(an−a1)−l+1
一个性质
若左右皆固定,则个数越多越好。
我们发现在固定左端点时,环中个数固定的情况下,右端点加入该环,造成贡献为 − 1 -1 −1 。
所以仅当加入右端点后至少还能使得一个元素加入,
才是一个优秀的解
左端点同理
所以我们可以看出左端点和右端点必大于零。
实现
枚举三个维度复杂度为 O ( N 3 ) O(N^3) O(N3),被卡掉了。
我们发现有大量重复的计算,考虑使用数据结构优化。
在环中的元素有两类。
①: w i > = 0 w_i>= 0 wi>=0 一定要加入
②: w i < 0 w_i<0 wi<0,用来凑数的。
想要②类足够多,优先加入权值大的。
确定使用的数据结构为带排序的优先队列。
我们将 w i < 0 w_i<0 wi<0 的元素加入优先队列 q 1 q1 q1,每次找到使得当前总值 > k >k >k 的数据量。
加入答案队列 q q q。
由于之后可能会出现更大的负权值,所以我们要将预备列和答案队列维护交换一下使得
q 1 q1 q1 内的元素严格小于 q q q。
参考代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5,M=2e6+5;
const int inf=2e6;
int f[N];
priority_queue<int> q,q1;
int n,m,Ans=inf,tot;
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&f[i]);if(f[i]>=m)tot=1;}if(tot){puts("0");return 0;}for(int l=1;l<=n;l++){while(q.size())q.pop();while(q1.size())q1.pop();int ans=0,siz=0;if(f[l]>0)for(int r=l;r<=n;r++){if(f[r]>0){siz++;ans+=f[r];int A=ans-m,c=siz;if(A<0)continue;while(q1.size() && q.size() && q1.top()>-q.top()) //q中数据加负号使得栈顶为最小元素{ //维护答案队列int a=q1.top();int b=q.top();q1.pop();q.pop();q.push(-a);q1.push(-b);A+=b;A+=a;}while(q1.size() && A+q1.top()>=0) //加入新答案{int a=q1.top();q1.pop();q.push(-a);A+=a;siz++;}Ans=min(2*(r-l)-siz+1,Ans);}elseq1.push(f[r]);}}if(Ans==inf) //不存在权值和大于kputs("-1");elseprintf("%d\n",Ans);
}
2023牛客暑期多校赛第五场 B.Circle of Mistery相关推荐
- 2023牛客暑期多校训练营5-B Circle of Mistery
2023牛客暑期多校训练营5-B Circle of Mistery https://ac.nowcoder.com/acm/contest/57359/B 文章目录 2023牛客暑期多校训练营5-B ...
- 2020牛客暑期多校训练营(第一场)
文章目录 A B-Suffix Array B Infinite Tree C Domino D Quadratic Form E Counting Spanning Trees F Infinite ...
- 2020牛客暑期多校训练营(第二场)
2020牛客暑期多校训练营(第二场) 最烦英语题 文章目录 A All with Pairs B Boundary C Cover the Tree D Duration E Exclusive OR ...
- E Groundhog Chasing Death(2020牛客暑期多校训练营(第九场))(思维+费马小定理+质因子分解)
E Groundhog Chasing Death(2020牛客暑期多校训练营(第九场))(思维+费马小定理+质因子分解) 链接:https://ac.nowcoder.com/acm/contest ...
- Circle of Mistery 2023牛客暑期多校训练营5 B
登录-专业IT笔试面试备考平台_牛客网 题目大意:给出一个n个数的数组a,求一个排列,使其形成的其中一个置换环上的数的和>=k,并使产生的逆序对数量最少 1<=n<=1e3;-1e6 ...
- 【2019牛客暑期多校训练营(第二场) - H】Second Large Rectangle(单调栈,全1子矩阵变形)
题干: 链接:https://ac.nowcoder.com/acm/contest/882/H 来源:牛客网 题目描述 Given a N×MN \times MN×M binary matrix. ...
- 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)
链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...
- 【2019牛客暑期多校训练营(第二场)- E】MAZE(线段树优化dp,dp转矩阵乘法,线段树维护矩阵乘法)
题干: 链接:https://ac.nowcoder.com/acm/contest/882/E?&headNav=acm 来源:牛客网 Given a maze with N rows an ...
- 【2019牛客暑期多校训练营(第二场)- F】Partition problem(dfs,均摊时间优化)
题干: 链接:https://ac.nowcoder.com/acm/contest/882/F 来源:牛客网 Given 2N people, you need to assign each of ...
最新文章
- 【倒计时】Qtum量子链全节点超级大奖1000QTUM,不要错过!
- SpringBoot Admin2.0 集成 Java 诊断神器 Arthas 实践
- java中oracle.链接,java连接Oracle数据库的方法解析
- mxnet基础到提高(22)-C++-常量和变量
- web----DNS解析
- jzoj1029-电子眼【树形dp】
- 无法创建t的通用数组_创建通用数组的问题
- 前端学习(2599):请求操作
- Script Debugger + VS.Net调试javascript [转]
- 【zookeeper】zookeeper znode 存储系统解密
- 安装完eclipse需要做的一些准备工作
- 计算机专业开学要带电脑吗,大学新生刚开学需要带电脑吗
- 应用华云对象存储服务实现网站存储的平滑迁移实践
- 永磁同步电机学习(一)
- 华为笔试题:进制转换
- “为爱尖叫”,爱奇艺的晚会聚能术与商业价值释放场
- 从dig命令理解DNS
- 我知道的Activity
- 炼数成金-Spark大数据平台
- 每位开发人员都应铭记的10句编程谚语
热门文章
- 《浪潮之巅》读后感(转)
- HTML实现视频直播功能
- 智慧树怎么导入教务系统的课_智慧树——后疫情时代异地直播课堂解决方案
- Ant Design Vue UI组件中改变textarea的宽度和高度
- 如何在windows上调试安卓机谷歌浏览器上的页面
- MLIR初识 —— Dialect及Operation详解
- ios swift UITabBarController present dismiss
- 最全Pycharm教程(41)——Pycharm扩展功能之便签注释
- 展讯平台安卓充电驱动框架
- 我与有限元——初生牛犊------永远的有限元大师MIT的Klaus-Jürgen Bathe教授