Submission #132595

# Submission time Handle Problem Language Result Execution time Memory
132595 2019-07-19T08:02:49 Z anayk Dojave (COCI17_dojave) C++14
140 / 140
289 ms 29944 KB
    #include <iostream>
     
    #define MAXN 2000000
     
    int m, n;
    int first[MAXN];
    int other[MAXN];
    int seq[MAXN];
    long long dp[2][MAXN];
    int min, max;
    int a, b;
     
    void add(int x)
    {
    	min = std::min(x, min);
    	max = std::max(x, max);
    }
     
    void solve(int l, int r)
    {
    	int m = (l+r)/2;
     
    	a = m;
    	b = m+1;
     
    	min = a;
    	max = b;
     
    	add(other[seq[a]]);
    	add(other[seq[b]]);
     
    	while(true)
    	{
    		if(a > min)
    		{
    			if(a == l)
    				break;
     
    			a--;
    			add(other[seq[a]]);
    		}
    		else if(b < max)
    		{
    			if(b == r)
    				break;
     
    			b++;
    			add(other[seq[b]]);
    		}
    		else
    		{
    			first[a] = std::min(first[a], b);
     
    			if(a == l)
    				break;
     
    			a--;
    			add(other[seq[a]]);
    		}
    	}
    }
     
    int main()
    {
    	std::ios::sync_with_stdio(false);
      	std::cin.tie(0);
     
    	std::cin >> m;
    	n = (1 << m);
     
    	for(int i = 0; i < n; i++)
    	{
    		std::cin >> seq[i];
    		first[i] = MAXN;
    		other[seq[i]^(n-1)] = i;
    	}
     	
      	if(m == 1)
    	{
    		std::cout << 2 << std::endl;
    		return 0;
    	}
      
    	int c = 2;
    	while(c <= n)
    	{
    		for(int i = 0; i < n; i+=c)
    			solve(i, i+c-1);
    		c *= 2;
    	}
     
    	long long answer = n;
    	answer *= (answer-1);
    	answer /= 2;
    	answer += (long long) n;
     
    	dp[0][n] = dp[1][n] = 0;
     
    	for(int i = n-1; i >= 0; i--)
    	{
    		dp[0][i] = dp[1][i] = 0;
    		
    		if(first[i] == MAXN)
    			continue;
     
    		int c = first[i]-i+1;
    		if(c%4)
    		{
    			dp[1][i] = 1;
    			dp[1][i] += dp[0][first[i]+1];
    			dp[0][i] += dp[1][first[i]+1];
    		}
    		else
    		{
    			dp[0][i] = 1;
    			dp[1][i] += dp[1][first[i]+1];
    			dp[0][i] += dp[0][first[i]+1];
    		}
     
    		answer -= dp[0][i];
    	}
     
    	std::cout << answer << std::endl;
     
    	return 0;
    }
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 376 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 376 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 508 KB Output is correct
2 Correct 3 ms 504 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 632 KB Output is correct
2 Correct 4 ms 604 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 5 ms 888 KB Output is correct
2 Correct 5 ms 1016 KB Output is correct
3 Correct 5 ms 888 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 16 ms 2424 KB Output is correct
2 Correct 12 ms 2424 KB Output is correct
3 Correct 28 ms 4372 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 13 ms 2424 KB Output is correct
2 Correct 22 ms 4412 KB Output is correct
3 Correct 52 ms 7928 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 59 ms 8056 KB Output is correct
2 Correct 43 ms 7928 KB Output is correct
3 Correct 53 ms 7932 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 289 ms 29836 KB Output is correct
2 Correct 255 ms 29800 KB Output is correct
3 Correct 189 ms 29944 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 289 ms 29800 KB Output is correct
2 Correct 170 ms 29816 KB Output is correct
3 Correct 200 ms 29688 KB Output is correct
4 Correct 269 ms 29744 KB Output is correct