Vases and Flowers HDU
来源:互联网 发布:泽宇网络传媒有限公司 编辑:程序博客网 时间:2024/05/20 08:21
点击打开链接
这道题其实就是区间覆盖问题 不过现在有两种区间覆盖操作 区别一下即可
还有一问是要求插花时的第一个和最后一个花瓶是谁 网上都说要二分 不过我感觉下面代码中的方法比较好 是一个同学搞出来的 很好使
这道题静下心写写 调调bug也就过了
#include <stdio.h>#define N 99999999struct node{ int l; int r; int num; int laz;};struct node sum[200001];int n,val,s,e,ans;int judge(int u,int v){ if(u>v) return u; else return v;}void pushup(int cur);void pushdown(int cur);void build(int l,int r,int cur);void update1(int ll,int cur);void update2(int ll,int rr,int cur);int main(){ int t,q,op,a,b; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&q); build(0,n-1,1); while(q--) { scanf("%d%d%d",&op,&a,&b); if(op==1) { val=b,s=N,e=-1; update1(a,1); if(s==N&&e==-1) { printf("Can not put any one.\n"); } else { printf("%d %d\n",s,e); } } else { ans=0; update2(a,b,1); printf("%d\n",ans); } } printf("\n"); } return 0;}void pushup(int cur){ sum[cur].num=sum[cur*2].num+sum[cur*2+1].num; return;}void pushdown(int cur){ if(sum[cur].laz==1) { sum[cur*2].num=sum[cur*2].r-sum[cur*2].l+1; sum[cur*2].laz=1; sum[cur*2+1].num=sum[cur*2+1].r-sum[cur*2+1].l+1; sum[cur*2+1].laz=1; sum[cur].laz=0; } if(sum[cur].laz==2) { sum[cur*2].num=0; sum[cur*2].laz=2; sum[cur*2+1].num=0; sum[cur*2+1].laz=2; sum[cur].laz=0; } return;}void build(int l,int r,int cur){ int m; sum[cur].l=l; sum[cur].r=r; sum[cur].num=0; sum[cur].laz=0; if(l==r) return; m=(l+r)/2; build(l,m,cur*2); build(m+1,r,cur*2+1); return;}void update1(int ll,int cur){ if(sum[cur].r-sum[cur].l+1==sum[cur].num||val<=0) return; if(sum[cur].r<ll) return; if(sum[cur].num==0&&sum[cur].r-judge(sum[cur].l,ll)+1<=val) { if(ll<=sum[cur].l) { if(sum[cur].l<s) s=sum[cur].l; if(sum[cur].r>e) e=sum[cur].r; sum[cur].num=sum[cur].r-sum[cur].l+1; sum[cur].laz=1; val-=sum[cur].r-sum[cur].l+1; return; } } if(sum[cur].l==sum[cur].r) return; pushdown(cur); update1(ll,cur*2); update1(ll,cur*2+1); pushup(cur); return;}void update2(int ll,int rr,int cur){ if(sum[cur].l==ll&&sum[cur].r==rr) { ans+=sum[cur].num; sum[cur].num=0; sum[cur].laz=2; return; } if(sum[cur].l==sum[cur].r) return; pushdown(cur); if(rr<=sum[cur*2].r) { update2(ll,rr,cur*2); } else if(ll>=sum[cur*2+1].l) { update2(ll,rr,cur*2+1); } else { update2(ll,sum[cur*2].r,cur*2); update2(sum[cur*2+1].l,rr,cur*2+1); } pushup(cur); return;}
阅读全文
0 0
- Vases and Flowers HDU
- Vases and Flowers HDU
- Vases and Flowers HDU
- hdu 4614 Vases and Flowers
- hdu 4614 Vases and Flowers
- HDU 4614 Vases and Flowers
- hdu 4614 Vases and Flowers
- hdu 4614 Vases and Flowers
- HDU-4614-Vases and Flowers
- HDU 4614 Vases and Flowers
- HDU 4614 Vases and Flowers
- HDU 4614 Vases and Flowers
- HDU 4614 Vases and Flowers
- HDU 4614 Vases and Flowers 解题报告
- hdu 4614 Vases and Flowers 线段树
- HDU 4614(Vases and Flowers)
- hdu 4614——Vases and Flowers
- hdu 4614 Vases and Flowers 线段树
- C#对象初始化器的使用
- Google Xception Network
- LWIP学习记录之如何动态更改IP地址
- js中求数组的最大值与最小值
- 日记8/5
- Vases and Flowers HDU
- (自然语言处理)语料清单
- 网易2018校招编程题集合2
- bzoj 1485 [HNOI2009]有趣的数列 卡特兰数
- 【金陵】周总结
- CodeChef AUG17 简要题解
- 2.常用控件:ProgressBar
- android进程启动流程
- 4.在master机器上配置环境变量