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;
}

浙公网安备 33010602011771号