-
L - Vases and Flowers
- HDU - 4614
-
#include<stdio.h> #define maxn 50150 int ans,st,ed,num; int t,k,n,f,q; struct node { int sum,l,r; int len() { return r-l+1; } int mid() { return (l+r)/2; } } tree[maxn*4]; void build(int root,int l,int r) { tree[root].l=l; tree[root].r=r; tree[root].sum=0; if(l==r)return; int mid=(l+r)/2; build(root*2,l,mid); build(root*2+1,mid+1,r); } void pushdown(int root) { if(tree[root].sum==0) tree[root*2].sum=tree[root*2+1].sum=0; if(tree[root].sum==tree[root].len()) { tree[root*2].sum=tree[root*2].len(); tree[root*2+1].sum=tree[root*2+1].len(); } } void pushup(int root) { tree[root].sum=tree[root*2].sum+tree[root*2+1].sum; } void put(int root,int l,int r) { if(num==0||tree[root].sum==tree[root].len()) return; if(tree[root].l==l&&tree[root].r==r&&num>=tree[root].len()&&tree[root].sum==0) { num-=tree[root].len(); tree[root].sum=tree[root].len(); if(st==-1) st=tree[root].l; ed=tree[root].r; return ; } pushdown(root); int mid=tree[root].mid(); if(r<=mid) put(root*2,l,r); else if(l>mid) put(root*2+1,l,r); else { put(root*2,l,mid); put(root*2+1,mid+1,r); } pushup(root); } void cleard(int root,int l,int r) { if(tree[root].l==l&&tree[root].r==r) { ans+=tree[root].sum; tree[root].sum=0; return; } pushdown(root); int mid=tree[root].mid(); if(r<=mid) cleard(root*2,l,r); else if(l>mid) cleard(root*2+1,l,r); else { cleard(root*2,l,mid); cleard(root*2+1,mid+1,r); } pushup(root); } int main() { scanf("%d",&t); while(t--) { scanf("%d%d",&n,&q); build(1,1,n); for(int i=0; i<q; i++) { scanf("%d",&k); if(k==1) { st=ed=-1; scanf("%d%d",&f,&num); put(1,f+1,n); if(st==-1) printf("Can not put any one.\n"); else printf("%d %d\n",st-1,ed-1); } else { ans=0; scanf("%d%d",&f,&num); cleard(1,f+1,num+1); printf("%d\n",ans); } } printf("\n"); } return 0; }
L - Vases and Flowers HDU - 4614 -线段树修改
猜你喜欢
转载自blog.csdn.net/BePosit/article/details/84023262
今日推荐
周排行