显然优先级越高完成的越早,二分答案后用堆模拟就是O(nlog2n)的。考虑去一个log。先固定特殊题的优先级为最低,模拟一遍。这样在特殊题被扔过来到T的这段时间内,如果将特殊题的优先级提高至超过这其中某些时间段所做的题,这些时间就会空出来变为做特殊题。所以从小到大枚举优先级,直到空出来的时间恰好与做特殊题的时间相等即可。

  有一种类似但错误的思路是,将特殊题优先级提高至超过从特殊题被扔过来到做完特殊题的这段时间内的某些时间段所做的题,让以此提前的时间为做完特殊题的时间-T。但实际上在让特殊题提前的过程中,可能会使原本某些在其之前做完的题的被扔过来的时间变到做完特殊题之后。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define N 300010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,c[N],s[N];
ll ans[N],T;
map<int,int> f;
struct data
{
int t,s,p,i;
bool operator <(const data&a) const
{
return p<a.p;
}
}a[N];
bool cmp(const data&a,const data&b)
{
return a.t<b.t;
}
priority_queue<data> q;
signed main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read();
for (int i=1;i<=n;i++) a[i].t=read(),s[i]=a[i].s=read(),f[a[i].p=read()]=1,a[i].i=i;
cin>>T;
sort(a+1,a+n+1,cmp);
bool flag=0;
for (int i=1;i<=n;i++)
{
int lst=a[i-1].t;
while (!q.empty()&&lst<a[i].t)
{
data x=q.top();q.pop();
if (flag) c[x.i]+=min(min(T,1ll*a[i].t)-lst,1ll*x.s);
if (a[i].t-lst>=x.s) lst+=x.s;
else x.s-=a[i].t-lst,q.push(x),lst=a[i].t;
if (lst>=T) {flag=0;break;}
}
if (lst>=T) {flag=0;break;}
q.push(a[i]);if (a[i].p==-1) flag=1;
}
if (flag)
{
ll lst=a[n].t;
while (!q.empty())
{
data x=q.top();q.pop();
c[x.i]+=min(T-lst,1ll*x.s);
lst+=x.s;if (lst>=T) break;
}
}
sort(a+1,a+n+1);
ll t=0;
for (int i=1;i<=n;i++)
{
t+=c[a[i].i];
if (t==a[1].s)
{
if (i==1) a[1].p=1;
else a[1].p=a[i].p;
break;
}
}
while (f[a[1].p]) a[1].p++;
cout<<a[1].p<<endl;
sort(a+1,a+n+1,cmp);
for (int i=1;i<=n;i++) a[i].s=s[a[i].i];
while (!q.empty()) q.pop();
for (int i=1;i<=n;i++)
{
int lst=a[i-1].t;
while (!q.empty()&&lst<a[i].t)
{
data x=q.top();q.pop();
if (a[i].t-lst>=x.s) ans[x.i]=lst+=x.s;
else x.s-=a[i].t-lst,q.push(x),lst=a[i].t;
}
q.push(a[i]);
}
ll lst=a[n].t;
while (!q.empty())
{
data x=q.top();q.pop();
ans[x.i]=lst+=x.s;
}
for (int i=1;i<=n;i++) printf("%lld ",ans[i]);
return 0;
}

  

UOJ10 UTR #1 pyx的难题(堆)的更多相关文章

  1. UOJ #10 pyx的难题

    pyx的难题 被这题搞得生无可恋. 容易看出 题目完成时间与优先级之间的关系是单调的,故可以二分答案. 用于二分的答案可以取\(O(n)\)个离散值, 这样就很方便地保证了优先级各不相同. 可以用优先 ...

  2. 【uoj#280】[UTR #2]题目难度提升 对顶堆+STL-set

    题目描述 给出 $n$ 个数 $a_1,a_2,...,a_n$ ,将其排为序列 $\{p_i\}$ ,满足 $\{前\ i\ 个数的中位数\}$ 单调不降.求字典序最大的 $\{p_i\}$ . 其 ...

  3. uoj280 【UTR #2】题目难度提升 堆维护中位数+set

    题目传送门 http://uoj.ac/problem/280 题解 这道题很妙啊. 这种题目如果给予选手足够的时间,每一个选手应该都能做出来. 大概就是核心思路看上去很简单,但是想要推出来并不简单. ...

  4. C++ : 从栈和堆来理解C#中的值类型和引用类型

    C++中并没有值类型和引用类型之说,标准变量或者自定义对象的存取默认是没有区别的.但如果深入地来看,就要了解C++中,管理数据的两大内存区域:栈和堆. 栈(stack)是类似于一个先进后出的抽屉.它的 ...

  5. [Leetcode]双项队列解决滑动窗口最大值难题

    这道题是从优先队列的难题里面找到的一个题目.可是解法并不是优先队列,而是双项队列deque 其实只要知道思路,这一道题直接写没有太大的问题.我们看看题 给定一个数组 nums,有一个大小为 k 的滑动 ...

  6. 【bzoj2259】[Oibh]新型计算机 堆优化Dijkstra

    题目描述 Tim正在摆弄着他设计的“计算机”,他认为这台计算机原理很独特,因此利用它可以解决许多难题. 但是,有一个难题他却解决不了,是这台计算机的输入问题.新型计算机的输入也很独特,假设输入序列中有 ...

  7. 从IntToHex()说起,栈/堆地址标准写法 good

    学习中的一些牢骚.栈/堆地址标准写法. 2017-02-12 • 杂谈 • 暂无评论 • 老衲 •浏览 226 次 我一直都在寻找各种业务功能的最简单写法,用减法的模式来开发软件.下面是我的写法,如果 ...

  8. ELK优化难题解决

    你头疼的ELK难题,本文几乎都解决了 一.ELK实用知识点总结 1.编码转换问题 这个问题,主要就是中文乱码. input中的codec=>plain转码: codec => plain ...

  9. eclipse memory analyzer对系统内存溢出堆文件解析0(转)

    前言 在平时工作过程中,有时会遇到OutOfMemoryError,我们知道遇到Error一般表明程序存在着严重问题,可能是灾难性的.所以找出是什么原因造成OutOfMemoryError非常重要.现 ...

随机推荐

  1. Oracle11g: datetime

    --上一月,上一年 select add_months(sysdate,-1) last_month,add_months(sysdate,-12) last_year from dual; --下一 ...

  2. JS判断类型

    JS中的typeof方法可以查看数据的类型,如下: console.log(typeof 2); // number console.log(typeof "2"); // str ...

  3. 解决GJson 获取web api数据出现Not a JsonObject问题

    服务器端web api服务采用asp.net web api编写,对请求的数据序列化成Json格式的字符串进行传递. 客户端采用Java进行接收处理,处理采用GJson进行解析,出现Not a Jso ...

  4. Neutron server的运行原理(未完待续)

    1.Neutron server首先是一个web server, 对于http和https协议的报文进行响应. 2.Neutron server进程里面包含了一个WSGI 应用程序,以及不同模块的pl ...

  5. 加载loading对话框的功能(不退出沉浸式效果)

    上一篇基于修改系统源码的前提下,实现了完全的沉浸式体验效果.可参考这篇 戳这 一.自定义Dialog 在沉浸式效果下,当界面弹出对话框时,对话框将获取到焦点,这将导致界面退出沉浸式效果,那么是不是能通 ...

  6. MySQL 基础知识梳理学习(四)----GTID

    在日常运维中,GTID带来的最方便的作用就是搭建和维护主从复制.GTID的主从模式代替了MySQL早期版本中利用二进制日志文件的名称和日志位置的做法,使用GTID使操作和维护都变得更加简洁和可高. 1 ...

  7. window下 mongodb快速安装

    下载地址 https://www.mongodb.org/dl/win32/x86_64-2008plus-ssl 建立文件夹和文件 #数据库路径 dbpath=G:\mongodb3.4.12\da ...

  8. SQL 百万级数据提高查询速度的方法

    ----------------[转] 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描.2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 ...

  9. HALCON学习笔记

    2019-2-2: 硬件选型--->镜头光源相机选型第一讲.avi: 高斯公式:1/u+1/v=1/f  u:物距  v:像距 f:焦距 线放大倍率:像高/物高  或者 像距/物距 镜头需要掌握 ...

  10. 【原】Java学习笔记010 - 数组

    package cn.temptation; public class Sample01 { public static void main(String[] args) { // 需求:一堆分数,要 ...