首页 > 其他分享 >The 2022 ICPC Asia Nanjing Regional Contest - External D

The 2022 ICPC Asia Nanjing Regional Contest - External D

时间:2024-05-28 20:30:51浏览次数:25  
标签:return Contest int cin Regional cf Nanjing mid define

G题 赛题补充
D题的题目来源 https://codeforces.com/gym/104128/problem/D

文章目录

题意

给一个长度为n的数组,问对一段区间添加等差数列后的最大的第 k 大是多少

思路

  • 通过观察题目可以发现答案的范围符合单调性,因此我们可以考虑二分,那么第K大的数>=mid 等效于 有超过k个>=mid的数
  • 主要就是利用等差数列的性质和差分的思想去维护cf这个差分数组
  • 对于第k大,只要进行前缀和处理后区间>=mid的个数多于k个即可

代码

#include<bits/stdc++.h>
#define int long long 
#define endl "\n"
#define fi first
#define se second
#define PII pair<int,int> 
using namespace std;
const int N=2e5+5;
int a[N];
int n,k,m,c,d;
int cf[N];
bool check(int x){
	memset(cf,0,sizeof cf);
	for(int i=1;i<=n;++i){
		if(a[i]>=x){
			cf[1]++;//a[i]大于等于x,直接加上它的个数
		}
		else{
			int l=max(i-m+1,1LL);//l代表等差数列最远可到的左端点
			if(a[i]+c+(i-l)*d<x) continue;//加完若还不大于等于x,那么它肯定不满足题意
			int j;//j表示需要加几次公差才能大于等于x
			int minn=a[i]+c;//先加上首项
			if(d==0) j=0;
			else j=(x-minn-1)/d+1;
			j=max(j,0LL);//j最低为0
			int r=i-j;//差分的右端点
			++cf[l];
			--cf[r+1];
		}
	}
	for(int i=1;i<=n;++i) cf[i]+=cf[i-1];//前缀和处理
	int ans=0;
	for(int i=1;i<=n;++i) ans=max(ans,cf[i]);
	if(ans>=k) return true;//ans大于等于k,符合条件
	return false;
}
void solve(){	
	cin >> n >> k >> m >> c >> d;
	for(int i=1;i<=n;++i){
		cin >> a[i];
	}
	int l=0,r=1e18;
	while(l<r){//二分求右边界
		int mid=l+r+1>>1;
		if(check(mid)) l=mid;
		else r=mid-1;
	}
	cout << l << endl;
	return ;
}
signed main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int t=1;
	//cin >> t;
	while(t--) solve();
	return 0;
}
```cpp

标签:return,Contest,int,cin,Regional,cf,Nanjing,mid,define
From: https://blog.csdn.net/wh233z/article/details/139276699

相关文章

  • AtCoder Beginner Contest 355(F - MST Query)
    很久没有见到这么好的题了。原题面用ChatGPT......
  • Tokio Marine & Nichido Fire Insurance Programming Contest 2024(AtCoder Beginner C
    A-WhoAtetheCake?题意:有三个嫌疑犯(1,2,3(号码))现在有两个证人他们指出谁不是嫌疑犯,你可以找到确定的那个罪人吗?找到输出这个人的号码没找到输出-1思路:如果两人指出的人是一个人则输出-1不是则输出6-a-b,因为1+2+3=6(sum)减去a,b肯定可以到达......
  • AtCoder Beginner Contest 354
    A-ExponentialPlant(abc354A)题目大意某星球上的植物,初始高\(0\),然后每天依次增长\(1,2,4,8,...\),问哪天就高过身高为\(h\)的高桥。解题思路因为是指数级别长高,枚举一下天数即可,由于\(h\leq10^9\),因此天数不会超过\(32\)天。神奇的代码#include<bits/stdc++.h>u......
  • Codeforces 401B Sereja and Contests 题解
    题目简述Sereja是一名程序员,他喜欢参加Codesorfes比赛。不过,乌兹兰的网络连接不太好,所以Sereja有时会跳过比赛。Codesorfes有两种类型的比赛,分为Div1和Div2。Div1和Div2这两轮可以同时进行(Div1轮不能在没有Div2的情况下进行)。每一轮都有一个唯一的标识符,各轮按......
  • The 2024 International Collegiate Programming Contest in Hubei Province, China
    Preface感觉好久没训练了,这周末又要出战西安,只好找个平时的晚上抽空训练一场这场题本身质量还是不错的,但由于徐神被模拟题关了一整场,我前期被一个分类讨论写的心态爆炸导致最后一个medium的计数题没做出来,然后一个medium~hard的D题转化和性质基本都挖掘完了,最后没想到暴力增量......
  • AtCoder Regular Contest 177
    AtCoderRegularContest177A-Exchange问题陈述判断\(n\)个价格分别为\(x_i\)的商品,问能否通过有限数量的\(1\)元,\(5\)元,\(10\)元,\(50\)元,\(100\)元,\(500\)元,购买。思路贪心。每个商品从\(500\)元开始,能用就尽量用。如果中间某个商品无法被满足,则无解,反......
  • AtCoder Beginner Contest 351 E - Jump Distance Sum
    题目链接Hint1:只能斜着走,容易想到黑白棋盘,\((x+y)\%2==0\)位于一个团,\((x+y)\%2==1\)位于另一个团,分别求和。Hint2:\(dist=max(|x1-x2|,|y1-y2|)\),这是切比雪夫距离,将坐标系倾斜\(45^{\circ}\),改为曼哈顿距离\(dist=|x1-x2|+|y1-y2|\),即\(X=x+y,Y=x-y\),这样就可以将横纵坐标......
  • 2024 ICPC National Invitational Collegiate Programming Contest, Wuhan Site
    2024ICPCNationalInvitationalCollegiateProgrammingContest,WuhanSiteI.CyclicAppleStrings题意:给定一个01字符串,每次操作可以将这个字符串向左循环移动任意次数,求让这个字符串变成有序的需要最少几次操作思路:每次只能减少最右边的不和有边界相邻的一个1的长块,每次......
  • 2024 Jiangsu Collegiate Programming Contest
    Preface这场由于是学长们出的题,在5.5就作为验题队伍VP了一遍本来验题场一般是三人三机火速开题的,但由于那天徐神没带电脑,索性就三人一机当作训练来打最后经典被队友带飞,4h8题后和NJU的WF银牌队只差一题,然后最后1h我冲刺H题失败,耻辱下机吃花雕A.Two'sCompanybutThree'sTr......
  • AtCoder Beginner Contest 352 E - Clique Connect
    题目链接不需要将所有边都建立出来,根据\(Kruskal\)最小生成树的贪心策略,相同权值的边不需要形成团,形成一个链就行,对结果没有影响。时间复杂度\(O(mlogm)[m=\sum_{i=1}^{n}k_{i}]\)。#pragmaGCCoptimize(2)#pragmaGCCoptimize(3)#include<bits/stdc++.h>//#defineint......