文章目录

  • 题目大意
  • 题解
    • 最优解及计算方法
    • 一个性质
    • 实现
  • 参考代码

题目大意

给出长度为 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相关推荐

  1. 2023牛客暑期多校训练营5-B Circle of Mistery

    2023牛客暑期多校训练营5-B Circle of Mistery https://ac.nowcoder.com/acm/contest/57359/B 文章目录 2023牛客暑期多校训练营5-B ...

  2. 2020牛客暑期多校训练营(第一场)

    文章目录 A B-Suffix Array B Infinite Tree C Domino D Quadratic Form E Counting Spanning Trees F Infinite ...

  3. 2020牛客暑期多校训练营(第二场)

    2020牛客暑期多校训练营(第二场) 最烦英语题 文章目录 A All with Pairs B Boundary C Cover the Tree D Duration E Exclusive OR ...

  4. E Groundhog Chasing Death(2020牛客暑期多校训练营(第九场))(思维+费马小定理+质因子分解)

    E Groundhog Chasing Death(2020牛客暑期多校训练营(第九场))(思维+费马小定理+质因子分解) 链接:https://ac.nowcoder.com/acm/contest ...

  5. Circle of Mistery 2023牛客暑期多校训练营5 B

    登录-专业IT笔试面试备考平台_牛客网 题目大意:给出一个n个数的数组a,求一个排列,使其形成的其中一个置换环上的数的和>=k,并使产生的逆序对数量最少 1<=n<=1e3;-1e6 ...

  6. 【2019牛客暑期多校训练营(第二场) - H】Second Large Rectangle(单调栈,全1子矩阵变形)

    题干: 链接:https://ac.nowcoder.com/acm/contest/882/H 来源:牛客网 题目描述 Given a N×MN \times MN×M binary matrix. ...

  7. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...

  8. 【2019牛客暑期多校训练营(第二场)- E】MAZE(线段树优化dp,dp转矩阵乘法,线段树维护矩阵乘法)

    题干: 链接:https://ac.nowcoder.com/acm/contest/882/E?&headNav=acm 来源:牛客网 Given a maze with N rows an ...

  9. 【2019牛客暑期多校训练营(第二场)- F】Partition problem(dfs,均摊时间优化)

    题干: 链接:https://ac.nowcoder.com/acm/contest/882/F 来源:牛客网 Given 2N people, you need to assign each of ...

最新文章

  1. 【倒计时】Qtum量子链全节点超级大奖1000QTUM,不要错过!
  2. SpringBoot Admin2.0 集成 Java 诊断神器 Arthas 实践
  3. java中oracle.链接,java连接Oracle数据库的方法解析
  4. mxnet基础到提高(22)-C++-常量和变量
  5. web----DNS解析
  6. jzoj1029-电子眼【树形dp】
  7. 无法创建t的通用数组_创建通用数组的问题
  8. 前端学习(2599):请求操作
  9. Script Debugger + VS.Net调试javascript [转]
  10. 【zookeeper】zookeeper znode 存储系统解密
  11. 安装完eclipse需要做的一些准备工作
  12. 计算机专业开学要带电脑吗,大学新生刚开学需要带电脑吗
  13. 应用华云对象存储服务实现网站存储的平滑迁移实践
  14. 永磁同步电机学习(一)
  15. 华为笔试题:进制转换
  16. “为爱尖叫”,爱奇艺的晚会聚能术与商业价值释放场
  17. 从dig命令理解DNS
  18. 我知道的Activity
  19. 炼数成金-Spark大数据平台
  20. 每位开发人员都应铭记的10句编程谚语

热门文章

  1. 《浪潮之巅》读后感(转)
  2. HTML实现视频直播功能
  3. 智慧树怎么导入教务系统的课_智慧树——后疫情时代异地直播课堂解决方案
  4. Ant Design Vue UI组件中改变textarea的宽度和高度
  5. 如何在windows上调试安卓机谷歌浏览器上的页面
  6. MLIR初识 —— Dialect及Operation详解
  7. ios swift UITabBarController present dismiss
  8. 最全Pycharm教程(41)——Pycharm扩展功能之便签注释
  9. 展讯平台安卓充电驱动框架
  10. 我与有限元——初生牛犊------永远的有限元大师MIT的Klaus-Jürgen Bathe教授