QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#834996#8012. Jumping LightsRadewoosh#WA 32ms192956kbC++235.2kb2024-12-28 08:46:272024-12-28 08:46:27

Judging History

This is the latest submission verdict.

  • [2024-12-28 08:46:27]
  • Judged
  • Verdict: WA
  • Time: 32ms
  • Memory: 192956kb
  • [2024-12-28 08:46:27]
  • Submitted

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]]+(int)zazdz[kt][v].size())<=1;
}

void rozszerz(int kt)//najpierw usun spojne rozmiaru jeden zlej parzystosci
{
	vi dod;
	vi pom=swieze[kt];
	swieze[kt].clear();
	
	sort(pom.begin(), pom.end());
	pom.resize(unique(pom.begin(), pom.end())-pom.begin());
	
	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() << imie(swieze[0]) << imie(swieze[1]);
		//~ debug();
	}
	printf("\n");
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 20ms
memory: 192660kb

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: 0
Accepted
time: 32ms
memory: 192956kb

input:

4 5
1 2
1 3
2 4
1 2
2
0 4
2
2

output:

1 2 1 2 2 

result:

ok 5 number(s): "1 2 1 2 2"

Test #3:

score: -100
Wrong Answer
time: 31ms
memory: 192920kb

input:

1000 1000
471 906
653 752
346 148
764 837
22 863
416 906
836 863
784 752
694 346
918 635
963 863
152 863
221 342
473 752
250 635
323 643
102 643
944 833
262 752
185 150
82 342
142 342
383 635
1000 342
30 752
713 837
513 635
12 150
181 346
138 752
661 150
435 342
246 150
387 643
561 635
41 833
797 34...

output:

1 1 2 115 114 118 117 103 102 306 305 395 395 604 603 497 496 809 809 692 691 907 906 694 694 906 905 598 598 905 904 492 492 904 904 492 491 904 903 394 394 903 902 394 393 804 804 393 392 709 709 392 391 709 708 390 389 611 610 389 388 498 497 387 386 401 401 386 385 401 400 297 297 400 399 296 29...

result:

wrong answer 12th numbers differ - expected: '396', found: '395'