[LOJ#2461]. 「2018 集训队互测 Day 1」完美的队列

[LOJ#2461]. 「2018 集训队互测 Day 1」完美的队列

题意

#2461. 「2018 集训队互测 Day 1」完美的队列 - 题目 - LibreOJ (loj.ac)

太牛逼了

我们来看看这个题,不好维护。

首先要想到如果我们可以处理出来每次加入的元素什么时候被都被弹出了,那么最后扫一遍用桶维护即可。

那么如何求呢,我们把一次操作分成若干个但不超过 \(\sqrt n\) 大块和至多两个散快。

然后考虑整块怎么做,就每次对于一个整块的 \(m\) 次操作一起做,然后只要维护整体的最大值,用双指针扫即可。修改的时候整块用区间打标记,否则散块暴力修改即可。

我们在考虑怎么做一个散块,对于散块,我们直接维护这个散块的每个位置,然后在每个位置上在顺便维护一个整块的前缀和即可。每次一个块的散块算整块前缀和的时候一起算。

我要去学文化课了。

#include<bits/stdc++.h>
const int N = 1e5 + 10, B = 300;
using std::cin;
using std::cout;
using std::pair;
using std::vector;
template<typename T>
inline T min(const T &x, const T &y) {
	return x < y ? x : y;
}
template<typename T>
inline T max(const T &x, const T &y) {
	return x > y ? x : y;
}
int n, m, a[N], b[N], val[N], del[N], sum[N], pos[N], cnt[N];
pair<int, int> q[N];
vector<int> sml[N], qs[N];
int main() {
	freopen("1.in", "r", stdin);
	freopen("1.out", "w", stdout);
	std::ios::sync_with_stdio(0);
	std::cin.tie(0);
	std::cout.tie(0);
	cout << std::fixed << std::setprecision(10);
	cin >> n >> m;
	for (int i = 1; i <= n; ++i) {
		cin >> a[i];
	}
	for (int i = 1; i <= m; ++i) {
		cin >> q[i].first >> q[i].second >> val[i];
	}
	for (int l = 1, r = B, mx, tag; l <= n; l += B, r += B) {
		r = min(r, n);
		mx = tag = 0;
		for (int i = l; i <= r; ++i) {
			mx = max(mx, b[i] = a[i]);
		}
		std::function<void(int, int, int, int)> modify = [&] (int id, int L, int R, int val) {
			int l = max(L, q[id].first), r = min(R, q[id].second);
			if (l <= r) {
				for (int i = l; i <= r; ++i) {
					b[i] += val;
				}
				mx = -1e9;
				for (int i = L; i <= R; ++i) {
					mx = max(mx, b[i] + tag);
				}
			}
		};
		for (int i = 1, j = 1, pre = 1; i <= m; ++i) {
			if (q[i].first <= l && q[i].second >= r) {
				for (int lim = min(i, j); pre < lim; ++pre) {
					if (q[pre].first <= l && q[pre].second >= r) {
						++mx;
						++tag;
					}
					else	 {
						modify(pre, l, r, 1);
					}
				}
				j = max(j, i);
				for (; j <= m && mx >= 0; ++j) {
					if (q[j].first <= l && q[j].second >= r) {
						--tag;
						--mx;
					}
					else {
						modify(j, l, r, -1);
					}
				}
				if (mx >= 0) {
					del[i] = m + 1;
				}
				else {
					del[i] = max(del[i], j - 1);
				}
				pre = i;
			}
		}
		for (int i = 1; i <= m; ++i) {
			sum[i] = sum[i - 1];
			if (q[i].first <= l && q[i].second >= r) {
				pos[++sum[i]] = i;
			}
			else {
				for (int j = max(q[i].first, l), lim = min(q[i].second, r); j <= lim; ++j) {
					sml[j].push_back(i);
				}
			}
		}
		//cout << sml[1].size() << '\n';
		for (int o = l; o <= r; ++o) {
			for (int i = 0, j = 0; i < (int) sml[o].size(); ++i) {
				for ( ; a[o] > 0 && j < (int) sml[o].size() - 1; ++j) {
					a[o] -= sum[sml[o][j + 1]] - sum[sml[o][j]] + 1;
				}
				if (a[o] <= 0) {
					del[sml[o][i]] = max(del[sml[o][i]], !a[o] ? sml[o][j] : pos[sum[sml[o][j]] + a[o] + 1]);
				}
				else {
					del[sml[o][i]] = max(del[sml[o][i]], a[o] > sum[m] - sum[sml[o][j]] ? m + 1 : pos[sum[sml[o][j]] + a[o]]);
				}
				if (i < (int) sml[o].size() - 1) {
					a[o] += sum[sml[o][i + 1]] - sum[sml[o][i]] + 1;
				}
			}
		}
	}
	int ans = 0;
	/*
	cout << "del is\n";
	for (int i = 1; i <= m; ++i) {
		cout << del[i] << '\n';
	}
	cout << "ans is\n";
	*/
	for (int i = 1; i <= m; ++i) {
		qs[del[i]].push_back(val[i]);
		for (auto &j: qs[i]) {
			ans -= !--cnt[j];
		}
		ans += !cnt[val[i]]++;
		cout << ans << '\n';
	}
	return 0;
}

乌兹为什么是神?在谈论这个问题之前,我想先说说其他ad相较于乌兹究竟差在了哪里

  首先是犯下傲慢之罪的piglet

  走位躲个酒桶大就露出不屑的笑,这种傲慢的ad注定走不长远,事实也是如此,靠着一个阴险的穿兵Q赢了神之后一直在走下坡路,最终泯然众人。与之相比神就很谦卑,s6的烬,s7的霞都是神留给凡人的慈悲,神不是不会,只是不想通过太完美的表现让对手绝望所以故意不用,可笑有些人不理解神的良苦用心,竟然还用这些事来讥讽神,我劝你们好自为之。

img

  然后是犯下愤怒之罪的Imp

  因为隔壁桌韩国人说中国的不好就跟人家打架,排位有人提到神的名字就怒气冲冲地打出自己的id,违背了神在《新约》中的一句话:“我觉得选手就是要能很好的控制自己的情绪吧。”于是神降下了他的惩罚,Imp后宫起火,老婆抢走银行卡扣押护照,更染上烟瘾一蹶不振。

img

  接着是犯下懒惰之罪的Bang

  自以为拿下两个S赛冠军就了不起了,自创冥想训练法。另外大家有所不知,其实在s7半决赛前,Bang闭上眼睛做冥想的时候,其脑海中看见的画面,正是站在光芒之中的乌兹,那时神告诉他:“你只可到这里,不可越过。”然而,神的劝说不但没有让Bang迷途知返,竟然还敢在半决赛伙同LCK头号魔头正面挑战神的威严,于是神降下了他的惩罚,Bang在决赛身败名裂,两届s赛冠军没人记得,从此成为了众人口中的推推棒。

img

  再然后是犯下了嫉妒之罪Ruler

  屡次被神击败,但口服心不负的Ruler,暗中嫉妒着神,甚至胆敢当众说出如果好好准备地话,感觉自己会更强这种话。于是,在含金量最高的LOL比赛,即亚运会上,Ruler被神正面击溃。不过,念在尺弟最终皈依了神的教,并且践行神的意志讨伐了屡次以下犯上的Bang后,神应许了他在三星的一切。 

img

  犯下贪婪之罪的Jackeylove

  只是初出茅庐,JKL就夺得了s赛冠军,而这,自然是因为神的应允。神本来钦定他为自己在人间的代言人,在自己退役之后替自己继续讨伐LCK的魔头,为此甚至不惜亲自为JKL铺路,在8强赛主动输掉比赛,将一切荣耀都归给他,甚至应允他可以带走自己最爱的卡莎。但最后Jackeylove却被利益蒙蔽了双眼,不再以践行神的理想为自己的理想,也不再聆听神的教诲,甚至自以荣光已经超过了神,竟允许粉丝P出“我十七岁就夺冠了,你呢”这种亵渎神尊严的图片,于是神降下了惩罚,Jackeylove从此不再长高并且拥有一颗醒目的大头,而他的上单将再也不能独自carry,他的中单再也不能强势压制对手,他的辅助将再也不能开团,他的打野也再不能替他揽下大锅,吸收火力。

img

  犯下暴食之罪的Lwx

  在神子Jackeylove堕落之后,神开始寻找下一个代言人,这一次,他选中了LWX。相较于神,Lwx无疑是不完美的,他没有神足以让对手窒息的对线压制力,也没有神深不见底的英雄池,舍我其谁的胆气,敏锐的收割嗅觉,无懈可击的操作,但神将自己最虔诚,同时也是实力最强大的两位婢女(VN卡莎)暂时交给了他,并复刻了s8的铺路操作,但由于s8的事,神认为或许是自己给的压力过大才导致了神子的堕落,于是这一次神选择了在小组赛离开,减少Lwx的心理负担,最终,Lwx成功了。然而,夺冠后的Lwx不但冒大不韪在VN小姐的身上刻下了自己的名字,更妄图染指神力,只是他错误地认为神的力量来源于吃三路和四保一,最终他也因此犯下了暴食之罪,并在s10无缘世界赛。

img

最后,犯下淫欲之罪的Huanfeng

  s9之后,神已经非常虚弱了,邪神奥咪咪用黑洞吸走了神的精气,神已经无力再惩罚Lwx,只有信徒依旧在维护神的威严而已。此刻已经决心退隐的神在最后依然心系LPL,于是他选中了第三位神子——huanfeng。作为第三任神子,Huanfeng很好地维护了神的威严,但在接连击溃两代堕落的神子后,Huangfeng遇到了淫魔荔枝姐,被吸走了神赋予自己的力量,于是在决赛中连连失误,最终葬送比赛,彻底身败名裂。

img

以上文章转载自B站:Bella 小姐月光加冕

posted @ 2021-09-20 20:10  siriehn_nx  阅读(171)  评论(0编辑  收藏  举报