首页 > 其他分享 >CodeForces 1452E Two Editorials

CodeForces 1452E Two Editorials

时间:2023-11-13 20:12:48浏览次数:37  
标签:typedef Editorials int CodeForces len maxn long 1452E define

洛谷传送门

CF 传送门

考虑枚举其中一个区间取 \([i, i + K - 1]\),考虑对于每个 \(j\) 一次性处理出,区间取 \([j - K + 1, j]\) 产生的贡献(即以 \(j\) 为右端点)。

对于一个 \([l_k, r_k]\),设其与 \([i, i + K - 1]\) 的交长度为 \(t\)。如果 \(t = \min(r_k - l_k + 1, K)\) 则显然不会多产生贡献,直接判掉。否则:

  • 若 \(r_k - l_k + 1 \ge K\),当 \(j\) 取 \([l_k + t, l_k + K - 1]\) 时,产生的贡献分别为 \(1, 2, \ldots, K - t\);当 \(j\) 取 \([l_k + K, r_k]\) 时,产生的贡献均为 \(K - t\);当 \(j\) 取 \([r_k + 1, r_k + K - t]\) 时,产生的贡献分别为 \(K - t - 1, K - t - 2, \ldots, 1\)。区间加一个数可以一阶差分处理,区间加等差数列可以二阶差分。

  • 若 \(r_k - l_k + 1 < K\),当 \(j\) 取 \([l_k + t, r_k]\) 时,产生的贡献分别为 \(1, 2, \ldots, r_k - l_k + 1 - t\);当 \(j\) 取 \([r_k + 1, l_k + K - 1]\) 时,产生的贡献均为 \(r_k - l_k + 1 - t\);当 \(j\) 取 \([l_k + K, r_k + K - t]\) 时,产生的贡献分别为 \(r_k - l_k - t, r_k - l_k - t - 1, \ldots, 1\)。

二阶差分一下,最后枚举 \(j\) 取 \(\max\)。时间复杂度 \(O(n(n + m))\)。

code
// Problem: E. Two Editorials
// Contest: Codeforces - Educational Codeforces Round 98 (Rated for Div. 2)
// URL: https://codeforces.com/problemset/problem/1452/E
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 4040;

int n, m, K, a[maxn], b[maxn], d[maxn], e[maxn];

void solve() {
	scanf("%d%d%d", &n, &m, &K);
	for (int i = 1; i <= m; ++i) {
		scanf("%d%d", &a[i], &b[i]);
	}
	int ans = 0;
	for (int i = 1; i <= n - K + 1; ++i) {
		mems(d, 0);
		mems(e, 0);
		int s = 0;
		for (int j = 1; j <= m; ++j) {
			int t = max(0, min(i + K - 1, b[j]) - max(i, a[j]) + 1), p = min(K, b[j] - a[j] + 1);
			s += t;
			if (t == p) {
				continue;
			}
			int l = a[j] + t, r = min(b[j], a[j] + K - 1);
			if (l <= r) {
				++d[l];
				--d[r + 1];
				d[r + 1] -= r - l + 1;
				d[r + 2] += r - l + 1;
			}
			if (p == K) {
				if (b[j] - a[j] >= K) {
					e[a[j] + K] += K - t;
					e[b[j] + 1] -= K - t;
				}
				e[b[j] + 1] += K - t;
				e[b[j] - t + K] -= K - t;
				--d[b[j] + 1];
				++d[b[j] - t + K];
				d[b[j] - t + K] += K - t - 1;
				d[b[j] - t + K + 1] -= K - t - 1;
			} else {
				int len = b[j] - a[j] + 1;
				e[b[j] + 1] += len - t;
				e[a[j] + K] -= len - t;
				e[a[j] + K] += len - t;
				e[b[j] + K - t] -= len - t;
				--d[a[j] + K];
				++d[b[j] + K - t];
				d[b[j] + K - t] += len - 1 - t;
				d[b[j] + K - t + 1] -= len - 1 - t;
			}
		}
		for (int j = 1; j <= n; ++j) {
			d[j] += d[j - 1];
			e[j] += e[j - 1];
		}
		for (int j = 1; j <= n; ++j) {
			d[j] += d[j - 1];
		}
		// printf("i: %d\n", i);
		for (int j = K; j <= n; ++j) {
			// printf("%d %d %d %d\n", j, s, d[j], e[j]);
			ans = max(ans, s + d[j] + e[j]);
		}
	}
	printf("%d\n", ans);
}

int main() {
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:typedef,Editorials,int,CodeForces,len,maxn,long,1452E,define
From: https://www.cnblogs.com/zltzlt-blog/p/17830041.html

相关文章

  • Codeforces Round 908 (Div. 2) A-D
    SecretSport观察到数据不大,直接摁住x和y枚举即可,方案合法当且仅当刚好打若干局,且赢最后一局的人是赢家#include<bits/stdc++.h>usingnamespacestd;voidsolve(){intn;cin>>n;strings;cin>>s;//xintwina=0,winb=0;for(inti=1;i<=n......
  • Codeforces Round 887 (Div. 2)
    https://codeforces.com/contest/1853C题感觉很不好写的样子,首先通过打表发现最后答案每次都是+n,那么我们考虑前i个,假如当前的ans+i仍然小于a[i+1],则没有影响,我们依然可以直接往后跳,否则,我们越过了a[i+1],那么我们应当加上i+1,注意,这有可能会导致往后面继续跳,比如13567,我们跳......
  • Codeforces Round 903 (Div. 3) ABCDE
    CodeforcesRound903(Div.3)ABCDEA.Don'tTrytoCount题意:复制\(s\)串若干遍,是否能在\(s\)串中找到\(t\)串。思路:直接暴力,注意不要超限,会MLE//AConemoretimes//nndbk#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintmod=1e9+......
  • Educational Codeforces Round 157 D
    tilian不太会这种题发现找到一个数就能确定整个序列然后转而发现前缀异或和b1^b2=a1b1^b3=a2...我们发现要是n为偶数时能直接求出b1从而确定整个序列而为奇数时我们无法确定b1我们思考拆位之后如果b1该位为0算出真实的异或后的01个数b1该位为1算出真实的......
  • Codeforces Round 908 (Div. 2)
    比赛链接A.SecretSport题解O(1*T)对于一场比赛,结束前谁最后赢就是谁赢#include<bits/stdc++.h>usingnamespacestd;strings;voidsolve(){intn;cin>>n>>s;cout<<s[n-1]<<endl;}intmain(){intT;cin>>T......
  • CodeForces 852C Property
    洛谷传送门CF传送门NOIP模拟赛T1,小清新几何题。要让选出的点组成的多边形面积最大,就要让正多边形的面积减去选出的点组成的多边形面积最小。而这个面积差可以表示成\(2n\)个三角形的面积,即\(\sum\limits_{i=0}^{2n-1}S_{\triangleA_iA_{(i+1)\bmodn}B_{(i+......
  • Educational Codeforces Round 126 (Rated for Div. 2)
    https://codeforces.com/contest/1661/B题数据很小,直接bfs预处理就行C题随便猜了一下,设mx=\(max\{a_i\}\)最后的值应该是mx,mx+1,mx+2,mx+3之类的吧D题刚开始从前面考虑,陷入僵局,一度非常的困,学习凯库勒睡了一会,就突然想到了,前面不行,就从后面考虑,可以发现,从后面考虑的话,就非常......
  • Codeforces Round 908 (Div. 2)
    A.SecretSport题意:A与B选手在下棋,规定下赢X把看作赢一局,一共赢Y把的那个是最后的赢家。思路:因为不知道x,y到底是多少,n的范围是到20,所以只需要枚举x即可,时间复杂度不高,注意的是,如果枚举结果是A赢,那么给定字符串的最后一个值一定是A,反之也是。#include<bits/stdc++.h>usingnam......
  • Codeforces Visit
    CodeforcesVisit记录一下自己大概vis了那几场??随机补题大法好!CF632Div.2飞速模拟出ABC。优势在我!CF1333D发现就是把字符串变成LLRR此类形状。所以开头必然是L啊,然后我们考虑先把L换到第一个。发现必然是LLLLLLLLLLLRRRRRRRR啊,很快啊,不会了。CF1333E你妈妈con......
  • Educational Codeforces Round 157 (Rated for Div. 2)
    A.TreasureChest题目大意:人在0处,宝藏在x,钥匙在y,人最多拿宝箱z秒,问你最快多久开宝箱?思路:如果说钥匙在宝箱的左边,那么人只需要往右走就是最佳答案,如果钥匙在宝箱的右边,那么人只需要拿的宝箱到最佳地点就行#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ intx,y......