C SRM 05 - YYL 杯 R1

背景

tjmak

描述

给一个大小为n的序列V。序列里的元素有正有负。问至少要删除多少个元素使得序列里不存在区间(要求非空)和 >= S.如果答案大于m,则输出-1

输入格式

第一行3个整数n,m,S含义如上

第二行n个整数 vi

输出格式

一个整数,表示至少要删除多少个数字。

样例输入

9 1000001 11
4 5 6 -8 5 6 6 4 3

样例输出

4

数据范围与约定

样例解释

删除第3,第5,第6和第7个数字。

来源

原创

这道题我确实是想了很久 首先我们的图应该长这样

那么我们发现以一个点为右端点的话 只要他所在的区间最大值合法 那么当前其他的区间也一定合法

而我们一个区间的值就是当前点的前缀和减去前缀和的最小值(一定<=0) 那么这一定是最大的区间了(其实最后和前缀最小没有任何关系)

那么我们堆中维护的是:在 当前位置 和 前缀和最小值所在位置 之间 删去一个数 能使 (当前前缀和-前缀和最小值) 减少多少

//其实我最后是平衡树实现的(用的multiset)

我们插入一数分两类

1.新加一个正数,直接入堆如果因此 当前前缀和-前缀和最小值 >=S,就删去一个数,同时pop(一个就好了)

2.新加一个负数x,不断pop出堆中最小值加到x上,直至x>=0,此时把x入堆,这代表最后一次加到x上的那个操作,因为这个负数而代价变为x,同时有其它被pop的操作变得没有意义

这个得解释一下 比如:

比如堆中是2 3 4 5,当前加入-7,2+3+4-7=2≥0,堆中变为2 5

因为-7的效果 操作了5之后,再操作一次前缀和最小处就会移到-7后面,前面的操作就失效了 删除4的效果被减弱至2

至于为什么是2呢 是这样的 删数的时候我们贪心删的第一个肯定是5对吧

那我们再删四的时候 2+3-7=-2<0 这个时候我们的区间最大值应该从0重新开始算 所以四的效果只有2

“这个等价变换我觉得非常妙”(by ccz)

这样处理过后其实就很好写了

当然 我们堆中元素也相当于数列已处理部分的一个等价

插入正数然后的pop相当于删去一个数(这个时候答案要+1)
插入负数然后的pop相当于证明了某些位置不可能被删除

而也容易证明前缀最小值的左边的数都是完全没有用的所以完全不用考虑 这也就是为什么sum'<0的时候直接clear就好了

因为前面的都是没用的了 我们计数肯定从0开始

删去对后面的最值没有任何影响 同时我们删的都是正数,区间只会从不合法变成合法

最后为了方便我用的multiset实现 其实和平衡树差不多

当然也可以用堆实现但是要四个 我懒啊 所以就调了STL

23333

其他的看代码吧

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
const int mod=1e9+7;
int read(){int ans=0,f=1,c=getchar();while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();}while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();}return ans*f;
}
int n,m,sum,ans,S,x;
multiset<int> q;
multiset<int>::iterator now;
void water(){for(int i=1;i<=n;i++){x=read();if(x>=S) ans++;if(ans>m) break;}printf("%d\n",ans>m?-1:ans);
}
int main()
{n=read(); m=read(); S=read();if(S<=0){water(); return 0;}for(int i=1;i<=n;i++){x=read();if(sum+x<=0) q.clear(),sum=0;else if(x<0){sum+=x;while(x<0){now=q.begin();q.erase(now);x+=*now;if(x>0) q.insert(x);}}else{sum+=x;  q.insert(x);if(sum<S) continue;ans++;now=q.end();now--;q.erase(now);sum-=*now; }}printf("%d\n",ans>m?-1:ans);return 0;
}

View Code

转载于:https://www.cnblogs.com/lyzuikeai/p/7192376.html

汕头市队赛 C SRM 05 - YYL 杯 R1 T3!相关推荐

  1. 汕头市队赛 yyl杯1 T1

    A SRM 05 - YYL 杯 R1 背景 傻逼题 描述 给一个序列,序列里只有两种元素1和2.现在要从序列里选出一些非空子序列使得子序列里两种元素数量相同.问有多少种方案数? 输入格式 多组数据 ...

  2. 汕头市队赛 yyl杯1 T2

    B SRM 05 - YYL 杯 R1 背景&&描述 有一个拥有n个城市的国家.这个国家由n-1条边连接起来.有一天国家发生叛乱.叛军已占领了一些城市.如果叛军占领的城市中,存在两个城 ...

  3. 汕头市队赛 SRM16 T2

    描述 猫和老鼠,看过吧?猫来了,老鼠要躲进洞里.在一条数轴上,一共有n个洞,位置分别在xi,能容纳vi只老鼠.一共有m只老鼠位置分别在Xi,要躲进洞里,问所有老鼠跑进洞里的距离总和最小是多少. 输入格 ...

  4. 广东汕头市队赛? T1 模拟

    骰子 (dice.pas/c/cpp) 1s 128MB 骰子.骰子就是很普通的骰子:骰子有六个面,分别标号1到6,三对面上的数字之和均为7. 游戏的地图:一个高为R宽为C的网格图. 骰子一开始的状态 ...

  5. 蓝桥杯2022web省赛赛题题解-05

    蓝桥杯2022web省赛赛题题解-05 完整代码见GitHub:github.com/Veilhry/lanqiaoweb/tree/master/05 冬奥会大抽奖 介绍 蓝桥云课庆冬奥需要举行一次 ...

  6. java. 三个人比赛怎么写_两个乒乓球队进行比赛,找出三队赛手的名单

    [java]代码库import java.util.ArrayList; /** * 两个乒乓球队进行比赛,各出三人.甲队为a,b,c三人,乙队为x,y,z三人.已抽签决定比赛名单.有人向队员打听比赛 ...

  7. 乒乓球比赛 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比 请编程序找出三队赛手的名单。

    //:两个乒乓球队进行比赛,各出三人.甲队为a,b,c三人,乙队为x,y,z三人.   //已抽签决定比赛名单.有人向队员打听比赛的名单.a说他不和x比,c说他不和x,z比 //,请编程序找出三队赛手 ...

  8. 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。 //已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。

    //两个乒乓球队进行比赛,各出三人.甲队为a,b,c三人,乙队为x,y,z三人. //已抽签决定比赛名单.有人向队员打听比赛的名单.a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单. # ...

  9. 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单

    题目 两个乒乓球队进行比赛,各出三人.甲队为a,b,c三人,乙队为x,y,z三人.已抽签决定比赛名单.有人向队员打听比赛的名单.a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单 解析: ...

最新文章

  1. linux中配置jmeter环境变量,linux java 和jmeter 环境变量配置文件笔记(原)
  2. SpringBoot 上传多个文件
  3. centos 7.6安装java_安装 QRadar Community Edition
  4. 最优化课堂笔记08——非线性规划中的一些其他方法(考试你懂得)
  5. 荣耀v10Android9新功能,荣耀10、荣耀V10开启安卓9.0内测 日常领跑行业
  6. 解决tomcat控制台以及localhost Log和Catalina Log乱码问题
  7. [转]Google发现的十大真理
  8. thinkphp 常用SQL执行语句总结
  9. 聊聊flink JobManager的heap大小设置 1
  10. php如何实现运算符重载,JS怎样实现运算符重载
  11. vijos1655萌萌的糖果博弈
  12. PWM整流器仿真。 在simulink中搭建了PWM整流器,采用电压电流双闭环控制,实现了网侧电压与电流同相位
  13. Swift游戏实战-跑酷熊猫 10 视差滚动背景
  14. 蒟蒻的网络流24题解题记
  15. 总结了一些微信小程序推广方法
  16. linux获取时间戳精确到毫秒,微妙
  17. 告别慢SQL,如何去写一手好SQL ?
  18. hdoj 还是畅通工程
  19. ExoPlayer记录学习
  20. 2019年第一件大事儿! 华为Twitter事故真相了!

热门文章

  1. 计算机实验小学教导主任,实验小学教导主任岗位职责(2页)-原创力文档
  2. 「架构远景·」TOGAF建模:价值链图
  3. linux ping大包指令,linux下ping命令使用详解,
  4. 最短路径--Floyd、Dijkstra、Bellman、SPFA算法
  5. java 二进制、位运算、和移位运算符(2013-07-30-bd 写的日志迁移
  6. GIS软件开发工具包TatukGIS Developer Kernel更新至v11.7
  7. Ultimate Rope Editor 柔性绳子编辑器插件
  8. 登记成绩之小东助手v1
  9. C# 关于“请求已中止:无法创建SSL / TLS安全通道”的问题(已解决)
  10. JQuery基础学习