QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#150734 | #6396. Puzzle: Kusabi | aesthetic# | WA | 17ms | 16924kb | C++14 | 4.9kb | 2023-08-26 04:35:31 | 2023-08-26 04:35:34 |
Judging History
answer
#include "bits/stdc++.h"
#define endl '\n'
#define f first
#define s second
#define pb push_back
#define mp make_pair
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
#define rep(i, a, b) for (int i = (a); i < (b); ++i)
std::mt19937 rng((int) std::chrono::steady_clock::now().time_since_epoch().count());
using namespace std;
// #define int long long
#define dbg_loc() cerr << __PRETTY_FUNCTION__ << " : " << __LINE__ << "\n"
template<typename A, typename B> ostream& operator<<(ostream &os, const pair<A, B> &p){
return os << '(' << p.first << ", " << p.second << ')';
}
template<typename T_container,typename T=typename enable_if<!is_same<T_container,string>::value, typename T_container::value_type>::type>
ostream& operator<<(ostream &os, const T_container &v){
os << '{'; string sep; for (const T &x : v) os << sep << x, sep = ", "; return os << '}';
}
void dbg_out() { cerr << endl; }
template<typename Head, typename... Tail> void dbg_out(Head H, Tail... T){
cerr << ' ' << H;
dbg_out(T...);
}
#define LOCAL
#define LOCAL
#ifdef LOCAL
#define dbg(...) cerr<<"(" << #__VA_ARGS__<<"):" , dbg_out(__VA_ARGS__) , cerr << endl
#else
#define dbg(...)
#endif
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
ll mod = (1000000007LL);
inline ll Mod(ll a, ll b){return (a%b);}
inline ll poww(ll a, ll b){ll res = 1;while (b > 0){if(b & 1) res = (res * a)%mod;a = (a * a)%mod;b >>= 1;}return res;}
ll gcd (ll a, ll b) { while (b) { a %= b,swap(a, b);}return a;}
void read(vector<int> &w, int n){w.resize(n);for(int i = 0; i < n; i++) cin>>w[i];}
void print(vector<int> &w){for(int i =0; i < sz(w); i++){if(i == sz(w) - 1) cout<<w[i]<<"\n";else cout<<w[i]<<" ";}}
///CUIDADO COM MAXN
#define N 100010 // 1E6
int n, k, v[N];
string s;
char val[N];
vi grafo[N];
int h[N];
vector<pii> C[N], D[N], T[N], pares;
void coloca(int x, int v){
for(auto w: T[v]) T[x].pb(w);
for(auto w: C[v]) C[x].pb(w);
for(auto w: D[v]) D[x].pb(w);
}
int melhor_c(int x){
int ini = 0, fim = sz(C[x]) - 1, mid, best=-1;
while(fim >= ini){
int mid = (ini + fim)/2;
vi novo_c;
for(int i = 0; i < sz(C[x]); i++){
if(i != mid) novo_c.pb(C[x][i].f);
}
assert(sz(novo_c) == sz(D[x]));
int can = 1;
for(int i = 0; i < sz(novo_c); i++){
if(novo_c[i] <= D[x][i].f) can = 0;
}
if(can) best=mid, ini=mid+1;
else fim=mid-1;
}
return best;
}
int melhor_d(int x){
int ini = 0, fim = sz(D[x]) - 1, mid, best=-1;
while(fim >= ini){
int mid = (ini + fim)/2;
vi novo_d;
for(int i = 0; i < sz(D[x]); i++){
if(i != mid) novo_d.pb(D[x][i].f);
}
assert(sz(novo_d) == sz(C[x]));
int can = 1;
for(int i = 0; i < sz(novo_d); i++){
if(novo_d[i] >= D[x][i].f) can = 0;
}
if(can) best=mid, fim=mid-1;
else ini=mid+1;
}
return best;
}
void dfs(int x, int p){
// dbg(x);
if(val[x] == 'T') T[x].pb({h[x], x});
if(val[x] == 'C') C[x].pb({h[x], x});
if(val[x] == 'D') D[x].pb({h[x], x});
for(auto v: grafo[x]){
if(v==p) continue;
h[v]=h[x] + 1;
dfs(v, x);
coloca(x, v);
if(sz(T[v]) + sz(C[v]) + sz(D[v]) > 1){
dbg(v, T[v], C[v], D[v]);
cout<<"NO\n";
exit(0);
}
}
// dbg(x, T[x], C[x], D[x]);
map<int, vi> mapa;
for(auto w: T[x]) mapa[w.f].pb(w.s);
vector<pii> novo_T;
for(auto w: mapa){
for(int i = 0; i + 1 < sz(w.s); i += 2){
pares.pb({w.s[i], w.s[i+1]});
}
if(sz(w.s) % 2 == 1){
novo_T.pb({h[w.s.back()], w.s.back()});
}
}
T[x] = novo_T;
sort(all(C[x])); sort(all(D[x]));
if(sz(C[x]) == sz(D[x])){
int can = 1;
for(int i = 0; i < sz(C[x]); i++){
if(C[x][i].f <= D[x][i].f) can = 0;
}
if(!can){
cout<<"NO\n";
exit(0);
}
for(int i = 0; i < sz(C[x]); i++){
pares.pb({C[x][i].s, D[x][i].s});
}
C[x].clear(), D[x].clear();
}
else if(sz(C[x]) == sz(D[x]) + 1){
int c = melhor_c(x);
if(c != -1){
int i = 0;
for(int j = 0;j < sz(D[x]); j++){
if(j == c) i++;
pares.pb({D[x][j].s, C[x][i].s});
i++;
}
c = C[x][c].s;
C[x] = {{h[c], c}};
D[x].clear();
}
else{
cout<<"NO\n";
exit(0);
}
}
else if(sz(D[x]) == sz(C[x]) + 1){
int d = melhor_d(x);
if(d != -1){
int i = 0;
for(int j = 0;j < sz(C[x]); j++){
if(j == d) i++;
pares.pb({C[x][j].s, D[x][i].s});
i++;
}
d = D[x][d].s;
D[x] = {{h[d], d}};
C[x].clear();
}
else{
cout<<"NO\n";
exit(0);
}
}
else{
cout<<"NO\n";
exit(0);
}
// dbg("fim", T[x]);
}
int32_t main(){
ios::sync_with_stdio(false); cin.tie(0);
cin>>n;
int qtd[3] = {0};
for(int i = 1, a, b; i < n; i++){
string s;
cin>>a>>b>>s;
val[a] = s[0];
grafo[a].pb(b);
grafo[b].pb(a);
}
dfs(1,1);
if(T[1].empty() and D[1].empty() and C[1].empty()){
cout<<"YES\n";
// dbg(sz(pares));
for(auto p: pares){
cout<<p.f<<" "<<p.s<<"\n";
}
}
else cout<<"NO\n";
}
詳細信息
Test #1:
score: 100
Accepted
time: 2ms
memory: 13408kb
input:
8 2 1 - 3 1 - 4 2 Tong 5 2 Tong 6 3 Duan 7 3 - 8 7 Chang
output:
YES 4 5 8 6
result:
ok Correct.
Test #2:
score: 0
Accepted
time: 1ms
memory: 13528kb
input:
10 2 1 Duan 3 2 Duan 4 2 - 5 4 Chang 6 2 Chang 7 1 Duan 8 6 Tong 9 6 Tong 10 3 Chang
output:
YES 10 3 8 9 2 6 5 7
result:
ok Correct.
Test #3:
score: 0
Accepted
time: 3ms
memory: 13592kb
input:
2 2 1 Tong
output:
NO
result:
ok Correct.
Test #4:
score: -100
Wrong Answer
time: 17ms
memory: 16924kb
input:
100000 2 1 Duan 3 1 Duan 4 3 - 5 4 Duan 6 3 - 7 4 Duan 8 4 - 9 8 - 10 7 Duan 11 9 - 12 7 Duan 13 7 Duan 14 8 Duan 15 13 - 16 10 Duan 17 11 Duan 18 12 - 19 1 Duan 20 5 Duan 21 4 Duan 22 14 Duan 23 16 - 24 22 Duan 25 16 Duan 26 13 - 27 13 - 28 17 - 29 5 Duan 30 22 - 31 23 - 32 9 Duan 33 5 - 34 30 Duan...
output:
NO
result:
wrong answer Jury has answer but participant has not.