您的位置:首页 > 移动开发

UVALive - 7722 The 2016 ACM-ICPC Asia Jakarta Regional Contest L - Tale of a Happy Man dp+线段树

2017-10-22 23:51 567 查看
出的第三题。。弱渣不会dp。不会数据结构。。

这题完全靠队友,我:这可能是个背包吧。

zhenglingdalao:我用个线段树优化下dp吧。

第一发wa了,int改成long long ac nlogn过了 我:。。。。。

题意:有M件事可以选做,每件事有一个价值和一个占用的时间段,要求选择做的每件事之间时间不冲突,其余无要求。

什么都不会的渣渣瑟瑟发抖。。

附上队友代码:

#include<bits/stdc++.h>
#define UP(i,l,h) for(int i=l;i<h;i++)
#define DOWN(i,h,l) for(int i=h-1;i>=l;i--)
#define W(t) while(t)
#define MEM(a,b) memset(a,b,sizeof(a))
#define LL long long
#define int LL
#define INF 0x3f3f3f3f
#define MAXN 20010
#define eps 1e-10
#define COUT(x) cout<<x<<endl
using namespace std;
const int MXLEN=1001000;
struct Node{
int st,ed,h;
bool operator < (const Node b) const{
return st==b.st?ed<b.ed:st<b.st;
}
};
Node nodes[MAXN];
int mx[MXLEN*4];
int lt,rt,v;
void maintain(int o,int l,int r){
if(l<r){
mx[o]=max(mx[o*2],mx[o*2+1]);
}
}
void update(int o,int l,int r){
if(l==r){
mx[o]=max(mx[o],v);
}else{
int m=(l+r)/2;
if(lt<=m) update(o*2,l,m);
else update(o*2+1,m+1,r);
}
maintain(o,l,r);
}
int query(int o,int l,int r){
if(lt<=l&&rt>=r){
return mx[o];
}else{
int m=(l+r)/2;
int ans=0;
if(lt<=m) ans=max(query(o*2,l,m),ans);
if(rt>m) ans=max(query(o*2+1,m+1,r),ans);
return ans;
}
}
main(){
int t;
scanf("%lld",&t);
int ks=1;
W(t--){
MEM(mx,0);
int n,m;
scanf("%lld%lld",&n,&m);
UP(i,0,m){
int t;
scanf("%lld%lld%lld%lld",&t,&nodes[i].st,&nodes[i].ed,&nodes[i].h);
}
sort(nodes,nodes+m);
UP(i,0,m){
//            UP(j,0,nodes[i].st+1){
//                mx[nodes[i].ed]=max(mx[nodes[i].ed],mx[j]+nodes[i].h);
//            }
lt=1,rt=nodes[i].st+1;
int big=query(1,1,MXLEN);
v=big+nodes[i].h;
lt=nodes[i].ed+1;
update(1,1,MXLEN);
}
//        int ans=0;
//        UP(i,0,MXLEN) ans=max(ans,mx[i]);
lt=1,rt=MXLEN;
printf("Case #%lld: %lld\n",ks++,query(1,1,MXLEN));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm-icpc 数据结构 dp
相关文章推荐