https://iai.sh.cn/contest/44
3h.
第一次提交:320pts。比赛结束前:400pts。
比赛期间 第一次提交
先把四道题都读了一遍,感觉这次比较简单。顺着做吧。
此时3min。
T1 数对统计
贪心 - AC
数对(x,y),x已知,选等于x的数中最左边的那个,数y。
此时10min。
int n, a[MAXN], pos[MAXN];
ll cnt, ans;
bool vh[MAXN];
int main() {
// ios::sync_with_stdio(false);
// cin.tie(nullptr); cout.tie(nullptr);
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%d", a + i);
if (!pos[a[i]]) pos[a[i]] = i;
}
for (int i = n; i; --i) {
if (i == pos[a[i]]) ans += cnt;
if (!vh[a[i]]) ++cnt;
vh[a[i]] = true;
}
printf("%lld\n", ans);
return 0;
}
T2 序列操作
暴力之前
以前好像做过,但是完全忘了。
诚然,线段树可做。但是,对这个单点加法,全部乘法来说,有点大材小用了。
对于某个位置的数,它等于 m 3 ( m 2 ( m 1 x + q 1 ) + q 2 ) + q 3 m_3(m_2(m_1x+q_1)+q_2)+q_3 m3(m2(m1x+q1)+q2)+q3,这里只是举个例子。对于不同的数,几个m和q是不同的。
借鉴懒标记。我想,是不是要弄个乘法懒标记?但是在一个数上做加法,要修改整个懒标记,别的数不变,不好做。
我接着想到把它变成 m 1 m 2 m 3 ( m 1 − 1 ( m 2 − 1 ( m 3 − 1 q 3 + q 2 ) + q 1 ) + x ) m_1m_2m_3(m_1^{-1}(m_2^{-1}(m_3^{-1}q_3+q_2)+q_1)+x) m1m2m3(m1−1(m2−1(m3−1q3+q