下面的代码实现从.v小到大的队列。是Codeforces Round #655 (Div. 2)D. Omkar and Circle的错误代码。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int NN=2e5+10;
struct ppp{
long long v;
int l,r;
int id;
}a[NN];
struct cmp{
bool operator ()(const int &x, const int &y)
{
if(a[x].v>a[y].v)return 1;
else if(a[x].v==a[y].v&&a[x].id>a[y].id)return 1;
return 0;
}
};
priority_queue<int ,vector<int>,cmp> q;
int f[NN];
int main(){
int n;scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i].v);
a[i].l=i-1;
a[i].r=i+1;
if(a[i].l==0)a[i].l=n;
if(a[i].r==n+1)a[i].r=1;
a[i].id=i;
q.push(i);
}
for(int i=1;i<=(n>>1);i++){
int neww;
while(1){
neww=q.top();
q.pop();
if(f[neww]==0)break;
}
a[neww].v=a[a[neww].l].v+a[a[neww].r].v;
f[a[neww].l]=1;
f[a[neww].r]=1;
a[neww].l=a[a[neww].l].l;
a[neww].r=a[a[neww].r].r;
a[a[neww].l].r=neww;
a[a[neww].r].l=neww;
q.push(neww);
}
while(1){
int neww=q.top();
q.pop();
if(f[neww]==0){
printf("%lld\n",a[neww].v);
break;
}
}
return 0;
}