P11604 [PA 2016] 卡牌 / Gra w karty 题解
Coffee_zzz · · 题解
这题真的好难好难啊!
首先考虑 A 什么时候赢。
如果存在一个不大于
否则,对于任意不大于
这时,我们考虑一个极端情况:现存在一个长度为
我们考虑一个可重集合
由于在 B 操作时,不在
既然极端情况 B 都可以做到不输,而其他情况显然严格弱于极端情况,所以只要不满足「存在一个不大于
接下来考虑 B 什么时候赢。
如果存在一个不大于
否则,对于任意不大于
在 A 把 B 的
由于在 B 操作时,不在
于是,我们可以得到,只要不满足「对于任意不大于
最后,如果 A 和 B 都无法获胜,那么他们只能做到不输,即平局。
代码还挺好写的。
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define i128 __int128
#define endl '\n'
#define pb push_back
#define pii pair<int,int>
#define fi first
#define se second
#define vei vector<int>
#define pq priority_queue
#define yes puts("yes")
#define no puts("no")
#define Yes puts("Yes")
#define No puts("No")
#define YES puts("YES")
#define NO puts("NO")
#define In(x) freopen(x".in","r",stdin)
#define Out(x) freopen(x".out","w",stdout)
#define File(x) (In(x),Out(x))
using namespace std;
const int N=1e5+5;
int a[N],b[N];
void solve(){
int n,m;
cin>>n>>m;
memset(a,0,sizeof a);
memset(b,0,sizeof b);
for(int i=1;i<=m;i++){
int x,y;
char w;
cin>>x>>w>>y;
if(w=='>') a[y]++;
if(w=='<') b[y]++;
}
int cnt=0;
bool win=0;
for(int i=1;i<=n;i++){
if(a[i]==n) win=1;
if(b[i]) cnt++;
}
if(win) puts("WYGRANA");
else if(cnt==n) puts("PRZEGRANA");
else puts("REMIS");
}
signed main(){
ios::sync_with_stdio(0);
signed T=1;
cin>>T;
while(T--) solve();
return 0;
}