有
让你构造两种解,每种解用一个字符串表示,表示每个平衡器的状态。第一组解要求所有的
数据范围
一道有趣的构造题。
首先我们考虑构造第一组解。我们考虑从后往前做,枚举
考虑上面的做法将第一维滚掉之后是 bitset 进行优化。常数
然后考虑构造,这就简单了,直接沿着一个有解的 dp 即可。
然后考虑第二问,首先我们发现之后当
仍然考虑倒着做,
我们考虑加入一个令牌,那只会有两种状态:
#define _CRT_SECURE_NO_WARNINGS
#include <map>
#include <set>
#include <stack>
#include <ctime>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cctype>
#include <vector>
#include <bitset>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <fstream>
#include <iostream>
#include <algorithm>
using namespace std;
inline char gc() {
static const int L = 233333;
static char sxd[L], *sss = sxd, *ttt = sxd;
if (sss == ttt) {
ttt = (sss = sxd) + fread(sxd, 1, L, stdin);
if (sss == ttt) {
return EOF;
}
}
return *sss++;
}
#ifndef _AT_HOME
#define dd c = gc()
#else
#define dd c = getchar()
#endif
inline char readalpha() {
char dd;
for (; !isalpha(c); dd);
return c;
}
inline char readchar() {
char dd;
for (; c == ' '; dd);
return c;
}
template <class T>
inline bool read(T& x) {
bool flg = false;
char dd;
x = 0;
for (; !isdigit(c); dd) {
if (c == '-') {
flg = true;
} else if(c == EOF) {
return false;
}
}
for (; isdigit(c); dd) {
x = (x * 10) + (c ^ 48);
}
if (flg) {
x = -x;
}
return true;
}
#undef dd
template <class T>
inline void write(T x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x < 10) {
putchar(x | 48);
return;
}
write(x / 10);
putchar((x % 10) | 48);
}
template <class T>
inline void writesp(T x) {
write(x);
putchar(' ');
}
template <class T>
inline void writeln(T x) {
write(x);
puts("");
}
#define lowbit(x) (x & -x)
namespace dfcmd {
const int maxn = 50005;
const int maxm = 100005;
int n, m, T;
struct Balancer {
int x, y;
} bal[maxm];
char ans[maxm];
int ff[maxn];
namespace solve1 {
bitset<maxn> f[maxn];
inline void solve() {
for (int i = 1; i <= n; ++i) {
f[i][i] = 1;
}
for (int i = m; i; --i) {
f[bal[i].x] = f[bal[i].y] = f[bal[i].x] | f[bal[i].y];
}
for (int i = 2; i <= n; ++i) {
f[1] &= f[i];
}
int now = 0;
for (int i = 1; i <= n; ++i) {
if (f[1][i]) {
now = i;
break;
}
}
if (!now) {
puts("-1");
return;
}
ff[now] = 1;
for (int i = m; i; --i) {
if (ff[bal[i].x]) {
ans[i] = '^';
} else {
ans[i] = 'v';
}
ff[bal[i].x] = ff[bal[i].y] = ff[bal[i].x] | ff[bal[i].y];
}
puts(ans + 1);
}
}
namespace solve2 {
int g[maxn];
inline void solve() {
if (n == 2) {
puts("-1");
return;
}
for (int i = 1; i <= n; ++i) {
ff[i] = i;
g[i] = 1;
}
for (int i = m; i; --i) {
if (g[ff[bal[i].x]] < g[ff[bal[i].y]]) {
g[ff[bal[i].x]]++, g[ff[bal[i].y]]--;
ff[bal[i].y] = ff[bal[i].x];
ans[i] = '^';
} else {
g[ff[bal[i].x]]--, g[ff[bal[i].y]]++;
ff[bal[i].x] = ff[bal[i].y];
ans[i] = 'v';
}
}
puts(ans + 1);
}
}
int Main() {
read(n), read(m), read(T);
for (int i = 1; i <= m; ++i) {
read(bal[i].x), read(bal[i].y);
}
if (T == 1) {
solve1::solve();
} else {
solve2::solve();
}
return 0;
}
}
int main() {
return dfcmd::Main();
}