首页 > 其他分享 >Educational Codeforces Round 134 (Rated for Div. 2)

Educational Codeforces Round 134 (Rated for Div. 2)

时间:2023-12-17 20:58:54浏览次数:24  
标签:std Educational Rated int Codeforces mid le ind st

基本情况

AB秒了。

C搞了一个错的二分答案,虽然过样例了。

C. Min-Max Array Transformation

错误分析

没有进一步推导性质,而是觉得数据单调递增估计是二分,然后就无脑写,实际上 check 的正确性没有保证。

bool check(int ind, int now)
{
	if (ind == now) return true;
	if (b[ind] < a[now]) return false;
	if (ind == 1) return true;
	return b[ind - 1] >= a[ind];//并不严谨
}

void solve()
{
	int n; 
	std::cin >> n;
	for (int i = 1; i <= n; i++) std::cin >> a[i];
	for (int i = 1; i <= n; i++) std::cin >> b[i];
	for (int i = 1; i <= n; i++)
	{
		int l = 0, r = n, ans = 0;
		while(l <= r)
		{
			int mid = l + (r - l >> 1);
			if (check(mid, i)) r = mid - 1, ans = mid;
			else l = mid + 1;
		}
		if (ans != 0)
			std::cout << b[ans] - a[i] << " ";
		else 
			std::cout << b[i] - a[i] << " ";
	}
	std::cout << std::endl;
	for (int i = 1; i <= n; i++)
	{
		int l = 0, r = n, ans = 0;
		while(l <= r)
		{
			int mid = l + (r - l >> 1);
			if (check(mid, i)) l = mid + 1, ans = mid;
			else r = mid - 1;
		}
		if (ans != 0)
			std::cout << b[ans] - a[i] << " ";
		else 
			std::cout << b[i] - a[i] << " ";
	}
	std::cout << std::endl;
}

正确思路

题意

有两个序列 \(a,b\)。对于每个 \(a_i\),你需要对 \(b\) 进行重排,使得 \(\forall k,b_k-a_k\ge0\)。问这时 \(b_i-a_i\) 最小、最大分别可能是多少。

多组询问,\(\sum n\le2\times10^5\)。

下面的讨论,记 \(c\) 为重排后的 \(b\)。

\(\texttt{task} _1\)

最小其实很好做。如果没有确定的思考方向,可以发挥 \(\tt CF\) 上非常实用的盲猜法。

对于 \(a_i\) 而言,单纯要让重排后 \(c_i-a_i\) 最小,可以直接让 \(c_i\) 等于b 中大于等于 \(a_i\) 且最小的数,即后继。

这个结论是对的。直接输出后继就完了,接下来我给个证明。

因为题目保证有解,所以最起码对于原来的 \(a,b\) 有 \(\forall k,a_k\le b_k\)。

我们令 \(b_j\) 为 \(b\) 中 \(a_i\) 后继,此时定有 \(b_j\le b_i\),所以 \(j\le i\)。

然后考虑这样的构造(\(c\) 为重排后的 \(b\)):

\[c_k=\begin{cases} b_k&k\in[1,j)\\ b_{k+1}&k\in[j,i)\\ b_j&k=i\\ b_k&k\in(i,n] \end{cases}\]

\(\texttt{task} _2\)

有一个关键性质,就是 \(\forall j\le i\),\(c_j\) 的选择不会影响 \(c_i\) 的选择。原因是根据上面 \(\forall k,b_k\ge a_k\),\(b_{1\cdots i-1}\) 可以解决 \(a_{1\cdots i-1}\),不会影响 \(a_i\)。

所以如果你想让单个的 \(c_i-a_i\) 最大,只需要解决 \(i+1\cdots n\) 的影响即可。

然后就是一个贪心的思想。如果 \(c_i\) 尽量的大,那么就要让 \(c_{i+1\cdots n}\) 都尽量的小。

所以我们用一个 set 存下所有的 \(b\),倒序遍历 \(a\),然后删除 set 中 \(a_i\) 的后继。删除之前的 set 的最大值就是答案。

\(\texttt{code}\)

void solve()
{
	int n; std::multiset<int> st;
	std::cin >> n;
	for (int i = 1; i <= n; i++) std::cin >> a[i];
	for (int i = 1; i <= n; i++) std::cin >> b[i], st.insert(b[i]);
	for (int i = 1; i <= n; i++) 	
		std::cout << *std::lower_bound(b + 1, b + n + 1, a[i]) - a[i] << " ";
	std::cout << std::endl;
	for (int i = n; i >= 1; i--)
	{
		d[i] = *std::prev(st.end(), 1);
		st.erase(st.lower_bound(a[i]));
	}
	for (int i = 1; i <= n; i++)	
		std::cout << d[i] - a[i]<< " ";
	std::cout << std::endl;
}

这里用到了multiset

标签:std,Educational,Rated,int,Codeforces,mid,le,ind,st
From: https://www.cnblogs.com/kdlyh/p/17909766.html

相关文章

  • Codeforces Round 867 (Div. 3)
    CodeforcesRound867(Div.3)A:ABCD(E差一点点,最后把那种特殊情况想出来然后没写上去就结束了)A.TubeTubeFeed题意:给两个数组分别是时间和价值,要价值最大但是只能选一个思路:最开始以为是01背包,结果只选一个,一个一个枚举就行#include<bits/stdc++.h>usingnamespace......
  • Codeforces Round 855 (Div. 3)
    CodeforcesRound855(Div.3)A.IsItaCat?题意:要求:字符串必须以只包含字母"m"或"M"的非空序列开始必须紧跟由'e'或'E'字符组成的非空序列必须紧接着仅由字符'o'或'O'组成的非空序列必须紧接着是仅由字符'w'或'W'组成的非空序列思路:一个一个来(WA了三发注意这几......
  • Codeforces Round 913 (Div. 3)
    CodeforcesRound913(Div.3)A:ABCA.Rook简单题,就两个循环搞定(直接上码)#include<bits/stdc++.h>usingnamespacestd;voidsolve(){chara;intb;cin>>a>>b;for(inti=1;i<=8;i++){if(i!=b){......
  • Codeforces Round 863 (Div. 3)
    CodeforcesRound863(Div.3)A.InsertDigit题意:插入一个字母使得这个数字最大化思路:只要从前往后便利就行#include<iostream>usingnamespacestd;voidsolve(){intn,k;cin>>n>>k;boolx=true,y=false;for(inti=0;i<n;i++){......
  • Codeforces Round 913 (Div. 3)
    CF1907总结A.Rook题面翻译给出车在国际象棋棋盘中的位置,输出其可到达的坐标(不必在意顺序)。车可以横着或竖着走任意格数。分析题意明了,输出车所在行和列所有格子的序号(除车所在位置外)。code#include<bits/stdc++.h>usingnamespacestd;intt;voidsolve(){ string......
  • Codeforces Round 891 (Div3)
    CodeforcesRound891(Div.3)A.ArrayColoring这个我vp的时候写复杂了,想不到答案的思路这么清晰,将两部分分别看,将偶数加进去其奇偶性不变,只有奇数加进去才会改变奇偶性,so只有改变偶数次奇偶性才能使其奇偶性相同,所以cnt%2==0.#include<bits/stdc++.h>usingnamespacestd;......
  • Codeforces Round 816 (Div. 2) VP
    基本情況A秒了,B错一次之后也过了,C没思路。B.BeautifulArrayProblem-B-Codeforcesvoidsolve(){ longlongn,k,b,s; memset(ans,0,sizeof(ans)); std::cin>>n>>k>>b>>s; if(s<b*k){std::cout<<"-1\n";ret......
  • Codeforces Round 815 (Div. 2)
    基本情况脑子太不清楚了。A题有思路,但是各种细节问题(数论题太不熟练了),错了好几次才过。B题直接分析数据愣猜一个解,猜对了。A.BurenkaPlayswithFractionsProblem-A-Codeforces难点在分析输出\(1\)的情况。我的想法是通分,然后直接比分子是否互相整除,想法很对,但是......
  • Codeforces Round 915 (Div. 2)
    A.ConstructiveProblems看了一眼数据,猜测可能是n,m里的最大#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ inta,b; cin>>a>>b; intans=max(a,b); cout<<ans<<"\n";}intmain(){ ios::sync_with_stdio(false);cin.tie......
  • Codeforces Round 915 (Div. 2)
    CodeforcesRound915(Div.2)唉,菜狗。A-CoverinWaterintmain(){IOS;for(cin>>_;_;--_){cin>>n>>m;cout<<max(n,m)<<'\n';}return0;}B-Begginer'sZelda除......