首页 > 其他分享 >Codeforces Round 932 (Div. 2)题解(c、d)

Codeforces Round 932 (Div. 2)题解(c、d)

时间:2024-04-19 14:56:15浏览次数:32  
标签:奇数 int 题解 ll tc ans 932 Div sum

Codeforces Round 932 (Div. 2)

C. Messenger in MAC

题目大意

给定一些\(a_i\)\(和b_i\),选出尽量多的\(a_i 和b_i\),使得\(\sum_{i=1}^k a_{p_i}+\sum_{i=1}^{k-1}\left|b_{p_i}-b_{p_{i+1}}\right|\)小于给定的\(l\)。

题目解析

由于题目没有要求\(\{ p\}\)是升序排列的序列,因此我们可以改变\(a_i\)的顺序。注意到\(a_i\)的值是无法改变的,$$\sum_{i=1}^{k-1}\left|b_{p_i}-b_{p_{i+1}}\right|$$可以通过改变 \(b_i\)的顺序改变大小。考虑到贪心,最终一定有\(b_{p_i}\leq b_{p_{i+1}}\)。

(假设有 \(a<b<c\),一定是 \(|a-b|+|b-c|<|a-c|+|b-c|\))

因此先按照\(b\)的大小对序列 \(\{ab\}\)进行排序,假设选择了从\(l——r\)的若干对 \(ab\),一定有 \(\sum_{i=1}^{k-1}\left|b_{p_i}-b_{p_{i+1}}\right|=b_r-b_l\)(已经对 \(b\)排序了,所以一定是升序排列),接着只要处理\(\sum_{i=1}^k a_{p_i}\)即可。

我们不妨考虑双指针的写法进行 \(O(N^2)\)遍历:固定住最左边的数字后,不停的向右移动指针。令\(res\)表示当前的\(\sum_{i=1}^k a_{p_i}+\sum_{i=1}^{k-1}\left|b_{p_i}-b_{p_{i+1}}\right|\),每次向右移动指针时,\(res-b_r+b_{r+1}\),同时通过优先队列,将所有的\(a_i\)从大到小的排序,每当答案过大时,就从优先队列中排除若干个\(a_i\),直到小于\(l\)为止。

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N = 2007;
ll a[N] , b[N] ;
void solve() {
	int n,L;
	scanf("%d%d",&n,&L);
	vector<pair<ll,ll> >c(n);
	for(auto &[x,y]:c) {
		scanf("%lld%lld",&y,&x);
	}
	ll ans = 0;
	// 根据第二元素为关键字
	sort(c.begin(),c.end());
	for(int i = 1 ; i <= n ; i++) {
		b[i] = c[i-1].first;
		a[i] = c[i-1].second;
	}
	for(int l = 1 ; l <= n ; l++) {
		priority_queue<ll> q;
		ll sum =0;
		for(int r = l ; r <= n ; r++) {
			q.push(a[r]);
			sum += a[r];
			while(sum + b[r] - b[l] > L && q.size() ) {
				sum -= q.top();
				q.pop();
			}
			ans = max(ans,(ll)q.size());
		}
	}
	printf("%lld\n",ans);
}
 
int main() {
	int tc;
	cin >> tc;
	while(tc--)
		solve();
}

D. Exam in MAC

题目大意

给定一个大小为 n 的集合 s 和一些奇怪的整数 c。对于这个集合,需要计算整数对 (x,y) 的数量,使得 0 ≤ x ≤ y ≤ cx+y 不包含在集合 s 中,且 y-x 也不包含在集合 s 中。

题目解析

考虑鸽笼原理。我们记"\(x+y\in s\)"为条件一,"\(y-x\in s\)"为条件二,若需要两者都不满足,可以写为:

\[sum-condition1-condition2+(condition1\&condition2) \]

即减去满足条件一的的数量、满足条件二的数量后,再加上满足两个条件的数量。

  • 对于条件一:假设\(i=x+y,i\in s\),则满足此条件的\(x,y\)有 \(i/2+1\)对。
  • 对于条件二:假设\(i=x-y,i\in s\),则需要注意,\(x\leq c,y\leq0\),一共有 \(c-i+1\)对 \((x,y)\)满足此条件。
  • 对于条件一和条件二同时满足:假设 \(x+y=i,y-x=j\),有 \(2y=i+j(j\leq i)\),且\(i+j\)是偶数,因此必须是奇数加奇数、偶数加偶数的形式。假设\(s\)中有\(n\)个奇数,则只选择奇数作为\(i,j\)会产生\(\frac{(n+1)*n}2\)个符合条件的\((x,y)\)(对于\(s\)中第一个奇数,有\(n\)个数字和其能匹配;对于第二个奇数,由于大于第一个奇数,所以只能和第二个及以后的数字匹配),偶数同理。
#include<bits/stdc++.h>
using namespace std;
using ll = long long;

void solve() {
	ll n,c;
	scanf("%lld%lld",&n,&c);
	vector<ll>a(n);
	for(auto &i:a) scanf("%lld",&i);
	ll ans = (c+1)*(c+2)/2 ,cnt = 0;
	for(auto i:a) { 
		ans -= (c-i+1); // x-y=i
		ans -= (i/2+1);// x+y=i
		if(i%2) cnt++;
	}
	auto C = [&](ll n) {// 从n里面选2个 
		return (n+1)*n/2;
	}; 
	ans += C(cnt) + C(n-cnt);
	printf("%lld\n",ans);
}
int main() {
	#ifdef jhon
	freopen("std.in","r",stdin);
	#endif
	int tc;
	cin >> tc;
	while(tc--)
		solve();
}

标签:奇数,int,题解,ll,tc,ans,932,Div,sum
From: https://www.cnblogs.com/zhaohanzheng/p/18145873

相关文章

  • P6018 [Ynoi2010] Fusion tree 题解
    题目链接:Fusiontree大部分人貌似用的边权01Trie,实际这题用点权01Trie类似文艺平衡树去写更方便。考虑两种常见的区间维护:线段树。使用的是父节点信息是归并了左右区间的信息,适用于不需要考虑父节点的贡献的信息。文艺平衡树。每个点就是一个信息,归并左右子树,外加当......
  • kafka消息只能在一台服务器消费的问题解决过程
    场景:kafka消费端应用部署在两台机器上,其中一台能消费到生产端发出的kafka消息,另一台服务器接收不到任何消息。解决过程:一、从消费端启动日志中找出所有消费端线程2024-04-2320:04:44,726[xx_xxapp03-1556011171628-976bc2af_watcher_executor]INFOkafka.consumer.RangeA......
  • PKUSC2019 D1T1 题解
    前言五一网课的例题,但是网上没有详细的题解(其实就是都没放代码),所以来写一篇。题目可以在这里提交。题目简述有\(n\)(\(n\leq5\times10^5\))个村庄排成一排,每个村庄里有一个人。第\(i\)个村庄里的人要去第\(p_i\)个村庄,且\(p\)是\(1\simn\)的一个排列。他们出行......
  • [题解]ABC282E Choose Two and Eat One
    ABC282EChooseTwoandEatOne又一个图论的回顾——Kruskal最小(最大)生成树算法。看到\(n\)的范围只有\(500\),应该没有什么特别的算法。那么我们考虑建一个*\(n\)个顶点的完全图,节点\(x\)到节点\(y\)的边权值就是\(x^y+y^x\)。然后跑一遍最大生成树,得到的和就是最大结果了。如......
  • RuntimeError: No CUDA GPUs are available问题解决
    RuntimeError:NoCUDAGPUsareavailable问题解决检查GPU是否可用importtorchiftorch.cuda.is_available():print("GPU可用")else:print("GPU不可用")显示当前可用的GPU数量importtorchprint("当前可用的GPU数量:",torch.cuda.device_count())P......
  • [题解]CF33C Wonderful Randomized Sum
    CF33CWonderfulRandomizedSum我们可以发现,如果两区间不交叉也不会影响到结果,所以我们只需要考虑不交叉的情况即可。我们所选择的前缀\(1\simi\)应满足区间和最小,后缀也一样。所以用两个数组\(lr,rl\)分别记录下\(1\simi\)(前缀)最小和、\(i\simn\)(后缀)最小和。然后枚举分割......
  • 问题解析
    查看内存总量[root@localhost~]#free-h----人性化显示内存使用情况totalusedfreesharedbuff/cacheavailableMem:1.8G329M270M9.1M1.2G1.2GSwap:4.0G0B......
  • [ABC240E] Ranges on Tree 题解
    [ABC240E]RangesonTree题解思路解析由题意可知,只要一个点的所有儿子节点都被确定了,那么当前节点也就被确定了。也就是说,只要确定了所有叶子节点,也就能一层层地确定所有节点,而叶子节点没有儿子节点不受此条件的约束,同时我们希望\(\max\limits^N_{i=1}R_i\)最小,所以我们把所......
  • 【面试准备】跨域问题解决方法
    跨域是什么浏览器对于javascript的同源策略的限制,是一种安全策略举例:用户登陆某个网站后,服务器在客户端写了一些cookie,如果cookie被其他网站读取,那么隐私信息就会泄漏,包含用户的登录状态等。跨域情况说明:域名不同域名相同,端口不同二级域名不同跨域问题解决jsonpngi......
  • P7177 [COCI2014-2015#4] MRAVI 题解
    思路。我们知道最初添加的液体越多,那么每个蚂蚁得到的液体也就越多,又因为标签里有深搜,所以可以用DFS+二分解决(感觉说了一通废话),算是比较常规的一种解法了。在此题中我们需要魔改一下建树,需在其中添加判断此边是否为超级管道和处理通过液体的百分比这两段代码。DFS和二分的代......