题目

题意
让你构造一个序列,满足m个位置的前缀异或等于m个值
题解
先把p位置的值定成x,把每一个定好的位置标记一下,从前往后跑,没有标记过的点就给他定一个比1e9要大的数,之所以要比1e9要大,是因为要保证定好的位置和它的前一个位置异或不为0,而定好的位置的值x<=1e9,输出时,就输出每一个数和前一个数的异或结果
CODE
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| #include <stdio.h> #include <algorithm>
using namespace std;
int n , m; int ned[1200000] , is[1200000]; void work () { int i , p , x , pre; scanf ( "%d%d" , &n , &m ); for ( i = 1 ; i <= m ; i++ ) { scanf ( "%d%d" , &p , &x ); if ( is[p] && ned[p] != x ) { printf ( "-1\n" ); return ; } ned[p] = x; is[p] = 1; } for ( i = 1 ; i <= n ; i++ ) { if ( is[i] == 0 ) { ned[i] = 1000000000 + i; } if ( ned[i] == ned[i-1] ) { printf ( "-1\n" ); return ; } } for ( i = 1 ; i <= n ; i++ ) { printf ( "%d%c" , ned[i-1] ^ ned[i] , i==n?'\n':' ' ); } } int main () { work (); return 0; }
|