首页 > 其他分享 >Codeforces #816 1715 C

Codeforces #816 1715 C

时间:2022-11-15 22:22:50浏览次数:44  
标签:1715 int sum 元素 Codeforces 断点 816 neq

题面

假设我们有一个函数 $ g(1, n) $ 表示 $ i = 1 \sim n - 1 $ 中满足 $ a_i \neq a_{i + 1} $ 的 $ i $ 的数量。
现在有 $ m $ 个询问,每个询问将会让 $ x \rightarrow a_i $ 。
你需要在每次询问后求出 $ \sum_{l = 1}^{n} \sum_{r = l}^{n} g(l, r) $ 。

思路

着手于 $ a_i \neq a_{i + 1} $ 这个条件。
我们把满足 $ a_i \neq a_{i + 1} $ 的 $ i $ 右边,$ i + 1 $ 左边的空隙称为“断点”。显而易见,“断点”的数量 $ + 1 $ 就是 $ g(1, n) $ 。
对于一个断点,它被包含在子串里,则子串的 $ g + 1 $ 。
那么我们对于一个断点,统计它左边有多少个元素,右边有多少个元素,一乘,就能得到这个断点对答案的“贡献”。
这样就能求开始时的 $ \sum_{l = 1}^{n} \sum_{r = l}^{n} g(l, r) $ 了。


现在我们需要改变元素。
显然,一个元素的更改,只会影响它左边和右边的断点(如果有)。
(也就是 $ i - 1 $ 和 $ i $)
那就先减掉,更改完后,再加回来。


记得要加 $ \frac{n(n + 1)}{2} $ ,即 $ 1 + 2 + \cdots + n $ 。
这样做的原因是……
是……
是 $ + 1 $ !
那么我们统计所有的 $ [l, r] $:

  • $ l = 1 $ ,有 $ n $ 条;
  • $ l = 2 $ ,有 $ n - 1 $ 条;
  • ……
  • $ l = n $ ,有 $ 1 $ 条。

所以要 $ 1 + 2 + \cdots + n $ 。

代码

#include <bits/stdc++.h>
using namespace std;

int a[100005];
bool joint[100005];

int main() {
	int n, m;
	scanf("%d %d", &n, &m);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &a[i]);
	}
	for (int i = 1; i <= n; i++) {
		if (a[i] != a[i + 1]) {
			joint[i] = 1;
		}
	}
	long long ans = 0;
	for (int i = 1; i <= n; i++) {
		ans += 1ll * joint[i] * (i) * (n - i);
	}
	while (m--) {
		int i, x;
		scanf("%d %d", &i, &x);
		ans -= 1ll * joint[i - 1] * (i - 1) * (n - i + 1);
		ans -= 1ll * joint[i] * (i) * (n - i);
		a[i] = x;
		joint[i - 1] = a[i - 1] != a[i];
		joint[i] = a[i] != a[i + 1];
		ans += 1ll * joint[i - 1] * (i - 1) * (n - i + 1);
		ans += 1ll * joint[i] * (i) * (n - i);
		printf("%lld\n", ans + 1ll * n * (n + 1) / 2);
	}
	return 0;
}

标签:1715,int,sum,元素,Codeforces,断点,816,neq
From: https://www.cnblogs.com/AProblemSolver/p/16894234.html

相关文章

  • [VP]Codeforces Round #390 (Div. 2)
    和\(\color{black}{a}\color{red}{rtalter}\)一起打的顺嘴说一下今天(周日)早晨的趣逝事情发生在吃完早饭后,\(\color{grey}{WintersRain}\)和\(\color{black}{S}\color......
  • Codeforces 1748 D
    这场D还是很有趣的,值得探讨。首先\(a|x,b|x\)是两个数,不相同时不太好做,所以我们能否找到一个\(x\),满足\(a|x=b|x\)并且都是\(d\)的倍数呢?然后我们让\(d\)特殊一些——我......
  • P8816 [CSP-J 2022] 上升点列 题解
    题目传送门:luoguP8816[CSP-J2022]上升点列这是一道简单的dp题。定义到达指两点的曼哈顿距离是\(1\)。我们考虑设状态\(f(i,j)\)表示考虑结尾是第\(i\)个点,增......
  • Codeforces Round #833 (Div. 2)(持续更新)
    Preface我是大FW,B因为本地调试的时候把数组大小改成200忘记该回去了浪费了很多时间和罚时C刚开始也没想清楚WA了两发心态爆炸,然后D其实想出了一种做法但是心态崩了就没写......
  • Educational Codeforces Round 35 (Rated for Div. 2) F. Tree Destruction(树的直径/
    题目大意是给定一棵树,每次选择两个叶子将其删除,同时将两个叶子之间的简单路径长度加到答案上,找到一种方案使答案最大化,并输出删除的顺序。首先有一个结论是,距离树上某个节......
  • Codeforces 722 F Cyclic Cipher 题解 (同余方程,two-pointers)
    题目链接前两天做过一个题意类似但做法不类似的题在这里首先做这道题需要一个结论:(一元)同余方程组有解的充要条件是方程组中的所有方程两两联立有解。证明两个同......
  • Codeforces 833 题解
    A\(n\)是奇数时恰好可以用完,\(n\)是偶数时多出来的一块没用,所以直接输出\((n+1)/2\)即可。B每个字符出现次数都小于等于字符总数,令\(\Sigma\)是字符集大小,那显然......
  • Codeforces Round #833 (Div. 2) A--B
    A思路:直接盲猜x/2上取整。应该写成(x+1)/2最好#include<bits/stdc++.h>#defineendl'\n'usingnamespacestd;voids(){intn;cin>>n;cout<<(n+1)/2<<......
  • [VP]Codeforces Round #678 (Div. 2)
    诈骗题专场A.Reorder题意:给你一个长度为\(n\)的数组\(a\),问是否可以把这个重新排序后,使得\[\sum\limits^{n}_{i=1}\sum\limits^{n}_{j=i}\dfrac{a_j}{j}=m\]解法:......
  • Codeforces Round #786 (Div. 3) 补题记录
    小结:A,B,F切,C没写1ll对照样例才发现,E,G对照样例过,D对照样例+看了其他人代码(主要急于看后面的题,能调出来的但偷懒了。CF1674ANumberTransformation考虑若\(y\)......