建模完毕滚回来补题了。
还是在水
题意是给m个(输出数列的 下标 与 值 )
然后看能不能构造出这样一个长度为n的数列
能就输出数列,不能输出-1
有性质a^a=0
0不在a[i]的范围里
我们首先把m次给定的下标与值标记到数组中,其它未出现的下标标记为-1
这样省去了给m次的下标从小到大的排序操作
要注意如果同一下标出现了两个不同的值,那么直接输出-1
然后通过一个res一直传递,代表当前的值能被异或构造出来
如果构造出来的值是0,就结束
否则构造完成 输出数组
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
int n,m;
int idx,val;
int temp;
int a[maxn];
int ans[maxn];
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n+1;i++) a[i]=-1;
for(int i=0;i<m;i++){
scanf("%d%d",&idx,&val);
if(a[idx]!=-1&&a[idx]!=val){
printf("-1");
return 0;
}
a[idx]=val;
}
int res=0;
for(int i=1;i<=n;i++){
if(a[i]==-1) a[i]=max(a[i-1],a[i+1])+10;
res=a[i-1]^a[i];
if(res==0){
printf("-1");
return 0;
}
ans[i]=res;
}
for(int i=1;i<=n;i++){
printf("%d ",ans[i]);
}
return 0;
}