HDU 4614(Vases and Flowers)
来源:互联网 发布:直播程序源码 编辑:程序博客网 时间:2024/05/09 02:45
题意:今天多校的一道题,给出一排连续的花盆,有两个操作,第一个操作是从x位置开始放d朵花到花盆里,输出放第一朵花和最后一朵花的位置,如果一朵花也不能放另外输出第二个操作是将区间[l,r]里的花扔掉,并输出扔掉多少朵花;
思路:简单的线段树加二分,线段树需要实现的功能是区间替换和区间求和,然后对于第一个操作,每次二分出放第一朵花的位置和最后一朵花的位置。就是这么简单的一道题,比赛时思路都有了,就是实现的时候有问题,出现各种小错误,最后还是没过,郁闷!好吧,暂时归结为实力不足和太累了吧- -!
#include <cstdio>#include <iostream>#include <algorithm>#define lson(idx) (idx << 1)#define rson(idx) ((idx << 1) | 1)using namespace std;const int N = 100010;int n, T;struct segTree{ int lc, rc, val, sum, flag; int len(){ return rc - lc + 1; }}arr[N * 4];void build(int idx, int l, int r){ arr[idx].lc = l, arr[idx].rc = r; arr[idx].val = 1, arr[idx].sum = arr[idx].len(); arr[idx].flag = 0; if(l == r) return ; int mid = (l + r) >> 1; build(lson(idx), l, mid); build(rson(idx), mid + 1, r); }void pushDown(int idx){if(arr[idx].flag){ arr[lson(idx)].val = arr[idx].val; arr[rson(idx)].val = arr[idx].val;arr[lson(idx)].sum = arr[idx].val?arr[lson(idx)].len():0;arr[rson(idx)].sum = arr[idx].val?arr[rson(idx)].len():0;arr[lson(idx)].flag = arr[rson(idx)].flag = 1; arr[idx].flag = 0;}}void update(int idx, int l, int r, int setv){ if(arr[idx].lc > r || arr[idx].rc < l) return ; if(arr[idx].lc >= l&&arr[idx].rc <= r){ arr[idx].val = setv; arr[idx].sum = setv?arr[idx].len():0; arr[idx].flag = 1; return ; } pushDown(idx); update(lson(idx), l, r, setv); update(rson(idx), l, r, setv); arr[idx].sum = arr[lson(idx)].sum + arr[rson(idx)].sum;}int query(int idx, int l, int r){ if(arr[idx].lc > r || l > arr[idx].rc) return 0; if(arr[idx].lc >= l && arr[idx].rc <= r) return arr[idx].sum;pushDown(idx);return query(lson(idx), l, r) + query(rson(idx), l, r);}int BSearch(int l, int r, int val){while(l < r){int mid = (l + r) >> 1;int sum = query(1, 1, mid);if(sum < val)l = mid + 1;elser = mid;}return l;}int main(){ cin >> T; while(T--){ int i, l, r, q, val, ord; cin >> n >> q; build(1, 1, n); while(q--){ scanf("%d%d%d", &ord, &l, &r); l++; if(ord == 1){ int s = query(1, l, n); if(s == 0){ printf("Can not put any one.\n"); continue; } if(s < r) r = s; int t = query(1, 1, l - 1); int last = BSearch(1, n, t + r); int fir = BSearch(1, n, t + 1); printf("%d %d\n", fir - 1, last - 1); update(1, fir, last, 0); } else { r++; int t = query(1, l, r); printf("%d\n", r - l + 1 - t);update(1, l, r, 1); } } printf("\n"); } return 0;}
- 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
- Vases and Flowers HDU
- Vases and Flowers HDU
- Vases and Flowers HDU
- hdu 4614 Vases and Flowers(线段树)
- HDU 4614 Vases and Flowers(线段树)#by zh
- hdu 4614 Vases and Flowers (二分 线段树)
- 【HDU-4614】Vases and Flowers(线段树双查询)
- WebView打不开百度音乐(网页)
- sql分页需注意!(主键id)
- 自考工作分析之工作分析的系统方法
- 一起学WF3.5【2】
- VIM插件之lookupfile插件
- HDU 4614(Vases and Flowers)
- Erlang User Conference 2010见闻(兼谈程序员职业生涯)
- javaScript或jQuery操作CSS无效 排错顺序[解决方案]
- EffectiveJava 第2条 :遇到多个构造器参数时要考虑用构建器(2)
- Tsql学习开始
- 黑马程序员——关于注解
- WebView使用
- 火影忍者经典台词
- [android] android framework中的 PhoneNumberUtils 类详解