[loj2393]门票安排
为了方便,不妨假设$a_{i}\le b_{i}$,并将问题转换为以下形式:
$\forall 1\le i\le m$,将$[a_{i},b_{i})$或$[1,a_{i})\cup [b_{i},n]$覆盖共$c_{i}$次,最小化覆盖次数最多的位置
考虑先全部覆盖$[a_{i},b_{i})$,再将若干个区间反转来调整,并且要求最终反转的方案(在取到最小值的基础上)反转的区间个数最少,下面来分析此方案的性质——
记初始第$i$个位置被覆盖$s_{i}$次,反转后第$i$个位置被覆盖$t_{i}$次
性质1:反转的区间两两有交
若存在两个反转的区间不交,撤销反转这两个区间,显然最小值不降且个数减小
由此,记反转的区间交为$[x,y]$,$[x,y]$中$t_{i}$的最大值为$t_{k}$
引理:$\forall i\in [x,y],s_{i}-t_{i}=s_{k}-t_{k}$;$\forall i\not\in [x,y],s_{i}-t_{i}\le s_{k}-t_{k}-2$
注意到$s_{i}-t_{i}$仅取决于$i$被多少个反转的区间覆盖,且每少一个区间值会减小2
另外,由前者显然可得$s_{k}=\max_{x\le i\le y}s_{i}$,以下不再叙述
性质2:$t_{k}\ge \max_{1\le i\le n}t_{i}-1$
若不成立,撤销反转一个$l=x$的区间和一个$r=y$的区间,那么最小值不降且个数减小
性质3:$\forall s_{j}=\max_{1\le i\le n}s_{i},j\in [x,y]$
若存在$j\not\in [x,y]$,则$s_{k}-t_{k}\le s_{j}-(t_{j}-1)$(根据性质2),与引理矛盾
结合上述性质,来考虑如何求出此方案——
二分枚举答案$T=\max_{1\le i\le n}t_{i}$,取$s_{i}$的最大值为$s_{k}$,再枚举$t_{k}=T$或$T-1$
由于所有反转区间都包含$k$,即可推出反转的区间个数$cnt=s_{k}-t_{k}$
记$cnt'_{i}$为包含$i$的反转区间个数,限制即$s_{i}+(cnt-2cnt'_{i})\le T$,不妨写成$cnt'_{i}\ge lim_{i}$的形式
由此,考虑在满足$i\in [1,k)$的限制基础上,最大化反转区间的右端点
具体的,从小到大枚举$i$,并维护左端点$\le i$的未反转区间右端点(要求$\ge k$),在$i$上贪心反转右端点最大的$\max(lim_{i}-cnt'_{i},0)$个区间即可
事实上,之前的性质也适用于"最大覆盖次数$\le T$(而不是取到最小值)且反转的区间个数最少"的反转方案,因此之前的二分显然具备单调性
时间复杂度为$o(n\log^{2}n)$,可以通过

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 200005
4 #define ll long long
5 #define pii pair<int,int>
6 #define fi first
7 #define se second
8 vector<pii>v[N];
9 priority_queue<pii>q;
10 int n,m,k,x,y,z;
11 ll s[N],t[N];
12 bool check(ll T,ll cnt){
13 ll Cnt=cnt;
14 memset(t,0,sizeof(t));
15 while (!q.empty())q.pop();
16 for(int i=1;i<=k;i++){
17 t[i]+=t[i-1];
18 for(int j=0;j<v[i].size();j++)
19 if (v[i][j].fi>=k)q.push(v[i][j]);
20 ll lim=(s[i]+cnt-T+1>>1);
21 if (i==k)lim=cnt;
22 while (t[i]<lim){
23 if (q.empty())return 0;
24 pii o=q.top();
25 q.pop();
26 if (t[i]+o.se<=lim){
27 Cnt-=o.se,t[i]+=o.se,t[o.fi]-=o.se;
28 continue;
29 }
30 int s=lim-t[i];
31 Cnt-=s,t[i]+=s,t[o.fi]-=s;
32 q.push(make_pair(o.fi,o.se-s));
33 }
34 }
35 if (Cnt<0)return 0;
36 for(int i=k+1;i<=n;i++){
37 t[i]+=t[i-1];
38 if (s[i]+(cnt-(t[i]<<1))>T)return 0;
39 }
40 return 1;
41 }
42 bool check(ll T){
43 return check(T,s[k]-T)|check(T,s[k]-(T-1));
44 }
45 int main(){
46 scanf("%d%d",&n,&m);
47 for(int i=1;i<=m;i++){
48 scanf("%d%d%d",&x,&y,&z);
49 if (x>y)swap(x,y);
50 s[x]+=z,s[y]-=z;
51 v[x].push_back(make_pair(y,z));
52 }
53 for(int i=1;i<=n;i++)s[i]+=s[i-1];
54 for(int i=1;i<=n;i++)
55 if (s[k]<s[i])k=i;
56 ll l=0,r=s[k];
57 while (l<r){
58 ll mid=(l+r>>1);
59 if (check(mid))r=mid;
60 else l=mid+1;
61 }
62 printf("%lld\n",l);
63 return 0;
64 }
[loj2393]门票安排的更多相关文章
- 微软TechEd2013大会门票热卖!
微软TechEd2013大会将在北京.上海两地隆重举行! 会议时间安排如下: 北京:12月5日—6日 国家会议中心 上海:12月11日—12日 国际会议中心 现在是门票热卖时期,票价:2688.0 ...
- 51Nod 1428 活动安排问题
51Nod 1428 活动安排问题 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 1428 活 ...
- Beta版本冲刺计划及安排
经过紧张的Alpha阶段,很多组已经从完全不熟悉语言和环境,到现在能够实现初步的功能.下一阶段即将加快编码进度,完成系统功能.强化软件工程的体会.Beta阶段的冲刺时间为期七天,安排在2016.12. ...
- C语言 活动安排问题之二
有若干个活动,第i个开始时间和结束时间是[Si,fi),活动之间不能交叠,要把活动都安排完,至少需要几个教室? #include <stdio.h> #include <string ...
- C语言 活动安排问题
有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动? #include <stdio.h> #include <stdlib ...
- hdu 2037简单贪心--活动安排问题
活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子.该问题要求高效地安排一系列争用某一公共资源的活动.贪心算法提供了一个简单.漂亮的方法使得尽可能多的活动 ...
- 项目安排(离散化+DP)
题目来源:网易有道2013年校园招聘面试二面试题 题目描述: 小明每天都在开源社区上做项目,假设每天他都有很多项目可以选,其中每个项目都有一个开始时间和截止时间,假设做完每个项目后,拿到报酬都是不同的 ...
- 【BZOJ1725】[Usaco2006 Nov]Corn Fields牧场的安排 状压DP
[BZOJ1725][Usaco2006 Nov]Corn Fields牧场的安排 Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M< ...
- dhtmlxScheduler日程安排控件
dhtmlxScheduler是一个JavaScript日程安排控件 官方网站:http://www.dhtmlx.com/在线帮助文档:http://docs.dhtmlx.com/doku.php ...
随机推荐
- 全套Java教程_Java基础入门教程,零基础小白自学Java必备教程 #011 # 第十一单元 String&ArrayList #
一.本单元知识点概述 (Ⅰ)知识点概述 二.本单元教学目标 (Ⅰ)重点知识目标 1.ArrayList集合的常用方法2.ArrayList存储数据和遍历数据3.String类的构造方法4.String ...
- feign的一个注解居然隐藏这么多知识!
引言 最近由于业务的需要,需要接入下阿里云的一个接口,打开文档看了看这个接口看下来还是比简单的目测个把小时就可以搞定,但是接入的过程还是比较坎坷的.首先我看了看他给的示例,首先把阿里云文档推荐的dem ...
- CountBoard 是一个基于Tkinter简单的,开源的桌面日程倒计时应用
CountBoard 是一个基于Tkinter简单的,开源的桌面日程倒计时应用. 项目地址 https://github.com/Gaoyongxian666/CountBoard 基本功能 置顶功能 ...
- 海信A6/A6L A7Pro/CC A5PRO/A5PRO CC 安装gms google service指南
用过海信双面屏或者eink手机的朋友都知道,海信手机就是死活安装不了谷歌全家桶,因为海信的领导说跟谷歌有协议不能安装谷歌框架(还说后期google审核坚决不给安装,人家其他ov mui都可以安装).不 ...
- UI BLOCK自定义枚举控件的宽度
三步: 1.修改PresentationStyle属性为Radio Box 2.修改NumberOfColumns属性为指定的宽度(显示字符的个数) 3.将PresentationStyle属性改回O ...
- FastAPI 学习之路(五十四)startup 和 shutdown
我们在实际的开发中呢,总会遇到这样的场景,我们想在启动或者终止的时候,做一些事情,那么应该如何实现呢,其实也是很简单.fastapi提供了这样的操作. 那么我们看下具体是怎么实现的呢 app = Fa ...
- 第六次Scrum Metting
日期:2021年5月3日 会议主要内容概述:讨论前后端进度,前端各模块对接以及前后端对接. 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 徐宇龙 后端 数据模块 ...
- [no code] Scrum Meeting 博客目录
项目 内容 2020春季计算机学院软件工程(罗杰 任健) 2020春季计算机学院软件工程(罗杰 任健) 作业要求 Scrum Meeting博客目录 我们在这个课程的目标是 远程协同工作,采用最新技术 ...
- [技术博客] 软工-Ruby on Rails 后端开发总结分享
[技术博客] 软工-Ruby on Rails 后端开发总结分享 在这次软件编写中,我们的后端使用了Ruby on Rails (RoR)框架. Rails框架是用Ruby编写的.这意味着当我们为Ru ...
- [软工作业]-软件案例分析-CSDN
[软工作业]-软件案例分析-CSDN(app) 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业-软件案例分析 我在这个课程的目标是 ...