求调,100分, Unaccepted
查看原帖
求调,100分, Unaccepted
443023
chenkuo楼主2023/10/9 12:57
#include<bits/stdc++.h>
#define longint long long
using namespace std;
inline longint read(){
	char ch=getchar();longint x=0;bool flag=0;
	while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
	if(ch=='-') flag=1,ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	if(flag) return -x;return x;
}
longint n,maxn=-2e18,wei,de;
priority_queue<int> qian;
bool b[100001];
struct asd{
	longint distance,tired,t,wei,ch;
}a[100001];
bool operator<(const asd &a,const asd &b){
	return a.t>b.t;
}
priority_queue<asd> q;
int main(){
//	freopen("salesman.in","r",stdin);
//	freopen("salesman.out","w",stdout);
	n=read();longint u=1;
	for(int i=1;i<=n;i++) a[i].distance=read();
	for(int i=1;i<=n;i++) a[i].tired=read();
	for(int i=1;i<=n;i++) a[i].t=2*a[i].distance+a[i].tired,a[i].wei=i;
	for(int i=1;i<=n;i++) if(2*a[i].distance+a[i].tired>maxn) maxn=2*a[i].distance+a[i].tired,wei=a[i].distance,de=i;
	printf("%lld\n",maxn);b[de]=1;
	for(int i=1;i<de;i++) qian.push(a[i].tired);
	for(int i=de+1;i<=n;i++) q.push(a[i]);
	while(u<n){
		u++;
		longint ls=0;
		if(!q.empty()){
			ls=q.top().t;
			while(b[q.top().wei]){
				q.pop();
				ls=q.top().t;
			}
		}
		longint qjj=0;
		if(!qian.empty()) qjj=qian.top();
		if(ls<qjj){
			qian.pop();
			maxn+=qjj;
		}else{
			maxn+=ls-2*wei;
			for(int i=de+1;i<q.top().wei;i++){
				b[i]=1;
				qian.push(q.top().tired);
				q.pop();
			}
			de=q.top().wei;
			wei=q.top().distance;
			q.pop();
		}
		printf("%lld\n",maxn);
	}
}
2023/10/9 12:57
加载中...