UOJ10 UTR #1 pyx的难题(堆)

  显然优先级越高完成的越早,二分答案后用堆模拟就是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;
}

  

转载于:https://www.cnblogs.com/Gloid/p/10702419.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目:– JavaScript 中的患者数据管理系统 患者数据管理系统是为医院开发的 node JS 项目。通过使用此系统,您可以轻松访问患者数据,它具有成本效益,可改善患者护理和数据安全性。不仅如此,它还减少了错误范围。在运行项目之前,您需要下载 node.js。 这个患者数据管理项目包含 javascript、node.js 和 CSS。我们必须让服务器监听端口 3000,并使用 JSON 在客户端和服务器之间交换数据。这个项目会不断询问您有关插件更新的信息,因此请保持互联网畅通。此系统允许您执行 crud 操作。在这里,您是系统的管理员。您还可以添加所需的员工人数。此外,您还可以更新患者记录。该系统功能齐全且功能齐全。 要运行此项目,您需要在计算机上安装NodeJS并使用现代浏览器,例如 Google Chrome、  Mozilla Firefox。ReactJS项目中的此项目可免费下载源代码。有关项目演示,请查看下面的图像滑块。 对于手动安装 1.将主项目文件夹解压到任意目录 2.从 cmd 设置项目目录的路径 3. 输入命令“npm install” 4.完成后输入命令“npm start” 5.现在,您将获得一个 localhost:portnumber,并转到该 URL 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值