传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=313
试题描述:
WZJ的公司放假了!为了保证假期期间公司的安全,WZJ决定雇佣一些人来看守公司。有M个大学生来应聘,他们想要的工资是Ci元,可以为WZJ从第Si天到Ti天看守公司。WZJ是个决定在花钱前提下雇佣一些人,使得从第1天到第N天都至少有一个人看守公司,你能帮帮他吗(若无解输出"No Answer.")?
输入:
第一行为两个正整数N,M。
第二行至第M+1行第i+1行为3个正整数Si、Ti、Ci。
输出:
输出WZJ最少花的钱数(若无解输出"No Answer.")。
输入示例:
5 4
1 2 3
2 4 1
4 5 2
1 5 8
输出示例:
6
其他说明:
1<=N,M<=100000
1<=Si<=Ti<=N
1<=Ci<=2000
线段树练习题
题解:先想到将每一天抽象成点,来一个(L,R)的人就添一条边L->R+1权值为工资,然后跑一遍最短路貌似就搞定了
---------当然没搞定了啊,比如你让(1,6),(4,8)情何以堪啊,所以先搞一下所有的(i,i-1)权值为0的边就好了.
当然了,此题本来就是要用线段树瞎搞一个背包动规……
最短路:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=+,INF=-1u>>;
struct Tedge{int x,y,w,next;}adj[maxn*];int fch[maxn],ms=;
void AddEdge(int u,int v,int w){
adj[++ms]=(Tedge){u,v,w,fch[u]};fch[u]=ms;return;
}
bool vis[maxn];int dist[maxn],n,m;
void SPFA(){
queue<int>Q;memset(vis,false,sizeof(vis));
for(int i=;i<=n+;i++)dist[i]=INF;dist[]=;
Q.push();vis[]=true;
while(!Q.empty()){
int u=Q.front();Q.pop();vis[u]=false;
for(int i=fch[u];i;i=adj[i].next){
int v=adj[i].y;
if(dist[v]>dist[u]+adj[i].w){
dist[v]=dist[u]+adj[i].w;
if(!vis[v]) vis[v]=true,Q.push(v);
}
}
} return ;
}
inline int read(){
int x=,sig=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') sig=-;ch=getchar();}
while(isdigit(ch)) x=*x+ch-'',ch=getchar();
return x*=sig;
}
inline void write(int x){
if(x==){putchar('');return;}if(x<) putchar('-'),x=-x;
int len=,buf[];while(x) buf[len++]=x%,x/=;
for(int i=len-;i>=;i--) putchar(buf[i]+'');return;
}
void init(){
n=read();m=read();int a,b,c;
for(int i=n+;i>;i--) AddEdge(i,i-,);
for(int i=;i<=m;i++){
a=read();b=read();c=read();
AddEdge(a,b+,c);//printf("-AddEdge-%d %d %d\n",k,j,c);
} return;
}
void work(){
SPFA();
//for(int i=1;i<=ms;i++)printf("-Edge- %d to %d is %d\n",adj[i].x,adj[i].y,adj[i].w);
//for(int i=1;i<=n+1;i++) printf("dist[%d]=%d\n",i,dist[i]);
return;
}
void print(){
if(dist[n+]>=INF) puts("No Answer.");
else write(dist[n+]),putchar('\n');
return;
}
int main(){
init();work();print();return ;
}
/*
5 3
1 2 3
1 1 5
3 5 6
*/
线段树:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
const int INF=;
int first[maxn],next[maxn],s[maxn],v[maxn],f[maxn];
int minv[maxn*],ql,qr,x,val;
void update(int o,int L,int R)
{
if(L==R) minv[o]=val;
else
{
int M=L+R>>,lc=o<<,rc=lc|;
if(x<=M) update(lc,L,M);
else update(rc,M+,R);
minv[o]=min(minv[lc],minv[rc]);
}
}
int query(int o,int L,int R)
{
if(ql<=L&&R<=qr) return minv[o];
int M=L+R>>,ans=INF,lc=o<<,rc=lc|;
if(ql<=M) ans=min(ans,query(lc,L,M));
if(qr>M) ans=min(ans,query(rc,M+,R));
return ans;
}
int main()
{
int n,m,a,b,c;
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
s[i]=a; v[i]=c;
next[i]=first[b];
first[b]=i;
}
for(int i=;i<=n*;i++) minv[i]=INF;
update(,,n);
for(int i=;i<=n;i++)
{
f[i]=INF;
for(int j=first[i];j;j=next[j])
{
ql=s[j]-;qr=i-;
f[i]=min(f[i],v[j]+query(,,n));
}
x=i; val=f[i];
if(val!=INF) update(,,n);
}
if(f[n]==INF) puts("No Answer.");
else printf("%d\n",f[n]);
return ;
}
COJ 0343 WZJ的公司(二)的更多相关文章
-
COJ 0346 WZJ的旅行(二)更新动态树分治版本
WZJ的旅行(二) 难度级别:D: 运行时间限制:3000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 时隔多日,WZJ又来到了幻想国旅行.幻想国由N个城市组成,由 ...
-
COJ 0979 WZJ的数据结构(负二十一)
WZJ的数据结构(负二十一) 难度级别:C: 运行时间限制:5000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你实现一个数据结构,完成这样的功能: 给你一个 ...
-
COJ 1002 WZJ的数据结构(二)(splay模板)
我的LCC,LCT,Splay格式终于统一起来了... 另外..这个形式的Splay是标准的Splay(怎么鉴别呢?看Splay函数是否只传了一个变量node就行),刘汝佳小白书的Splay写的真是不 ...
-
COJ 0967 WZJ的数据结构(负三十三)
WZJ的数据结构(负三十三) 难度级别:E: 运行时间限制:7000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大 ...
-
COJ 0970 WZJ的数据结构(负三十)树分治
WZJ的数据结构(负三十) 难度级别:D: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,点和边上均有权值.请你设计 ...
-
COJ 0349 WZJ的旅行(五)
WZJ的旅行(五) 难度级别:E: 运行时间限制:3000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 WZJ又要去旅行了T^T=0.幻想国由N个城市组成,由于道 ...
-
COJ 0601&;0602 动态规划(二)及加强
未加强传送门0601:http://oj.cnuschool.org.cn/oj/home/addSolution.htm?problemID=571 加强传送门0602:http://oj.cnus ...
-
COJ 0990 WZJ的数据结构(负十)
WZJ的数据结构(负十) 难度级别:D: 运行时间限制:5000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 给你一个N个节点的有根树,从1到N编号,根节点为1并给 ...
-
COJ 1008 WZJ的数据结构(八) 树上操作
传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=986 WZJ的数据结构(八) 难度级别:E: 运行时间限制:3000ms: ...
随机推荐
-
js类型转化
1. == 是会进行类型转换再进行判断的. true是转换成1,false是转换成0 然后再进行判断 == true false == true true === false false == fal ...
-
js实现页面的自动读秒跳转
<!-- 代码片段A --> <!-- 倒计时跳转 --> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Trans ...
-
VB6 GDI+ 入门教程[6] 图片
http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[6] 图片 2009 年 6 月 19 日 15条评论 ...
-
Android布局文件layout.xml的一些属性值
第一类:属性值 true或者 false android:layout_centerHrizontal 水平居中 android:layout_centerVertical 垂直居中 andr ...
-
PagerAdapter的notifyDataSetChanged无效解决方法
在Adapter中复写该方法: @Override public int getItemPosition(Object object) { return POSITION_NONE; } 即可~~
-
c#重载和重写及运用
重载的条件: 1.必须在同一个类中2.方法名必须相同3.参数列表不能相同. 重写的条件: 1. 在不同的类中 2. 发生方法重写的两个方法 ...
-
NodeJS用递归实现异步操作的链式调用,完成一个简易的命令行输入输出REPL交互接口
REPL —— Read-Eval-Print-Loop. 00.一门好的编程语言的必要条件 REPL并不是什么高大上的东西,简单的说就是一个从命令行程序,读取终端输入,处理,打印结果,如此循环.这是 ...
-
php开启curl和openssl
php开启curl和openssl 开启php curl函数库的步骤 1).去掉windows/php.ini 文件里;extension=php_curl.dll前面的; /*用 echo phpi ...
-
Linux搭建禅道
1.开源版安装包下载(64位的下载64位,32位的选中32位) [root@iZbp~]# wget http://dl.cnezsoft.com/zentao/9.0.1/ZenTaoPMS.9.0 ...
-
echarts故障统计多维柱状图 堆叠柱状图 柱状图Demo2
黑底:echarts链接:http://gallery.echartsjs.com/editor.html?c=xnP8JPeu4R option = { backgroundColor: 'blac ...