下面的代码实现从.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;
}

本文分析了Codeforces Round #655 (Div.2) D. Omkar and Circle题目中的一段错误代码,该代码试图实现从小到大的队列,但存在一些问题。文章深入探讨了代码的结构,包括使用的数据结构如priority_queue,以及算法流程,为读者提供了理解并修正错误代码的思路。
4万+

被折叠的 条评论
为什么被折叠?



