洛谷题目帮忙看看

链接

AC+WA+RE 20分。

#include<bits/stdc++.h>
using namespace std;
struct node{
	int x;
	int id;
}a[1000001];
bool operator <(node l,node r){
	return l.x<r.x;
}
priority_queue<node> q;
int n,p,y,s;
int ar[1000001];
bool f;
int main(){
	cin>>n>>p>>y;
	for(int i=1;i<=n;i++){
		cin>>a[i].x;
		if(i==p) a[i].x--;
		if(i==y) a[i].x--;
		s+=a[i].x;
		a[i].id=i;
		q.push(node{a[i].x,i});
	}

	int u=p;
	ar[s+2]=y;
	for(int i=2;i<=s+1;i++){
		node t=q.top();
		if(t.id!=u&&t.x>0){
			q.pop();
			ar[i]=t.id;
			q.push(node{t.x-1,t.id});
			u=ar[i];
		}else if(q.size()&&t.x>0){
			q.pop();
			node v=q.top();
			q.pop();
			ar[i]=v.id;
			q.push(node{v.x-1,v.id});
			q.push(node{t.x,t.id});
			u=ar[i];
		}else if(!q.size()){
			f=1;
		}
	}
	if(f){
		cout<<"0";
		return 0;
	}
	for(int i=1;i<=s+1;i++){
		if(ar[i]==ar[i+1]){
			f=1;
		}
	}
	if(f){
		cout<<"0";
		return 0;
	}
	cout<<p<<" ";
	for(int i=2;i<=s+2;i++){
		cout<<ar[i]<<" ";
	}
	return 0;
}
2 个赞

改了一下 70分。

#include<bits/stdc++.h>
using namespace std;
struct node{
	int x;
	int id;
}a[1000001];
bool operator <(node l,node r){
	return l.x<r.x;
}
priority_queue<node> q;
int n,p,y,s;
int ar[1000001];
bool f;
int main(){
	cin>>n>>p>>y;
	for(int i=1;i<=n;i++){
		cin>>a[i].x;
		if(i==p) a[i].x--;
		if(i==y) a[i].x--;
		s+=a[i].x;
		a[i].id=i;
		q.push(node{a[i].x,i});
	}

	int u=p;
	ar[s+2]=y;
	for(int i=2;i<=s+1;i++){
		node t=q.top();
		if(t.id!=u&&t.x>0){
			q.pop();
			ar[i]=t.id;
			q.push(node{t.x-1,t.id});
			u=ar[i];
		}else if(q.size()&&t.x>0){
			q.pop();
			node v=q.top();
			q.pop();
			ar[i]=v.id;
			q.push(node{v.x-1,v.id});
			q.push(node{t.x,t.id});
			u=ar[i];
		}else if(!q.size()){
			f=1;
		}
	}
	if(f){
		cout<<"0";
		return 0;
	}
	for(int i=1;i<=s+1;i++){
		if(ar[i]==ar[i+1]){
			f=1;
		}
	}
	if(f){
		cout<<"0";
		return 0;
	}
	cout<<p<<" ";
	for(int i=2;i<=s+1;i++){
		cout<<ar[i]<<" ";
	}
	cout<<ar[s+2];
	return 0;
}
2 个赞

有恒心 :index_pointing_at_the_viewer:

2 个赞

???sha

2 个赞

交了整整一页 :scream:

2 个赞

所以帮我看下哪错了

2 个赞

你重载应该要有双关键字吧?

bool operator <(node l,node r){
	if(l.x!=r.x)return l.x<r.x;
	else return l.id!=y;
}
2 个赞

我这没有 $x,y$。

2 个赞

666

2 个赞

改成l就可以了

2 个赞

90分了

2 个赞

AC了。

#include<bits/stdc++.h>
using namespace std;//找不到错找人帮我看
int n,p,y,s;
int ar[1000005];
bool f;
struct node{
	int x;
	int id;
}a[1000005];
bool operator <(node l,node r){
    if (l.x != r.x) return l.x<r.x;
	if (l.id == y) return 0;
    if (r.id == y) return 1;
    return 0; 
}
priority_queue<node> q;

int main(){
	cin>>n>>p>>y;
	for(int i=1;i<=n;i++){
		cin>>a[i].x;
		if(i==p) a[i].x--;
		if(i==y) a[i].x--;
		s+=a[i].x;
		a[i].id=i;
		q.push(node{a[i].x,i});
	}

	int u=p;
	ar[s+2]=y;
	for(int i=2;i<=s+1;i++){
		node t=q.top();q.pop();
		if(t.x>0) t=t;
        else{
            f=1;
            break;
        }
		if(t.id!=u&&t.x>0){
			ar[i]=t.id;
			q.push(node{t.x-1,t.id});
			u=ar[i];
		}else if(q.size()&&t.x>0){
			node v=q.top();
			q.pop();
			ar[i]=v.id;
			q.push(node{v.x-1,v.id});
			q.push(node{t.x,t.id});
			u=ar[i];
		}else if(!q.size()){
			f=1;
			break;
		}
	}
	if(f){
		cout<<"0";
		return 0;
	}
	for(int i=1;i<=s+1;i++){
		if(ar[i]==ar[i+1]){
			f=1;
		}
	}
	if(f){
		cout<<"0";
		return 0;
	}
	cout<<p<<" ";
	for(int i=2;i<=s+1;i++){
		cout<<ar[i]<<" ";
	}
	cout<<ar[s+2];
	return 0;
}
2 个赞