답안 #133879

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
133879 2019-07-21T16:15:19 Z sebinkim Fibonacci representations (CEOI18_fib) C++14
15 / 100
4000 ms 2032 KB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair <ll, ll> pll;

const ll mod = 1e9 + 7;

set <pll> S;
ll n;

void erase(set <pll>::iterator it) { S.erase(it); }
void insert(pll p) { S.insert(p); }

void insert(ll t, ll x)
{
	auto it = S.lower_bound(pll(x, 1e9));
	if(it == S.begin() || prev(it) -> second < x){
		pll p(x - 1, x + 1);
		if(it != S.begin() && prev(it) -> second + 1 == x){
			p.first = prev(it) -> first; erase(prev(it));
		}
		it = S.lower_bound(pll(x, 1e9));
		if(it != S.end() && x + 1 == it -> first){
			p.second = it -> second; erase(it);
		}
		insert(p);
	}
	else{
		it = prev(it);
		if(it -> second - x & 1){
			pll p(it -> first + 1, x);
			ll x1 = it -> first - 1, x2 = it -> second;
			erase(it); if(p.first < p.second) insert(p);
			if(x1 > 0) insert(t, x1); insert(t, x2);
		}
		else{
			pll p(it -> first, it -> second == x? x - 2 : x);
			x = it -> second + 1;
			erase(it); if(p.first < p.second) insert(p);
			insert(t, x);	
		}
	}
}

int main()
{
	ll i, x;
	ll d0, d1, lt, _d0, _d1, d, l;
	
	scanf("%lld", &n);
	
	for(i=0; i<n; i++){
		scanf("%lld", &x);
		insert(i, x);
		
		d0 = 0; d1 = 1; lt = 0;
		for(pll t: S){
			d = t.first + 1 - lt; l = (t.second - t.first) / 2;
			_d0 = (d / 2 * d0 + (d - 1) / 2 * d1) % mod;
			_d1 = (d0 + d1 + _d0 * (l - 1)) % mod;
			d0 = _d0; d1 = _d1; lt = t.second - 1;
		}
		printf("%lld\n", (d0 + d1) % mod);
	}
	
	return 0;
}

Compilation message

fib.cpp: In function 'void insert(ll, ll)':
fib.cpp:32:19: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
   if(it -> second - x & 1){
      ~~~~~~~~~~~~~^~~
fib.cpp:36:4: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
    if(x1 > 0) insert(t, x1); insert(t, x2);
    ^~
fib.cpp:36:30: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
    if(x1 > 0) insert(t, x1); insert(t, x2);
                              ^~~~~~
fib.cpp: In function 'int main()':
fib.cpp:52:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%lld", &n);
  ~~~~~^~~~~~~~~~~~
fib.cpp:55:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%lld", &x);
   ~~~~~^~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 376 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 376 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 256 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 376 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Execution timed out 4094 ms 2032 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 376 KB Output isn't correct
2 Halted 0 ms 0 KB -