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 $最终是否会满意呢?
思路:
枚举配对方案,然后二分图判定。