[SWEA] 재성이의 비료주기

Date:

[SWEA] 재성이의 비료주기

Problem URL : 재성이의 비료주기

#include <vector>
#include <cstring>

using namespace std;

typedef long long ll;

ll sum(vector<ll>& tree, int i){
	ll ans = 0;
	while (i > 0){
		ans += tree[i];
		i -= (i & -i); 
	}

	return ans;
}

void update(vector<ll>& tree, int i, ll diff){	
	while (i < tree.size()){		
		tree[i] += diff;
		i += (i & -i);
	}
}

int main() {
	int TC;
	scanf("%d", &TC);
	for (int tc = 1; tc <= TC; tc++) {
		int N, D;
		long long s, a, b;
		scanf("%d %d %lld %lld %lld", &N, &D, &s, &a, &b);
		vector<ll> arr(N + 1);
		vector<ll> tree(N + 1);
		fill(arr.begin(), arr.end(), 0);
		fill(tree.begin(), tree.end(), 0);
		ll ans = 0;
		int idx = 1;
		for (int i = 1; i <= D; i++) {
			int c = s % N + 1;
			s = (s * a + b) % 1000000007;
			int k = s % N + 1;
			s = (s * a + b) % 1000000007;
			update(tree, idx, i);
			idx += c;
			if (idx > N) {
				idx -= N;
				if (idx > 1) {
					update(tree, 1, i);
					update(tree, idx, -i);
				}
			} else {
				update(tree, idx, i * (-1));
			}
			
			int find = idx + k - 1;
			if (find > N) {
				find -= N;
			}
			ans += sum(tree, find);
		}
		printf("#%d %lld\n",tc,ans);
	}
}

Comments

링크 를 참고했다.
펜윅트리는 펜윅트리 1, 펜윅트리 2 를 참고하자

틀린 풀이(제한 시간 초과)

#include <vector>
#include <cstring>
#include <iostream>

using namespace std;

typedef long long ll;

int arr[100001];

int main() {
	int TC;
	scanf("%d", &TC);
	for (int tc = 1; tc <= TC; tc++) {
		int N, D;
		long long s, a, b;
		scanf("%d %d %lld %lld %lld", &N, &D, &s, &a, &b);
		
		ll ans = 0;
		int idx = 1;
		memset(arr, 0, sizeof(arr));
		for (int i = 1; i <= D; i++) {
			int c = s % N + 1;
			s = (s * a + b) % 1000000007;
			int k = s % N + 1;
			s = (s * a + b) % 1000000007;
			
			if (idx + c - 1 > N) {
				for (int j = idx; j <= N; j++) {
					arr[j] += i;
				}
				for (int j = 1; j <= idx + c - 1 - N; j++) {
					arr[j] += i;
				}
				idx += c - N;
			} else {
				for (int j = idx; j <= idx + c - 1; j++) {
					arr[j] += i;
				}
				idx += c;
			}

			k += idx - 1;
			if (k > N) {
				k -= N;
			}
			
			ans += arr[k];
		}
		printf("#%d %lld\n",tc,ans);
	}
}

댓글