您的位置:首页 > 其它

2017多校八 1008题 hdu 6140 Hybrid Crystals 推理

2017-08-17 21:02 519 查看

题目链接

题意

给定 n (1≤n≤103) 个非负整数,有些系数为 1 ,有些为 −1,有些可为 1 可为 −1,要求选取其中的一个子集,使得和为 k (|k|≤106).

此外,这 n 个数还满足一些特殊条件:

1. a1=1,其系数可正可负

2. ai≤∑j=1i−1aj[bj=N]+∑j=1i−1aj[bi=L∩bj=L]+∑j=1i−1aj[bi=D∩bj=D](2≤i≤n).

玄学?非也

比赛时破罐子破摔直接判断 k 在不在左右两个端点范围内,竟然就过了,然而这是为什么呢?

结论

这道题中的数能组成的数构成了一个连续区间.

证明

关注一下上面的两个条件,由条件 1,a[1] 结束后可以连续(即区间内每一个元素均可)取到的范围为 [−1,1].

不妨设处理到第 i 个元素结束时可以连续取到的范围为 [Lo,Hi], 显然有 Lo=−(∑bj=N∩j≤iaj+∑bj=Daj),Hi=∑bj=N∩j≤iaj+∑bj=Laj.

1. 假设第 i+1个元素的属性为 L,

则根据条件 2, ai≤∑ij=1aj[bj=N]+∑ij=1aj[bj=L]=Hi,即 ai≤Hi,

又[0,Hi]+ai=[ai,Hi+ai],有ai≤Hi,故 [Hi,Hi+ai]⊆[ai,Hi+ai],

原范围 ∪ 新范围即为 [Lo,Hi]∪[Hi,Hi+ai]=[Lo,Hi+ai],且连续

2. 假设第 i+1个元素的属性为 D,

与上同理

3. 假设第 i+1个元素的属性为 N,

则根据条件 2, ai≤∑ij=1aj[bj=N]≤Hi,ai≤∑ij=1aj[bj=N]≤−Lo, 亦与上同理.

由数学归纳法得:这道题中的数能组成的数构成了一个连续区间.

所以上面的玄学做法(大雾)就是有理有据的了

Code

#include <bits/stdc++.h>
#define maxn 1010
#define maxl 2000010
typedef long long LL;
const LL mod = 1e9 + 7;
inline int max(int a, int b) { return a > b ? a : b; }
inline int min(int a, int b) { return a < b ? a : b; }
int a[maxn], id[maxn]; char c;
bool dp[maxl];
void work() {
memset(dp, 0, sizeof(dp));
int n, k;
scanf("%d%d", &n, &k);
for (int i = 0; i < n; ++i) scanf("%d", &a[i]);
scanf("\n%c", &c);
int netu = a[0], nega = 0, posi = 0;
for (int i = 1; i < n; ++i) {
scanf(" %c", &c);
if (c == 'L') posi += a[i];
else if (c == 'D') nega -= a[i];
else netu += a[i];
}
int le = nega - netu, ri = posi + netu;
if (k < le || k > ri) {
printf("no\n");
return;
}
printf("yes\n");
}
int main() {
int T;
scanf("%d", &T);
while (T--) work();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: