题目大意。N个区间覆盖[T1,T2]及相应的代价S,求从区间M到E的所有覆盖的最小代价是多少。

(1 <= N <= 10,000)。(0 <= M <= E <= 86,399).

思路是DP,首先将每一个区间依照T2从小到大排序,设dp(k)为从m覆盖到k所需最小代价,则有

dp(T2[i]) = min(dp(T2[i]), {dp(j) + Si,  T1[i] - 1<=j <= T2[i]}),对于 {dp(j)
+ Si,  T1[i] - 1<=j <= T2[i]}我们能够用线段树来进行优化,所以终于复杂度为O(n*logE)。

#include <stdio.h>
#include <vector>
#include <math.h>
#include <string.h>
#include <string>
#include <iostream>
#include <queue>
#include <list>
#include <algorithm>
#include <stack>
#include <map>
#include <time.h>
using namespace std; struct T
{
int t1;
int t2;
int S;
};
#define MAXV 5000000001
long long BinTree[270000];
T cows[10001];
long long DP[86401]; template<class TYPE>
void UpdateValue(TYPE st[],int i, TYPE value, int N, bool bMin)
{
i += N - 1;
st[i] = value;
while (i > 0)
{
i = (i - 1) / 2;
if (bMin)
{
st[i] = min(st[i * 2 + 1], st[i * 2 + 2]);
}
else
st[i] = max(st[i * 2 + 1], st[i * 2 + 2]);
}
} template<class TYPE>
TYPE QueryST(TYPE st[], int a, int b, int l, int r, int k, bool bMin)
{
if (l > b || a > r)
{
return bMin ? MAXV : 0;
}
if (l >= a && b >= r)
{
return st[k];
}
else
{
TYPE value1 = QueryST(st, a, b, l, (r + l) / 2, k * 2 + 1, bMin);
TYPE value2 = QueryST(st, a, b, (r + l) / 2 + 1, r, k * 2 + 2, bMin);
if (bMin)
{
return min(value1, value2);
}
else
{
return max(value1, value2);
}
}
} int compT(const void* a1, const void* a2)
{
if (((T*)a1)->t2 - ((T*)a2)->t2 == 0)
{
return ((T*)a1)->t1 - ((T*)a2)->t1;
}
else
return ((T*)a1)->t2 - ((T*)a2)->t2;
} int main()
{
#ifdef _DEBUG
freopen("e:\\in.txt", "r", stdin);
#endif
int N, M, E;
scanf("%d %d %d", &N, &M, &E);
M++;
E++;
for (int i = 0; i < N; i++)
{
scanf("%d %d %d", &cows[i].t1, &cows[i].t2, &cows[i].S);
cows[i].t1++;
cows[i].t2++;
}
int maxe = 1;
while (maxe < E)
{
maxe *= 2;
}
for (int i = 0; i < maxe * 2;i++)
{
BinTree[i] = MAXV;
}
for (int i = 0; i <= E;i++)
{
DP[i] = MAXV;
} DP[M - 1] = 0;
UpdateValue<long long>(BinTree, M - 1, 0, maxe, true);
qsort(cows, N, sizeof(T), compT);
for (int i = 0; i < N;i++)
{
DP[cows[i].t2] = min(DP[cows[i].t2], QueryST<long long>(BinTree, cows[i].t1 - 1, cows[i].t2, 0, maxe - 1, 0, true) + cows[i].S);
UpdateValue<long long>(BinTree, cows[i].t2, DP[cows[i].t2], maxe, true);
}
if (E <= cows[N - 1].t2)
{
DP[E] = QueryST<long long>(BinTree, E, cows[N - 1].t2, 0, maxe - 1, 0, true);
} if (DP[E] >= MAXV)
{
printf("-1\n");
}
else
printf("%I64d\n", DP[E]);
return 0;
}

POJ3171 Cleaning Shifts DP,区间覆盖最值的更多相关文章

  1. Cleaning Shifts(区间覆盖)

    /* http://acm.hdu.edu.cn/webcontest/contest_showproblem.php?pid=1019&ojid=1&cid=10 题目: 给定一个时 ...

  2. poj 2376 Cleaning Shifts 最小区间覆盖

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 40751   Accepted: 9871 ...

  3. poj3171 Cleaning Shifts[DP]

    https://vjudge.net/problem/POJ-3171.(有价值的区间全覆盖问题) (lyd例题)朴素DP很好想,$f[i]$表示将右端点从小到大排序后从$L$(要求覆盖的大区间)到第 ...

  4. poj3171 Cleaning Shifts【线段树(单点修改区间查询)】【DP】

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4422   Accepted: 1482 D ...

  5. [USACO2005][POJ3171]Cleaning Shifts(DP+线段树优化)

    题目:http://poj.org/problem?id=3171 题意:给你n个区间[a,b],每个区间都有一个费用c,要你用最小的费用覆盖区间[M,E] 分析:经典的区间覆盖问题,百度可以搜到这个 ...

  6. poj 2376 Cleaning Shifts 贪心 区间问题

    <pre name="code" class="html"> Cleaning Shifts Time Limit: 1000MS   Memory ...

  7. poj3171 Cleaning Shifts

    传送门 题目大意 有一个大区间和n个小区间,每个小区间都有一个代价,求最少付出多少代价可以使得小区间完全覆盖大区间. 分析为了方便起见我们先将s变为2,其它的位置都对应更改以便后期处理.我们考虑以t1 ...

  8. poj2376 Cleaning Shifts(区间贪心,理解题意)

    https://vjudge.net/problem/POJ-2376 题意理解错了!!真是要仔细看题啊!! 看了poj的discuss才发现,如果前一头牛截止到3,那么下一头牛可以从4开始!!! # ...

  9. POJ2376 Cleaning Shifts

    题意 POJ2376 Cleaning Shifts 0x50「动态规划」例题 http://bailian.openjudge.cn/practice/2376 总时间限制: 1000ms 内存限制 ...

随机推荐

  1. Android Studio 解决unspecified on project app resolves to an APK archive which is not supported

    出现该问题unspecified on project app resolves to an APK archive which is not supported as a compilation d ...

  2. Codefroces Educational Round 26 837 D. Round Subset

    D. Round Subset time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  3. windows10系统window键失灵,没有反应

    今天键盘的的Window键(win键)按了没反应,某度一圈全是它的垃圾营销号文章,没卵用..最后在微软官方社区支持找到解决方案.也建议大家遇到系统问题到微软社区去寻求帮助,毕竟人家是专业. 解决办法 ...

  4. IOS经常使用的性能优化策略

    1.用ARC管理内存 2.对于UITableView使用重用机制 3.UIView及其子类设置opaque=true 4.主进程是用来绘制UI的,所以不要堵塞 5.慎用XIB,由于XIB创建UIVie ...

  5. 优化HTML代码的多种技巧

    怎样提升Web页面的性能,非常多开发者从多个方面来下手如JavaScript.图像优化.server配置,文件压缩或是调整CSS. 非常显然HTML 已经达到了一个瓶颈.虽然它是开发Web 界面必备的 ...

  6. 华为畅玩5 (CUN-AL00) 刷入第三方twrp Recovery 及 root

    华为畅玩5 (CUN-AL00) 刷入第三方twrp Recovery  及 root 下载地址    http://pan.baidu.com/s/1hsn6VzA 1. 在官网申请解锁码    申 ...

  7. go语言函数作为参数传递

    go语言函数作为参数传递,目前给我的感觉几乎和C/C++一致.非常的灵活. import "fmt" import "time" func goFunc1(f ...

  8. JavaScript--数据结构之队列

    5.1 队列的操作 队列是特殊的列表,只能一端入队(队尾)插入操作,一端出队(队头)删除操作.底层用数组,利用javascript数组优于其它语言的数组的方法,shift();删除第一个元素,push ...

  9. vue中类名和组件经过刷新不对应的解决办法

    方法一: 页面路由如下: index.js路由文件如下: { path: '/myOrder', name: '我的订单', menuShow: true, component: myOrder, c ...

  10. codeforces 1037E. Trips(倒叙)

    题目传送门: 解题思路: 正着搞好像有点恶心. 反着搞. 一边删一边搞,从崩坏的地方开始,入度--. 最后dfs崩坏,更新答案. 注意要把边删掉防止重复崩坏. 代码: #include<cstd ...