Skip to content

ARC 147

赛时卡在 B 题, 光荣阵亡, rk1635th, 297 → 421, 9 Kyu → 8 Kyu

发布
篇幅
1,710 字 · 约 4 分钟
AIGC 披露
文本未使用AI生成。

A - Max Mod Min ​

Problem Statement ​

就是每一次选择序列的最大值和序列的最小值, 然后把最大值 mod 最小值的值替换最大值, 如果该值等于 0, 那么就把最大值删除.

求需要几次这种操作, 使得给定序列的元素个数为一.

Editorial ​

算法1 ​

暴力模拟 O(NX), X 是答案

算法2 ​

分析问题的单调性, 因为最大值在经过一次操作之后一定严格小于其自身的 12, 所以每个元素被选作最大值的次数最多为 O(log⁡maxA) 次, 所以答案为 O(Nlog⁡maxA).

所以, 根据单调性, 可以用一个双端队列来实现操作, 先对序列进行排序, 在进行模拟, 该做法复杂度有保证.

总复杂度为 O(X+Nlog⁡N)

Code ​
cpp
signed main(){
  	fastio();
  	int n;
  	cin>>n;
  	F(i, 0, n) cin>>a[i];
  	sort(a, a + n);
  	deque<int> q;
  	F(i, 0, n) q.push_back(a[i]);
	int ans = 0;
	while(q.size()>1){
		int t = q.front(), e = q.back();
		q.pop_back();
		int tmp = e % t;
		if(tmp != 0) {
			q.push_front(tmp);
		}
		++ ans ;
	}
	cout<<ans<<endl;
	return 0;
}

B - Swap to Sort ​

Problem Statement ​

给定一个排列, 有两种操作:

  • 操作 A: 交换 Pi 和 Pi+1.

  • 操作 B: 交换 Pi 和 Pi+2.

求一个操作序列, 使得

  • 操作 A 的个数尽可能少.
  • 最后序列为单调递增
  • 总操作数不超过105 (2≤N≤400)

Editorial ​

考虑构造一种操作策略, 使得其满足要求

最小化操作 A 的的个数 ​

首先, 由于交换间隔为1或2, 可以想到从奇偶性入手.

定义:

  • 如果 Pi 和 i 奇偶性相同, 则称 i 为好下标, 反之则为坏下标, 序列的坏下标总数记作序列的不和谐度.

操作 A 中, 序列的不和谐值变化 −2,2 或 0.

操作 B 中, 序列的不和谐值不发生变化.

所以操作 A 至少要被使用 12×初始不和谐值.

使不和谐值为 0 ​

可以发现, 要使操作 A 的个数最少, 必须要在 i 和 i+1 均为坏下标时实施操作, 要达到这点, 需要先使用操作 B 把分散的坏下标聚集起来, 再使用操作 A 进行消除.

排序 ​

由于不和谐值已经为 0, 所以只需用操作 B 进行排序即可.

分析总操作数 ​

要使坏下标聚集在一起, 最多要使用 N2×N4 次操作 B

操作 A 最多使用 N2 次

排序最多使用 (N2)2 次操作 B

所以当 N=400 时, 操作总和最多是 60200, 小于 105.

Code ​

cpp
//////////////////// Global Variables ////////////////////

constexpr int N = 500;
int n,m,i,j,a[405];
vector<pair<char,int> > v;

/////////////////////// Functions ////////////////////////

void opt(int x,int l)
{
	swap(a[x],a[x+l]);
	v.push_back(make_pair(l==1?'A':'B',x));
}

////////////////////// Main Execution ////////////////////

signed main(){
  	fastio();
  	cin>>n;
  	Fe(i, 1, n) cin>>a[i];
	Fe(i, 1, n){
		if((i&1)!=(a[i]&1)){
			int j=i+1;
			while((j&1)==(a[j]&1)) j+=2;
			while(j>i+1) opt(j-=2,2);
			opt(i,1);
		}
	}
	Fe(i, 1, n){
		Fe(j, 1, n-2){
			if(a[j]>a[j+2]) opt(j,2);
		}
	}
	cout<<(int)v.size()<<endl;
	fitr(v,it){
		cout<<it->fi<<' '<<it->se<<endl;
	}
	return 0;
}

C - Min Diff Sum ​

Problem Statement ​

N people, numbered 1,2,…,N, are going to stand on the number line. Let's denote by xi the coordinate the Person i stands at. Then, xi should be an integer satisfying Li≤xi≤Ri. Multiple people can occupy the same coordinate.

We define the dissatisfaction level as the following formula:

∑i=1N−1∑j=i+1N|xj−xi|

Find the minimum possible value of the dissatisfaction level.

Constraints ​

2≤N≤3×105

1≤Li≤Ri≤107(1≤i≤N)

讨论

正在加载评论…