疯狂的bLue(拓扑序+离散化)
来源:互联网 发布:三个数最大公约数算法 编辑:程序博客网 时间:2024/06/13 13:22
疯狂的bLue
Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic
Problem Description
众所周知神秘的 ACM 实验室有一个史诗级的出题狂魔,名曰 bLue。最近 bLue 又露出了邪恶的笑,原来是 bLue 接了为校赛出题的单子。
距离校赛开始还有 N 小时,由于各种奇怪的原因出题组可以出题的时间并不固定,大致可以分为M个时间段。每个时间段可以出的题目数也可能不同。同时由于出题是个煞费心血的事情,所以每个出题时间段结束后,善良的 bLue 会让大家休息 R (1 ≤ R ≤ N ) 小时,以便为接下来的出题事业继续奋斗。
为了能为校赛准备尽可能多的题目以备不时之需,bLue 需要好好地规划好这 N 小时如何安排,当然作为唯一的长者,bLue 一下子就为大家规划好了如何安排出题的时间段。
现在 bLue 想考考你在他完美的安排下出题组最多可以出多少个题目?
Input
测试数据有多组,输入直到文件结束。
对于每组数据:
第一行输入三个数 N (1 ≤ N ≤ 1,000,000), M (1 ≤ M ≤ 1,000), R (1 ≤ R ≤ N)
接下来有 M 行输入,每一行输入三个数 Si (0 ≤ Si < N), Ei (Si < Ei ≤ N) ,Vi (1 ≤ Vi ≤ 1,000,000) (0 < i <= M),分别表示为第 i 个时间段的开始时间,第 i 段的结束时间,第 i 个时间段可以出的题目数
Output
对于每组数据,输出出题组最多可以出的题的数目。
Example Input
15 5 3
1 4 5
6 9 4
3 5 2
7 10 8
11 15 2
Example Output
13
Hint
假设出题组在第 5 小时出完了一个时间段的题,他们需要休息 3 小时 (R = 3),那么他们在第 8 小时又可以继续开始出题了。
代码:
#include<bits/stdc++.h>#define ll long longusing namespace std;const int N=2e4+10;const int mod=1e7+9;int read(){ int x=0;char ch = getchar(); while('0'>ch||ch>'9')ch=getchar(); while('0'<=ch&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();} return x;}struct node{ int l,r,w;}a[1100];vector<int>p;inline int getid(int x){ return lower_bound(p.begin(),p.end(),x)-p.begin()+1;}int n,m,k,sz;int head[N*40];int der[N];int dis[N];struct nod{ int to,next,w;}edge[N*40];int cnt;inline void add(int f,int to,int w){ der[to]++; edge[cnt].to=to; edge[cnt].w=w; edge[cnt].next=head[f]; head[f]=cnt++;}void init(){ memset(head,-1,sizeof(head)); cnt=0; memset(der,0,sizeof(der)); p.clear();}void solve(){ queue<int>q; memset(dis,0,sizeof(dis)); for(int i=1;i<=sz;i++) { if(der[i]==0) q.push(i); } int ans=0; while(!q.empty()) { int u=q.front(); q.pop(); for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].to; int w=edge[i].w; if(dis[v]<dis[u]+w) { dis[v]=dis[u]+w; ans=max(ans,dis[v]); } der[v]--; if(der[v]==0) q.push(v); } } printf("%d\n",ans);}int main(){ while(~scanf("%d%d%d",&n,&m,&k)) { init(); for(int i=1;i<=m;i++) { a[i].l=read(); a[i].r=read(); a[i].w=read(); p.push_back(a[i].l); p.push_back(a[i].r); p.push_back(a[i].r+k); } sort(p.begin(),p.end()),p.erase(unique(p.begin(),p.end()),p.end()); sz=p.size(); for(int i=1;i<=sz;i++) add(i,i+1,0); for(int i=1;i<=m;i++) { add(getid(a[i].l),getid(a[i].r+k),a[i].w); } solve(); }}
- 疯狂的bLue(拓扑序+离散化)
- 疯狂的bLue
- SDUT 3924 疯狂的bLue
- 疯狂的bLue(dp)
- 【简单的线性DP】SDUT 3924 疯狂的bLue
- “师创杯”SDUT-ACM校赛热身赛-疯狂的bLue
- “师创杯”山东理工大学第九届ACM程序设计竞赛 热身赛 D.疯狂的bLue【思维+DAG图上的最短路】
- 《疯狂的程序员》序
- 数据的离散化
- 数据的离散化
- 数据的离散化
- 数据的离散化
- 数据的离散化
- 数据的离散化
- 数据的离散化
- 序列的 离散化
- 离散化的操作
- 坐标的离散化
- Python高级编程--迭代器
- 洛谷 P2055 假期的宿舍
- select标签使用
- 字符串
- CentOS源码编译更换gcc版本
- 疯狂的bLue(拓扑序+离散化)
- Java菜鸟成长之路__Day_1_Java概述及基础语法
- Balsamiq Mockups原型工具使用心得
- 56-58_数组_StringBuilder和StringBuffer_常用方法_方法链的实现_JDK源码分析_常见面试题
- wxPython:对话框、光标、字符串、位图
- Qt自定义Combobox实现列表上拉展示
- 【Python那些事儿】用图表分析单变量数据
- Unity3d学习笔记 Button添加事件
- iText设置首行缩进