博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF822C Hacker, pack your bags!(思维)
阅读量:4684 次
发布时间:2019-06-09

本文共 1509 字,大约阅读时间需要 5 分钟。

Hacker, pack your bags

【题目链接】

&题意:

有n条线段(n<=2e5) 每条线段有左端点li,右端点ri,价值cost(1 <= li <= ri <= 2e5, cost <= 1e9)

对于一个给定的x(x <= 2e5),寻找两个不相交的线段,使它们的长度和恰好为x,并且价值和最小

&题解:

只有2个线段,并且他们的和是定值x.但是还有另外一个条件,他们的区间不相交,这个我们可以通过排序左端点l来实现,当我们排序完l,那么任意一个r在这个l之前的都可以与这条线段相组合,那么可以设一个mi[i]:表示线段长度为i时的最小花费,mi[i]可以通过r是否在这个l之前来更新.

&代码:

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define ll long long#define fo(i,a,b) for(int i=(a);i<=(b);i++)#define fd(i,a,b) for(int i=(a);i>=(b);i--)#define cle(a,v) memset(a,(v),sizeof(a))const int maxn = 2e5 + 7, inf = 2e9 + 9;int n, x, cnt, mi[maxn];struct Gro { int a, b, co, dur, sta;} a[maxn << 1];bool cmp (Gro a, Gro b) { return a.a < b.a || a.a == b.a && a.sta > b.sta;}int main() { freopen("E:1.in", "r", stdin); cle(mi, -1); scanf("%d%d", &n, &x); fo(i, 0, n - 1) { int x, y, z; scanf("%d%d%d", &x, &y, &z); a[cnt++] = Gro{x, y, z, y - x + 1, 1}; a[cnt++] = Gro{y, x, z, y - x + 1, -1}; } sort(a, a + cnt, cmp); int ans = inf; fo(i, 0, cnt - 1) { // printf("%d %d %d \n", a[i].a, a[i].b, a[i].dur); if(a[i].sta == 1) { if(a[i].dur < x && mi[x - a[i].dur] != -1) { ans = min(ans, mi[x - a[i].dur] + a[i].co); } } else { if(a[i].dur < x && (mi[a[i].dur] == -1 || mi[a[i].dur] > a[i].co)) { mi[a[i].dur] = a[i].co; } } } printf("%d\n", ans == inf ? -1 : ans); return 0;}

转载于:https://www.cnblogs.com/s1124yy/p/7140795.html

你可能感兴趣的文章
对服务器的认识
查看>>
分治法实现1-N的数字按字典序全排列组合 Java语言
查看>>
序列化 与 反序列化
查看>>
购物车
查看>>
python基础(一)
查看>>
UI设计篇·入门篇·绘制简单自定义矩形图/设置按钮按下弹起颜色变化/设置图形旋转...
查看>>
linux 使用NSF 映射远程磁盘目录
查看>>
elasticjob 当当的分布式定时任务管理
查看>>
BZOJ 3438: 小M的作物( 最小割 )
查看>>
js性能优化-事件委托(2)
查看>>
Determine File Output Location
查看>>
51NOD 1068 Bash游戏 V3
查看>>
级联。。。
查看>>
socketserver用法列子
查看>>
网站链接被微信屏蔽拦截了怎么办?VJump帮你解除屏蔽
查看>>
SVG.text基本属性
查看>>
Sublime Text3配置Node.js开发环境
查看>>
在线编辑器的原理简单示例
查看>>
MVC弹出子页面向父页面传值
查看>>
用shell定义和访问数组
查看>>