10577 2024. 04. 05 21:00:37 CWM Barátok cpp17 Időlimit túllépés 11/100 699ms 69364 KiB
#include <iostream>
#include <optional>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;
#define int long long

struct fenwick_tree {
	vector<int> fwt;
	vector<int> base;
	fenwick_tree(vector<int>& input) {
		base = input;
		vector<int> prefixSum(input.size()+1);
		prefixSum[0] = 0;
		for (size_t i = 1; i < input.size()+1; i++)
		{
			prefixSum[i] = prefixSum[i - 1] + input[i-1];
		}
		fwt.push_back(prefixSum[0]);
		for (size_t i = 1; i < input.size()+1; i++)
		{
			int range = i - (i & (i - 1));
			fwt.push_back(prefixSum[i] - prefixSum[i - range]);
		}
	}
	int sumRange(int beg, int end) {
		end++;
		return sumFromBeginning(end) - sumFromBeginning(beg);
	}
	int sumFromBeginning(int end) {
		int sum = 0;
		while (end != 0) {
			sum += fwt[end];
			end = (end & (end - 1));
		}
		return sum;
	}
	void update(int idx, int newVal) {
		int dif = newVal - base[idx];
		base[idx] = newVal;
		idx++;
		while (idx < fwt.size()) {
			fwt[idx] += dif;
			int range = idx - (idx & (idx - 1));
			idx = (idx & (idx - 1)) + 2*range;
		}
	}
};

struct tNode {
	int val;
	int end;
	int beg;
	int par;
	tNode(int Val, int Beg, int End) {
		val = Val;
		beg = Beg;
		end = End;
		par = -1;
	}
	tNode() {};
};
struct segment_tree {
	vector<tNode> smt;
	int fullSize = 1;
	segment_tree(const vector<int>& inp) {
		for (size_t i = 0; i < 32; i++)
		{
			if (inp.size() > fullSize) fullSize *= 2;
			else break;
		}
		smt.resize(2 * fullSize - 1);
		for (size_t i = 0; i < inp.size(); i++)
		{
			smt[i] = tNode(inp[i],i,i);
		}
		int cur = 0;
		for (size_t i = fullSize; i < smt.size(); i++)
		{
			smt[i] = tNode(smt[cur].val + smt[cur + 1].val, smt[cur].beg, smt[cur + 1].end);
			smt[cur].par = i;
			smt[cur+1].par = i;
			cur += 2;
		}
	}
	int sumRange(int beg, int end) {
		int ans = 0;
		int cur = beg;
		while (true)
		{
			if (smt[cur].end==end) {
				ans += smt[cur].val;
				break;
			}
			tNode par = smt[smt[cur].par];
			if (par.beg >= cur && par.end <= end) {
				cur = smt[cur].par;
			}
			else {
				ans += smt[cur].val;
				cur = smt[cur].end + 1;
			}
		}
		return ans;
	}
	void update(int index, int value) {
		int cur = index;
		int dif = value - smt[cur].val;
		while (cur!=-1)
		{
			smt[cur].val += dif;
			cur = smt[cur].par;
		}
	}
};

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

	/*int n, q;
	cin >> n >> q;
	vector<int> inp(n);
	for (size_t i = 0; i < n; i++)
	{
		cin >> inp[i];
	}
	segment_tree sm = segment_tree(inp);
	for (size_t i = 0; i < q; i++)
	{
		int a, b, c;
		cin >> a >> b >> c;
		if (a == 1) {
			sm.update(b, c);
		}
		else {
			c--;
			cout << sm.sumRange(b, c) << "\n";
		}
	}*/
	int n;
	cin >> n;
	vector<int> inp(n, 1);
	vector<pair<int, int>> sVec(n);
	for (size_t i = 0; i < n; i++)
	{
		int a;
		cin >> a;
		sVec[i] = { a,i };
	}
	sort(sVec.begin(), sVec.end());
	segment_tree st = segment_tree(inp);
	int ans = 0;
	for (size_t i = 0; i < n; i++)
	{
		st.update(sVec[i].second, 0);
		int beg = max(0ll, sVec[i].second - sVec[i].first);
		int end = min(n - 1, sVec[i].second + sVec[i].first);
		ans += st.sumRange(beg, end);
	}
	cout << ans << "\n";
	return 0;
}
Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 3ms 1824 KiB
2 Időlimit túllépés 699ms 13172 KiB
subtask2 11/11
3 Elfogadva 3ms 3024 KiB
4 Elfogadva 79ms 4276 KiB
5 Elfogadva 61ms 4416 KiB
6 Elfogadva 98ms 4672 KiB
7 Elfogadva 21ms 4652 KiB
8 Elfogadva 116ms 5004 KiB
9 Elfogadva 6ms 4912 KiB
10 Elfogadva 118ms 4924 KiB
subtask3 0/12
11 Időlimit túllépés 658ms 46528 KiB
12 Elfogadva 296ms 47164 KiB
13 Időlimit túllépés 662ms 26264 KiB
14 Elfogadva 94ms 48292 KiB
15 Időlimit túllépés 662ms 27652 KiB
16 Elfogadva 68ms 49956 KiB
17 Időlimit túllépés 666ms 29188 KiB
subtask4 0/31
18 Elfogadva 162ms 51420 KiB
19 Elfogadva 407ms 52320 KiB
20 Elfogadva 68ms 52724 KiB
21 Elfogadva 402ms 53508 KiB
22 Időlimit túllépés 666ms 33180 KiB
23 Időlimit túllépés 686ms 34220 KiB
24 Időlimit túllépés 657ms 35556 KiB
25 Időlimit túllépés 657ms 36580 KiB
26 Időlimit túllépés 671ms 38036 KiB
subtask5 0/46
27 Időlimit túllépés 681ms 38812 KiB
28 Időlimit túllépés 662ms 39616 KiB
29 Időlimit túllépés 666ms 40800 KiB
30 Időlimit túllépés 671ms 41152 KiB
31 Időlimit túllépés 667ms 42712 KiB
32 Elfogadva 398ms 64792 KiB
33 Időlimit túllépés 677ms 44672 KiB
34 Időlimit túllépés 662ms 45832 KiB
35 Időlimit túllépés 675ms 47208 KiB
36 Időlimit túllépés 643ms 69364 KiB
37 Időlimit túllépés 660ms 49020 KiB
38 Időlimit túllépés 651ms 50060 KiB
39 Időlimit túllépés 671ms 51500 KiB
40 Időlimit túllépés 643ms 52840 KiB
41 Időlimit túllépés 680ms 54124 KiB