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;}



原创粉丝点击