codeforces C

摘要:
=0)ans=min(ans,P[r].firstP[l+1].first);如果(l==r){++r;mdf(1,1,1,n,P[r].second);}mdf(1,-1,1,n,P[l+1].second);}printf(“%d”,ans);return0;}

题目链接:https://codeforces.com/contest/1435/problem/C

给定 (n)(b_i),每个 (b_i) 可以选择减去(a_{1,ldots,6})中的一个数字,求新数列中最大值减最小值的最小值

题意很绕,需要仔细理解
将所有的二元组((b_i-j,i)),按关键字排好序,双指针扫一遍,当满足位置(1,ldots,n)都出现过以后,更新答案

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<stack>
#include<queue>
using namespace std;
typedef long long ll;

const int maxn = 100100;

int n,cnt;
int a[10],b[maxn];

pair<int,int> P[6*maxn];

struct SEG{
	int mi,add;
}t[maxn<<2];

bool cmp(pair<int,int> x,pair<int,int> y){
	if(x.first == y.first){
		return x.second < y.second;
	}else{
		return x.first < y.first;
	}
}

void pushup(int i){ t[i].mi = min(t[i<<1].mi,t[i<<1|1].mi); }

void mdf(int i,int k,int l,int r,int p){
	if(l == r){
		t[i].mi += k;
		return;
	}
	int mid = (l+r)/2;
	if(p<=mid) mdf(i<<1,k,l,mid,p);
	else mdf(i<<1|1,k,mid+1,r,p);
	pushup(i);
}

int qry(int i,int l,int r,int x,int y){
	if(x <= l && r <= y){
		return t[i].mi;
	}
	int mid = (l+r)/2;
	int mi = 1000000007;
	if(x <= mid) mi = min(mi,qry(i<<1,l,mid,x,y));
	if(y > mid) mi = min(mi,qry(i<<1|1,mid+1,r,x,y));
	return mi;
}

ll read(){ ll s=0,f=1; char ch=getchar(); while(ch<'0' || ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0' && ch<='9'){ s=s*10+ch-'0'; ch=getchar(); } return s*f; }

int main(){
	for(int i=1;i<=6;++i) a[i] = read();
	n = read(); cnt = 0;
	
	for(int i=1;i<=n;++i){
		b[i] = read();
		for(int j=1;j<=6;++j){
			P[++cnt].first = b[i] - a[j];
			P[cnt].second = i;
		}
	}

	sort(P+1,P+1+cnt,cmp);
	
	int ans = 1000000007;
	for(int l = 0,r = 0; l < cnt; ++l){
		while((qry(1,1,n,1,n) == 0 && r < cnt)){
			++r;
			mdf(1,1,1,n,P[r].second);
		}
		
		if(qry(1,1,n,1,n) != 0) ans = min(ans,P[r].first - P[l+1].first);
		if(l==r){
			++r;
			mdf(1,1,1,n,P[r].second);
		}
		mdf(1,-1,1,n,P[l+1].second);
	}
	
	printf("%d
",ans);
	
	return 0;
}

免责声明:文章转载自《codeforces C》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇orcl 如何快速删除表中百万或千万数据pyspider安装下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

POI操作word和html相互转化

下面是里两个类:第一个类是html转为word,第二个是word转html(最下面附上jar包下载链接)packagecom.wz.poi.wordHtml;/***2018/4/24*@authorAdministrator**/importjava.io.BufferedReader;importjava.io.ByteArrayInputStream;...

使用jsPlumb插件实现动态连线功能

jsPlumb是一个强大的JavaScript连线库,它可以将html中的元素用箭头、曲线、直线等连接起来,适用于开发Web上的图表、建模工具等,其实jsPlumb可能主要是用来做流程图的,它在实现这方面的功能上非常强大,我在项目中只使用了它少部分功能,来实现项目中连线的效果。...

android studio如何查看数据库文件

Android Studio可以通过两种方式查看数据库文件:1。SQLCOUT优点:功能强大。缺点:解决麻烦。2.Android DeviceMonitor中FileExpoler的优点:免费缺点:需要导出数据库并使用数据库可视化工具查看;手机需要root获得su权限,并通过adb命令修改/data/data/data下数据库文件的访问权限。具体修改方法:...

Wayland 源码解析之代码结构

Wayland实现的代码组成可以分为以下四个部分:1.Wayland库的核心部分,大部分Wayland协议实现都位于该库中。1) 该工具程序分析Wayland协议文件并生成相应的头文件和代码文件。源代码文件列表:wayland/cursor/wayland cursor。通道/光标/通道光标。cwyland/cursor/os兼容性。cwyland/curs...

差分方程的零输入响应与零状态响应

差分方程的迭代分析方法有以下缺点:没有闭合解,不利于数学分析。某个时间的输出只能从头开始计算。本文介绍了差分方程的零输入响应和零状态响应分析方法。对于系统,这种分析方法可以很好地表达系统响应的物理意义=Y[-1]=0$Input Y[n]。回顾零输入响应和零状态响应的迭代计算,我们发现以下规则:$egin{align*}y[0]&=-&qqu...

CSS躬行记(8)——裁剪和遮罩

裁剪最早是在CSS2.1时代由clip属性引入,但该属性只能应用于绝对定位的元素,并且只能裁剪成矩形。CSS3提供了强大的clip-path属性,突破了clip属性的众多限制,接下来将围绕clip-path属性展开讲解。3)裁剪路径对于复杂的形状,可以采用SVG来创建裁剪路径,实现自定义。2)替换元素的填充和定位CSS3引入了两个新属性,用于遮罩替换元素。...