Submission #633875

#TimeUsernameProblemLanguageResultExecution timeMemory
633875lovrotNice sequence (IZhO18_sequence)C++11
34 / 100
2081 ms5460 KiB
#include <bits/stdc++.h> 

#define pb push_back 
#define X first
#define Y second
#define pii pair<int, int>

using namespace std;

const int N = 2 * 1e5 + 10;

int n, m, p[N], lastx = N - 1, g[N][2];
int stk[N], pos;
int cyc[N], bio[N], ts[N], cookie;

int stackTop(){ 
	return stk[pos];
}

void stackPop(){ 
	pos--;
}

void stackPush(int x){ 
	pos++;
	stk[pos] = x;
	p[x] = pos;
}

bool cycp(int u){
	bio[u] = cookie;
	cyc[u] = cookie;
	// cout << u << "\n";
	if(g[u][0] != -1){
		if(cyc[g[u][0]] == cookie){ 
			return true;
		}
		if(cycp(g[u][0])){ 
			return true;	
		}
	}
	if(g[u][1] != -1){
		if(cyc[g[u][1]] == cookie){ 
			return true;
		}
		if(cycp(g[u][1])){ 
			return true;	
		}
	}
	cyc[u] = -cookie;
	return false;
}

void topSort(int u){ 
	ts[u] = cookie;
	if(g[u][0] != -1 && ts[g[u][0]] != cookie){ 
		topSort(g[u][0]);
	}
	if(g[u][1] != -1 && !ts[g[u][1]] != cookie){ 
		topSort(g[u][1]);
	}
	stackPush(u);
}

void output(int ans){ 
	for(int i = 0; i <= ans; i++)
		if(ts[i] != cookie) topSort(i);

	printf("%d\n", ans);
	for(int i = 1; i <= ans; i++) 
		printf("%d ", (p[i] - p[0]) - (p[i - 1] - p[0]));
	printf("\n");
}

bool probaj(int x){ 
	pos = -1;
	cookie++;

	for(int i = 0; i <= x; i++){ 
		g[i][0] = g[i][1] = -1; 
		if(i - m >= 0){
			g[i][0] = i - m;
		}
		if(i - n >= 0){
			g[i - n][1] = i;
		}
	}
	
	// for(int i = 0; i <= x; i++) cout << i << ": " << g[i][0] << " " << g[i][1] << "\n";

	for(int i = 0; i <= x; i++){ 
		if(bio[i] != cookie){
			if(cycp(i))
				return false;
		}
	}
	return true;
}

void task(){ 
	cin >> n >> m;

	int lo = 0, hi = 2 * (n + m) + 1;
	while(hi - lo > 1){ 
		int mi = (lo + hi) / 2;
		if(probaj(mi))
			lo = mi;
		else 
			hi = mi;
	}
	probaj(lo);
	output(lo);
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	int t;	
	cin >> t;

	while(t--){ 
		task();
	}
	return 0;
}

Compilation message (stderr)

sequence.cpp: In function 'void topSort(int)':
sequence.cpp:59:35: warning: logical not is only applied to the left hand side of comparison [-Wlogical-not-parentheses]
   59 |  if(g[u][1] != -1 && !ts[g[u][1]] != cookie){
      |                                   ^~
sequence.cpp:59:22: note: add parentheses around left hand side expression to silence this warning
   59 |  if(g[u][1] != -1 && !ts[g[u][1]] != cookie){
      |                      ^~~~~~~~~~~~
      |                      (           )
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...