70pts 求调
查看原帖
70pts 求调
760418
not_exist楼主2024/7/24 20:54

WA on #10,11,13

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=100005;
int n,ans[maxn];
bool vis[maxn];

inline int read(){
	int ret=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();
    return ret*f;
}

struct Node{
	int s,cst,id;
	bool operator<(const Node b)const{return cst>b.cst;}
}e[maxn];
priority_queue<Node> q;

bool check_is_not_only_maxlen(int id){
	bool flg=false;
	for(int i=id+1;i<=n;i++){
		if(e[i].cst!=e[id].cst){
			break;
		}
		if(vis[i]) return true;
	}
	for(int i=id-1;i>=1;i--){
		if(e[i].cst!=e[id].cst){
			break;
		}
		if(vis[i]) return true;
	}
	return flg;
}

int get_nowdis(int id){
	int ansid;
	for(int i=id-1;i>=1;i--){
		if(vis[i]){ansid=i;break;}
	}
	return e[ansid].s;
}

signed main(){
	n=read();
	for(int i=1;i<=n;i++){
		e[i].s=read();
		e[i].id=i;
	}
	ans[n]=2*e[n].s;
	for(int i=1;i<=n;i++){
		ans[n]+=(e[i].cst=read());
		q.push(e[i]);
		vis[i]=1;
	}
	int dis=e[n].s;
	for(int i=n-1;i>=1;i--){
			Node top=q.top();
			q.pop();
			if(top.s==dis&&(!check_is_not_only_maxlen(top.id))){
				Node top2=q.top();
				int _2=get_nowdis(top.id);
				if(top.cst+2*(dis-_2)<top2.cst){
					ans[i]=ans[i+1]-top.cst-2*(dis-_2);
					vis[top.id]=0;
					dis=_2;
				}else{
					ans[i]=ans[i+1]-top2.cst;
					vis[top2.id]=0;
					q.pop();
					q.push(top);
				}
			}else{
				ans[i]=ans[i+1]-top.cst;
				vis[top.id]=0;
			}
	}
	for(int i=1;i<=n;i++){
		cout<<ans[i]<<"\n";
	}
    return 0;
}

2024/7/24 20:54
加载中...