生活随笔
收集整理的這篇文章主要介紹了
CF1413C Perform Easily(two pointers)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
解析
巧奪天工
可以說是把two pointers玩明白了
把所有的可能減出來的結果升序排列一下
然后一個選取區間合法當且僅當這個區間含有1-n所有數的至少一個可能的差
然后就可以two pointers了
#include<bits/stdc++.h>
const int N
=2e5+100;
const int mod
=1e9+7;
#define ll long long
using namespace std
;
inline ll
read() {ll
x(0),f(1);char c
=getchar();while(!isdigit(c
)) {if(c
=='-')f
=-1;c
=getchar();}while(isdigit(c
)) {x
=(x
<<1)+(x
<<3)+c
-'0';c
=getchar();}return x
*f
;
}int n
,m
;
int a
[8],b
[N
],tot
;
struct node {int val
,id
;
} p
[N
*6];
bool cmp(node a
,node b
){return a
.val
<b
.val
;
}
int num
[N
],now
;
inline void add(int pl
){now
+=++num
[p
[pl
].id
]==1;
}
int main() {for(int i
=1; i
<=6; i
++) a
[i
]=read();sort(a
+1,a
+1+6);n
=read();for(int i
=1; i
<=n
; i
++) b
[i
]=read();for(int i
=1; i
<=n
; i
++) {for(int j
=1; j
<=6; j
++) {p
[++tot
]=(node
){b
[i
]-a
[j
],i
};}}sort(p
+1,p
+1+tot
,cmp
);int l
=1,r
=0,ans
=2e9;while(1){while(now
!=n
&&r
<=tot
){now
+=++num
[p
[++r
].id
]==1;}if(r
>tot
) break;ans
=min(ans
,p
[r
].val
-p
[l
].val
);now
-=--num
[p
[l
++].id
]==0;}printf("%d\n",ans
);
}
總結
以上是生活随笔為你收集整理的CF1413C Perform Easily(two pointers)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。