Light OJ 1084 线段树+dp or(单调队列+dp) 水题
2013-06-12 18:03
288 查看
2B错误,线段树开了2倍空间, 检查到死,改成4倍空间直接AC,太伤了,线段树太弱了。
线段树:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define Mid int m = (l+r) >> 1;
const int maxn = 100005;
const int inf = 1e9;
int n, k;
int a[maxn];
int dp[maxn];
struct segtree {
int sum[maxn<<2];
void pushUp(int rt) {
sum[rt] = min(sum[rt<<1], sum[rt<<1|1]);
}
void build(int l = 0, int r = n, int rt = 1) {
sum[rt] = inf;
if(l == r) {
if(l == 0) sum[rt] = 0;
return;
}
Mid;
build(lson);
build(rson);
pushUp(rt);
}
void insert(int p, int v, int l = 0, int r = n, int rt = 1) {
if(l == r) {
sum[rt] = min(sum[rt], v);
return;
}
Mid;
if(p <= m) insert(p, v, lson);
else insert(p, v, rson);
pushUp(rt);
}
int query(int L, int R, int l = 0, int r = n, int rt = 1) {
if(L <= l && r <= R)
return sum[rt];
Mid;
int ret = inf;
if(L <= m) ret = min(ret, query(L, R, lson));
if(R > m) ret = min(ret, query(L, R, rson));
return ret;
}
void print(int l = 0, int r = n, int rt = 1) {
if(l ==r) {
printf("%d ", sum[rt]);
return;
}
Mid;
print(lson);
print(rson);
}
}T;
int main() {
// freopen("int.txt", "r", stdin);
int i, j, d, cas;
scanf("%d", &cas);
for(int ca = 1; ca <= cas; ca++) {
scanf("%d%d", &n, &k);
for(i = 1; i <= n; i++) {
scanf("%d", &a[i]);
dp[i] = inf;
}
T.build();
dp[0] = 0;
sort(a+1, a+n+1);
for(i = 1; i <= n; i++) {
j = lower_bound(a+1, a+i+1, a[i]-(k<<1))-a;
//printf("i = %d j = %d\n", i, j);
if(i-j+1 >= 3) {
// puts("YES");
dp[i] = min(dp[i], T.query(j-1, i-3) + 1);
T.insert(i, dp[i]);
}
}
if(dp
>= inf) dp
= -1;
printf("Case %d: %d\n", ca, dp
);
}
return 0;
}
单调队列:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define Mid int m = (l+r) >> 1;
const int maxn = 100005;
const int inf = 1e9;
int n, k;
int a[maxn];
int dp[maxn];
int Q[maxn];
int main() {
// freopen("int.txt", "r", stdin);
int i, j, d, cas;
scanf("%d", &cas);
for(int ca = 1; ca <= cas; ca++) {
scanf("%d%d", &n, &k);
for(i = 1; i <= n; i++) {
scanf("%d", &a[i]);
dp[i] = -1;
}
sort(a+1, a+n+1);
dp[0] = 0;
int len = k<<1;
int s = 0, e = 0;
for(i = 1; i <= n; i++) {
int t = i-3;
if(t >= 0 && ~dp[t]) {
while(s < e && dp[Q[e-1]] > dp[t]) e--;
Q[e++] = t;
}
while(s < e && a[Q[s]+1] + len < a[i]) s++;
if(s != e) dp[i] = dp[Q[s]]+1;
}
printf("Case %d: %d\n", ca, dp
);
}
return 0;
}
线段树:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define Mid int m = (l+r) >> 1;
const int maxn = 100005;
const int inf = 1e9;
int n, k;
int a[maxn];
int dp[maxn];
struct segtree {
int sum[maxn<<2];
void pushUp(int rt) {
sum[rt] = min(sum[rt<<1], sum[rt<<1|1]);
}
void build(int l = 0, int r = n, int rt = 1) {
sum[rt] = inf;
if(l == r) {
if(l == 0) sum[rt] = 0;
return;
}
Mid;
build(lson);
build(rson);
pushUp(rt);
}
void insert(int p, int v, int l = 0, int r = n, int rt = 1) {
if(l == r) {
sum[rt] = min(sum[rt], v);
return;
}
Mid;
if(p <= m) insert(p, v, lson);
else insert(p, v, rson);
pushUp(rt);
}
int query(int L, int R, int l = 0, int r = n, int rt = 1) {
if(L <= l && r <= R)
return sum[rt];
Mid;
int ret = inf;
if(L <= m) ret = min(ret, query(L, R, lson));
if(R > m) ret = min(ret, query(L, R, rson));
return ret;
}
void print(int l = 0, int r = n, int rt = 1) {
if(l ==r) {
printf("%d ", sum[rt]);
return;
}
Mid;
print(lson);
print(rson);
}
}T;
int main() {
// freopen("int.txt", "r", stdin);
int i, j, d, cas;
scanf("%d", &cas);
for(int ca = 1; ca <= cas; ca++) {
scanf("%d%d", &n, &k);
for(i = 1; i <= n; i++) {
scanf("%d", &a[i]);
dp[i] = inf;
}
T.build();
dp[0] = 0;
sort(a+1, a+n+1);
for(i = 1; i <= n; i++) {
j = lower_bound(a+1, a+i+1, a[i]-(k<<1))-a;
//printf("i = %d j = %d\n", i, j);
if(i-j+1 >= 3) {
// puts("YES");
dp[i] = min(dp[i], T.query(j-1, i-3) + 1);
T.insert(i, dp[i]);
}
}
if(dp
>= inf) dp
= -1;
printf("Case %d: %d\n", ca, dp
);
}
return 0;
}
单调队列:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define Mid int m = (l+r) >> 1;
const int maxn = 100005;
const int inf = 1e9;
int n, k;
int a[maxn];
int dp[maxn];
int Q[maxn];
int main() {
// freopen("int.txt", "r", stdin);
int i, j, d, cas;
scanf("%d", &cas);
for(int ca = 1; ca <= cas; ca++) {
scanf("%d%d", &n, &k);
for(i = 1; i <= n; i++) {
scanf("%d", &a[i]);
dp[i] = -1;
}
sort(a+1, a+n+1);
dp[0] = 0;
int len = k<<1;
int s = 0, e = 0;
for(i = 1; i <= n; i++) {
int t = i-3;
if(t >= 0 && ~dp[t]) {
while(s < e && dp[Q[e-1]] > dp[t]) e--;
Q[e++] = t;
}
while(s < e && a[Q[s]+1] + len < a[i]) s++;
if(s != e) dp[i] = dp[Q[s]]+1;
}
printf("Case %d: %d\n", ca, dp
);
}
return 0;
}
相关文章推荐
- bzoj1499[NOI2005]瑰丽华尔兹 单调队列优化dp
- NOIP模拟赛 军训(二分答案+单调队列优化DP)
- BZOJ 1911 [Apio2010]特别行动队(单调队列优化DP)
- poj 3017 Cut the Sequence(dp单调队列优化)
- 线段树和单调队列优化DP---POJ2373解题报告
- Vijos 1243 生产产品[单调队列优化dp]
- HDU3401 Trade(单调队列优化DP)
- BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP
- 单调队列 优化 min/max(dp)+g类型dp
- hdu 4374 One hundred layer 单调队列优化dp
- Vijos 1243 初探单调队列优化DP
- bzoj 3126: [Usaco2013 Open]Photo (DP+单调队列)
- hdu4374 单调队列优化dp
- [BZOJ 1855][SCOI 2010]股票交易(单调队列优化DP)
- Codeforces Round #189 (Div. 2) D. Psychos in a Line 单调队列dp
- 【codevs4654】【BZOJ2442】修剪草坪,第一次的单调队列,优化DP
- [BZOJ1855][Scoi2010]股票交易(DP+单调队列优化)
- HDU 3401 DP+单调队列
- NYOJ-258/POJ-2559/HDU-1506 Largest Rectangle in a Histogram,最大长方形,dp或者单调队列!
- tyvj1305 最大子序和 【单调队列优化dp】