CF1413C Perform Easily

CF1413C Perform Easily - 洛谷

双指针好题,思路也比较巧(感觉双指针很多题都是这么搞的)

由于只有 \(6\) 根弦,所以可以考虑把所有品位求一下,和音符编号一起存在结构体里,然后按品位大小排序,最后双指针,在所有编号都存在时更新答案即可,时间复杂度瓶颈在排序。

#include<bits/stdc++.h>
#define F(i,l,r) for(int i(l); i <= (r); ++ i)
#define G(i,r,l) for(int i(r); i >= (l); -- i)
using namespace std;
using ll = long long;
const int N = 2e5;
const int MAXN = 1e9 + 10;
struct node{
	int v, id;
	bool operator < (const node &other)const{
		return  v < other.v;
	}
}c[N * 5];
int a[20], b[N], t[N];
int n, m = 0; 
void Main(){
	F(i, 1, 6) cin >> a[i];
	cin >> n;
	F(i, 1, n){
		cin >> b[i];
		F(j, 1, 6){
			c[++ m] = (node){b[i] - a[j], i};
		}
	}
	sort(c + 1, c + m + 1); 
	int r = 1, num = 0, ans = MAXN;
//	F(i, 1, m){
//		printf("v = %d\tid = %d\n", c[i].v, c[i].id);
//	} 
//	printf("\n");
	F(i, 1, m){
		if(i > 1){
			if(t[c[i - 1].id] == 1){
				-- num;
			}
			-- t[c[i - 1].id];
		}
		while(r <= m && num < n){
			if(t[c[r].id] == 0){
				++ num;
			}
			++ t[c[r].id];
			++ r;// unadded yet
		}
		if(num == n) {
			ans = min(ans, c[r - 1].v - c[i].v);
		}
//		printf("r = %d\tnum = %d\t", r, num);
//		F(j, 1, n){
//			printf("%d\t", t[j]);
//		} 
//		printf("\n");
	} 	
	cout << ans << '\n';
	return ;
}
signed main(){
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int T = 1;
	while(T --) Main(); 
	return fflush(0), 0;
}
posted @ 2026-09-01 20:38  superl61  阅读(6)  评论(0)    收藏  举报