线段树,做了两个多小时。我错了。 受到hdu1698 Just a Hook的启发,就开始试着解决这题。建议先做完hdu1698,再做这题。 题目大意就是说,给你M个子区间,和这个区间的效率。问你总区间的最大效率是多少。 #include <iostream> #define MAX 50000 using namespace std; struct node{ int l,r,mid,val; bool cov; }tree[MAX*4]; void build(int l,int r,int num) { tree[num].l=l; tree[num].r=r; tree[num].mid=(l+r)>>1; tree[num].val=0; tree[num].cov=0; if(l+1!=r) { int mid=tree[num].mid; build(l,mid,num<<1); build(mid,r,(num<<1)|1); } } void insert(int l,int r,int num,int val) { if(tree[num].l==l&&tree[num].r==r) { if(val>=tree[num].val) { tree[num].val=val; tree[num].cov=1; return; } } if(tree[num].cov) { if(val>tree[num].val) { tree[num].cov=0; tree[num<<1].val=tree[num].val; tree[(num<<1)|1].val=tree[num].val; tree[num<<1].cov=1; tree[(num<<1)|1].cov=1; tree[num].val=val; } else return; } else { if(val>tree[num].val) tree[num].val=val; } int mid=tree[num].mid; if(r<=mid) insert(l,r,num<<1,val); else if(l>=mid) insert(l,r,(num<<1)|1,val); else { insert(l,mid,num<<1,val); insert(mid,r,(num<<1)|1,val); } } int query(int num) { if(tree[num].cov) return (tree[num].r-tree[num].l)*tree[num].val; if(tree[num].l+1==tree[num].r) return tree[num].val; return (query(num<<1)+query((num<<1)|1)); } int main() { int n,m,l,r,val; while(scanf(" %d%d",&n,&m)!=EOF) { build(0,n,1); while(m--) { scanf(" %d%d%d",&l,&r,&val); insert(l,r,1,val); } printf("%d/n",query(1)); } return 0; }