QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#834977 | #8012. Jumping Lights | Radewoosh# | WA | 35ms | 192656kb | C++23 | 5.0kb | 2024-12-28 08:37:01 | 2024-12-28 08:37:03 |
Judging History
answer
//~ while (clock()<=69*CLOCKS_PER_SEC)
//~ #pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("O3")
//~ #pragma GCC target ("avx2")
//~ #pragma GCC optimize("Ofast")
//~ #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//~ #pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
template <typename T>
using ordered_set =
tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
#define sim template < class c
#define ris return * this
#define dor > debug & operator <<
#define eni(x) sim > typename \
enable_if<sizeof dud<c>(0) x 1, debug&>::type operator<<(c i) {
sim > struct rge { c b, e; };
sim > rge<c> range(c i, c j) { return rge<c>{i, j}; }
sim > auto dud(c* x) -> decltype(cerr << *x, 0);
sim > char dud(...);
struct debug {
#ifdef LOCAL
~debug() { cerr << endl; }
eni(!=) cerr << boolalpha << i; ris; }
eni(==) ris << range(begin(i), end(i)); }
sim, class b dor(pair < b, c > d) {
ris << "(" << d.first << ", " << d.second << ")";
}
sim dor(rge<c> d) {
*this << "[";
for (auto it = d.b; it != d.e; ++it)
*this << ", " + 2 * (it == d.b) << *it;
ris << "]";
}
#else
sim dor(const c&) { ris; }
#endif
};
#define imie(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
#define shandom_ruffle random_shuffle
using ll=long long;
using pii=pair<int,int>;
using pll=pair<ll,ll>;
using vi=vector<int>;
using vll=vector<ll>;
const int nax=1000*1007;
int n, q;
int ojc[nax];
vi graf[nax];
int parz[nax];
int ile[2][2];
int stan;
int czyl[nax];
set<pii> zazdz[2][nax];
set<pii> niedz[2][nax];
int zazn[2][nax];
vi swieze[2];
void dfs1(int v)
{
for (int &i : graf[v])
{
if (i==ojc[v])
{
swap(i, graf[v].back());
graf[v].pop_back();
break;
}
}
for (int i : graf[v])
{
ojc[i]=v;
parz[i]=parz[v]^1;
dfs1(i);
}
}
int wynik()
{
return ile[0][stan]+ile[1][stan^1];
}
void flip(int kt, int v)
{
//~ debug() << "flipuje " << imie(kt) << imie(v);
if (zazn[kt][v])
{
ile[kt][parz[v]]--;
zazn[kt][v]=0;
if (v>1)
{
//~ iledz[kt][ojc[v]]--;
zazdz[kt][ojc[v]].erase({!czyl[v], v});
niedz[kt][ojc[v]].insert({!czyl[v], v});
}
}
else
{
ile[kt][parz[v]]++;
zazn[kt][v]=1;
if (v>1)
{
//~ iledz[kt][ojc[v]]++;
zazdz[kt][ojc[v]].insert({!czyl[v], v});
niedz[kt][ojc[v]].erase({!czyl[v], v});
}
}
}
int isfake(int kt, int v)
{
return zazn[kt][v] && parz[v]!=(stan^kt) && !zazn[kt][ojc[v]] && zazdz[kt][v].empty();
}
void rozszerz(int kt)//najpierw usun spojne rozmiaru jeden zlej parzystosci
{
vi dod;
vi pom=swieze[kt];
swieze[kt].clear();
for (int i : pom)
{
if (parz[i]!=(stan^kt))
{
if (isfake(kt, i))
flip(kt, i);
}
else
{
if (!zazn[kt][i])
{
if (i>1 && isfake(kt, ojc[i]))
flip(kt, ojc[i]);
while(1)
{
if (zazdz[kt][i].empty())
break;
int d=(*zazdz[kt][i].begin()).second;
if (!czyl[d])
break;
flip(kt, d);
}
}
}
}
//~ debug() << imie(kt) << imie(pom);
for (int i : pom)
{
//~ debug() << imie(i) << imie(zazn[kt][i]) << imie(parz[i]==(stan^kt));
if (!zazn[kt][i] && parz[i]!=(kt^stan))//zaraza sie
{
int jest=0;
if (i>1 && zazn[kt][ojc[i]])
{
if (isfake(kt, ojc[i]))
flip(kt, ojc[i]);
else
jest=1;
}
while(!jest && !zazdz[kt][i].empty())
{
int d=(*zazdz[kt][i].begin()).second;
if (isfake(kt, d))
flip(kt, d);
else
jest=1;
}
if (!jest)
continue;
dod.push_back(i);
continue;
}
if (zazn[kt][i] && parz[i]==(kt^stan))//zaraza somsiadow
{
if (i>1 && !zazn[kt][ojc[i]])
dod.push_back(ojc[i]);
for (pii j : niedz[kt][i])
dod.push_back(j.second);
continue;
}
if (zazn[kt][i])
swieze[kt].push_back(i);
}
sort(dod.begin(), dod.end());
dod.resize(unique(dod.begin(), dod.end())-dod.begin());
for (int i : dod)
{
if (!zazn[kt][i])
flip(kt, i);
swieze[kt].push_back(i);
}
}
int main()
{
scanf("%d%d", &n, &q);
for (int i=1; i<n; i++)
{
int a, b;
scanf("%d%d", &a, &b);
graf[a].push_back(b);
graf[b].push_back(a);
}
for (int i=1; i<=n; i++)
czyl[i]=(((int)graf[i].size())==1);
dfs1(1);
for (int h=0; h<2; h++)
for (int i=2; i<=n; i++)
niedz[h][ojc[i]].insert({!czyl[i], i});
while(q--)
{
int typ;
scanf("%d", &typ);
if (typ<=1)
{
int v;
scanf("%d", &v);
for (int i=0; i<2; i++)
{
if (zazn[i][v]!=typ)
flip(i, v);
swieze[i].push_back(v);
}
}
if (typ==2)
{
rozszerz(0);
rozszerz(1);
stan^=1;
}
printf("%d ", wynik());
//~ debug();
//~ debug() << range(zazn[0]+1, zazn[0]+1+n);
//~ debug() << range(zazn[1]+1, zazn[1]+1+n);
//~ debug();
}
printf("\n");
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 35ms
memory: 192656kb
input:
8 8 1 2 2 3 2 4 1 5 5 6 5 7 5 8 1 1 2 2 0 1 0 3 0 4 0 5 2
output:
1 2 6 5 4 3 3 1
result:
ok 8 numbers
Test #2:
score: -100
Wrong Answer
time: 31ms
memory: 192644kb
input:
4 5 1 2 1 3 2 4 1 2 2 0 4 2 2
output:
1 2 1 2 1
result:
wrong answer 5th numbers differ - expected: '2', found: '1'