首页 > 其他分享 >CF1715C Monoblock 题解

CF1715C Monoblock 题解

时间:2022-08-22 15:47:15浏览次数:89  
标签:相等 Monoblock int 题解 修改 CF1715C 区间 neq op

思路

根据题意我们不难看出,求一个区间的块的数量即求区间内 \(a_i\neq a_{i-1}\) 的数量,如果直接枚举每个区间的话,时间复杂度是 \(\mathcal O(n^2)\) 显然这样做是不行的,但是我们可以考虑每一个 \(a_i\neq a_{i-1}\) 对答案产生的贡献,即有多少个区间包含 当前的 \(i\) 和 \(i-1\) 根据简单的组合数学知识和乘法原理,我们只需考虑在 \(1\) 到 \(i-1\) 中选一个点作为区间左端点的方案数,乘上在 \(i\) 到 \(n\) 之间选取一个点作为区间右端点的方案数,这样算出来的结果为该 \(a_i\neq a_{i-1}\) 产生的贡献,再加上序列的所有子区间数量,即 \(\dfrac{n\times (n+1)}{2}\) 即可。

代码如下

for (int i = 2; i <= n; i++) {

	ans += (i - 1) * (n - i + 1) * (int)(a[i] != a[i - 1]);
}

ans += (n * (n + 1)) / 2;


每次修改的时候也是类似的做法,考虑每次修改后,修改的点 \(i\) 修改之前是否和 \(i-1\) 和 \(i+1\) 相等,修改之后是否和 \(i-1\) 和 \(i+1\) 来考虑每次修改对答案产生的影响,若修改前相等修改后不相等则在原答案的基础上加上修改后产生的贡献,若修改前不相等修改后相等则减去原先对答案产生的贡献。具体细节看代码。

代码

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, m, f[1000100], a[100010], ans, b[100010];

signed main() {
	scanf("%lld%lld", &n, &m);

	for (int i = 1; i <= n; i++) {

		scanf("%lld", &a[i]);
	}

	for (int i = 2; i <= n; i++) {

		ans += (i - 1) * (n - i + 1) * (int)(a[i] != a[i - 1]);
	}

	ans += (n * (n + 1)) / 2;

	while (m--) {
		int op, x;
		scanf("%lld%lld", &op, &x);

		if (op > 1) {
			if (a[op - 1] == x && a[op - 1] != a[op]) {
				ans -= (op - 1) * (n - op + 1);
			} else if (a[op - 1] != x && a[op - 1] == a[op]) {
				ans += ((op - 1) * (n - op + 1));
			}
		}

		if (op <= n - 1) {
			if (x == a[op + 1] && a[op + 1] != a[op]) {
				ans -= op * (n - op);
			} else if (a[op] == a[op + 1] && a[op + 1] != x) {
				ans += (op * (n - op));
			}
		}

		a[op] = x;
		printf("%lld\n", ans);
	}

	return 0;
}


标签:相等,Monoblock,int,题解,修改,CF1715C,区间,neq,op
From: https://www.cnblogs.com/Dregen-Yor/p/16612984.html

相关文章

  • CF1715B Beautiful Array 题解
    思路根据题意,不难看出,当\(b>\dfrac{s}{k}\)时,一定无解,因为无论怎样分配\(s\),最终的结果一定不会比\(\dfrac{s}{k}\)更大。然后再来考虑当\(b\le\dfrac{s}{k}\)时,......
  • CF1715A Crossmarket 题解
    思路根据题意以及下面给的样例解释,我们不难看出最优解一定是下面两种情况的一种:即一个人直接抵达目标点的距离加上另一个人走行和列,即\(n\)和\(m\)中较小的一个,加......
  • CF1715D 2+ doors 题解
    个人认为这道D比C要简单。思路因为题目中每个条件限制为$a_i\mida_j=x$,并且题目中还提到\(x<2^{30}\),我们考虑将\(x\)转换成二进制的方式表示,枚举\(x\)的......
  • 蔚来杯2022牛客暑期多校训练营加赛 题解
    E.Everyoneisbot对于后\(p\)个人,这\(p\)个人相互制约,一旦有一个人进行复读,剩下的\(p-1\)个人一定会进行复读,那么这个人就会被禁言,对于他来说不是最优策略。此时......
  • CodeForces-1715C Monoblock
    Monoblockdp先想想如何计算初始值\(dp[x]\)表示以第\(x\)个位置为\(r\),他的所有贡献状态转移:如果\(a_x=a_{x-1}\):\(dp[x]=dp[x-1]+1\),代表只增加了\(l......
  • 题解 - CF1715
    C.Monoblock先考虑算出修改前的答案。这明显可以增量法\(O(n)\)。修改的时候先考虑把这里断开,然后再考虑和左右两边连上(大概三种情况,随便讨论)D.2+doors完了,口胡假了......
  • CF 1329 题解
    A.DreamoonLikesColoring题目描述有\(n\)个格子排成一行,每个格子初始没有颜色,进行\(m\)次操作,第\(i\)次操作有一个参数\(l_i\),表示可以把\([p_i,p_i+l_i-......
  • P3605 [USACO17JAN]Promotion Counting P 题解
    solution考虑权值线段树合并:首先离散化,然后对于一个节点,我们将它的所有子树合并上来,并统计所有能力指数的个数(权值线段树基本操作),查询时只需查询\(p_i+1\simn\)的和即......
  • 问题解决——SSH时出现WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!(转)
    转自:问题解决——SSH时出现WARNING:REMOTEHOSTIDENTIFICATIONHASCHANGED!1、问题描述终端出现:@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@WA......
  • STL中map容器的应用(HDU1263水果题解)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1263题目描述:TimeLimit:2000MS;MemoryLimit:65536K;夏天来了~Joe经营着一个不大的水果店.他认为生存之道就......