求调
查看原帖
求调
537046
大眼仔Happy楼主2023/12/28 22:13

rt,这题的多倍经验都过了啊,怎么这个过不了

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
#define ll long long
ll inline read()
{
	ll num=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){num=(num<<3)+(num<<1)+(ch^48);ch=getchar();}
	return num*f;
}
int n,m,pre[N],nxt[N];
ll a[N],sum;bool vis[N];
struct node{int id;ll w;bool operator <(const node &rhs)const{return w<rhs.w;}};
void lnk(int x,int y){pre[y]=x;nxt[x]=y;}
priority_queue<node>q;
int main(){
	n=read();m=(n+1)/2;
	for(int i=1;i<=n;i++)q.push({i,a[i]=read()});
	for(int i=1;i<=n;i++)lnk(i-1,i),lnk(i,i+1);
	while(m--)
	{
		while(vis[q.top().id])q.pop();
		node d=q.top();q.pop();
		int l=pre[d.id],r=nxt[d.id];
		lnk(pre[l],d.id);lnk(d.id,nxt[r]);vis[l]=vis[r]=1;
		sum+=d.w;q.push({d.id,a[d.id]=a[l]+a[r]-d.w});
		printf("%lld\n",sum);
	}
	return 0;
}
2023/12/28 22:13
加载中...