11.1集训解题报告(在家隔离期)

T1

题面:

\(\text{Yazid}\) 有一个长度为 \(n\) 的序列 \(A\)(下标从 \(1\) 开始)。
你需要构造一个长度同为 \(n\) 的严格单调递增序列 \(B\),并确定一个非负整数 \(k\),使得 \(\forall i\in[1,n]\),都有 \(|A_i − B_i| \le k\)
所谓严格单调递增,即是对于任意 \(\forall i\in [1,n) B_i \lt B_{i+1}\)。需要注意的是,Yazid的序列 \(A\) 并不一定是严格单调递增的。
Yazid 对你的序列 \(B\) 并不感兴趣,他只想知道你能取到的最小的 \(k\) 是多少?

代码:

//二分答案判定。
int n;
int sz[100005]; 
int ans;
bool chck(int mid) {
	int L=-2e9;
	for(int i=1; i<=n; ++i) {
		int l=sz[i]-mid, r=sz[i]+mid;
		l=max(l, L+1);
		if(l<=r) L=l;
		else return 0;
	}
	return 1;
}
int main(){
	n=read(); 
	for(int i=1; i<=n; ++i) sz[i]=read();
	int l=0, r=1e9;
	while(l<=r) {
		int mid=l+r>>1;
		if(chck(mid)) {
			ans=mid;
			r=mid-1;
		} else l=mid+1;
	}
	cout<<ans;
}

T2

题面;

\(Tohsaka \ Rin\)\(Yazid\) 的好朋友,她是一名擅长宝石魔术的魔术师。

\(Rin\) 的所有宝石共分为 \(m\) 类,共计 \(n\) 个。
某天,\(Rin\) 将这 \(n\) 个宝石排成一个环形,并希望选择一段 .连 .续、且 .类 .型相同的宝石
进行研究。

而通过此方法选出的宝石难免数量稀少,因此 \(Yazid\) 建议 \(Rin\) 在挑选之前,先进
行 .不 .超 .过 k 次 .交 .换 .操 .作。每次交换操作,\(Rin\) 可以选择两个相邻的宝石,并交换它们的
位置。

\(Rin\) 采纳了 \(Yazid\) 的建议,但她面对琳琅满目的宝石不知所措。于是她只好向
\(Yazid\) 请求帮助。

\(Yazid\) 并不想告诉 \(Rin\) 交换方案,他只想告诉 \(Rin\) 最终最多能够选出的宝石数目。

\(Yazid\) 还要和 \(Rin\) 进行其他游戏,因此他找到了你,请你帮助他们计算。

思路:

直接分颜色模拟,分数 \(70\)
枚举每个位置向两边扩展。

代码:

int n, m;
ll k;
vector<int>q[1000006];
int a;
int ans=1;
int liumang;
int sta[1000006];
void slove(int x) {
	int p=q[x].size();
	for(int i=0; i<q[x].size(); ++i) {
		int sum=1, dj=0;
		int l=i, r=i, L=q[x][i], R=q[x][i];
		while(1) { 
			if(++liumang>1.3e7) {
				cout<<ans;
				exit(0);
			}
			int a=min(((q[x][((l-1)%p+p)%p]-L)%n+n)%n, ((L-q[x][((l-1)%p+p)%p])%n+n)%n)-1;
			int b=min(((q[x][(r+1)%p]-R)%n+n)%n, ((R-q[x][(r+1)%p])%n+n)%n)-1;
			if(a<=b) {
				if(0LL+dj+a>k) break;
				l=((l-1)%p+p)%p;
				L--; if(L==0) L=n;
				if(l==r) break;
				sum++; dj+=a;
			}
			else {
				if(0LL+dj+b>k) break;
				r=(r+1)%p;
				R++; if(R==n+1) R=1;
				if(l==r) break;
				sum++; dj+=b;
			}
		}
		ans=max(ans, sum);
	}
}
bool cmp(int a, int b) {
	return q[a].size()>q[b].size();
}
int main(){
	n=read(); m=read(); k=read();
	for(int i=1; i<=n; ++i) {
		a=read(); q[a].push_back(i);
	}
	for(int i=1; i<=m; ++i) sta[i]=i;
	sort(sta+1, sta+m+1, cmp);
	for(int i=1; i<=m; ++i) {
		if(q[sta[i]].size()==1) break ;
		slove(sta[i]);
	}
	cout<<ans;
}

T3

题面:

\(Yazid\)\(n\) 个区间,第 \(i\) 个区间为 \([li ,ri ](1 ≤ i ≤ n)。\)巧合的是,这些区间的总计\( 2n\) 个端点恰好与 $[1, 2n] $之间的所有整点一一对应。

所有区间都需要被设置类型,其必为 \(A、B\) 的其中之一。

对于类型相. 同. 的区间,如果它们相交且无包含关系,那么我们就说这两个区间冲突,
\(Yazid\) 就会不满意。

即,\(Yazid\) 会不满意当且仅当存在同类区间 \(i, j\),满足 \(l_i < l_j < r_i < r_j\).

坏消息是,现在 \(Yazid\) 尚未给任意区间设置类型。不仅如此,\(Yazid\) 还丢失了一些
区间,只剩下了前 m 个区间的左右端点信息。
聪明的你应该已经发现了,\([1, 2n]\) 之间的所有整点中,将恰好有 \(2n − 2m\) 个点不属
于任意一个区间。

\(Yazid\) 决定利用这些点重构出 \(n − m\) 个新的区间,在满足上面所有限制的同时,通
过合理的类型设置来使自己满意。
\(Yazid\) 聪明绝顶,因此只要存在能让自己达成目的的方案,他就一定能够发现并
实施。

那么问题来了,$Yazid $最终是否会满意呢?

思路:

枚举配对方案,然后二分图判定。

posted @ 2022-11-01 22:22  Konnya_ku  阅读(52)  评论(0编辑  收藏  举报