训练日记2019.10.13 告别喧嚣

2019.10.13 星期日
今天效率还行,自己早上8点多起来,10点学到下午三点,比完厨艺大赛又4点,继续到现在。今天ac了一道题,线段树,自己本来要打的codeforces,然而发现并没有时间去打了,那个时候我在考试,下一周吧,div2不急嘛。

最近明显感觉力不从心了,简单题刷完了,自己现在正在向最硬核的内容发起攻击,坚持住。不过自己还是想早一点放假啊,自己现在就剩这么一个念头了,其他根本提不起兴趣,再接再厉吧咱,一口气把事情干完,感恩节回来开心地玩不好么?我这个人一累就喜欢买吃的,就算不吃,自己看着也非常开心,宿舍里现在各类饮料和小食品堆积成山,估计我的哈密瓜味维他豆奶到散学典礼前是喝不完了5555,加油吧小田!对了,控制体重啊,别一吃起来就没完,到北京回去再吃,好吧? 我不想假期减肥啊。

今天这个线段树和二分,讲真,这么长时间脑子愚钝了,真没往二分上去想,后来看到区间有序,才开始考虑是不是,真的不应该啊,好吧就到这里了,我回去了。
题目: HDU4614 Vases and Flowers(传送门)
代码:

#include <bits/stdc++.h>
using namespace std;
#define limit 1000000 + 5//防止溢出
#define INF 0x3f3f3f3f
#define lowbit(i) i&(-i)//一步两步
#define EPS 1e-6
#define ff(a) printf("%d\n",a );
#define MOD 1e9 + 7
typedef long long ll;
void read(int &x){
    char ch = getchar();x = 0;
    for (; ch < '0' || ch > '9'; ch = getchar());
    for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
}//快读
struct Node{
    int L, R, inc, sum;
    int mid(){
        return L + (R - L) / 2;
    }
}tree[limit];
void pushdown(int root){
    if(tree[root].inc != -1) {
        tree[root * 2 + 1].inc = tree[root].inc;
        tree[root * 2 + 2].inc = tree[root].inc;
        tree[root * 2 + 1].sum = (tree[root * 2 + 1].R - tree[root * 2 + 1].L + 1) * tree[root * 2 + 1].inc;
        tree[root * 2 + 2].sum = (tree[root * 2 + 2].R - tree[root * 2 + 2].L + 1) * tree[root * 2 + 2].inc;
        tree[root].inc = -1;//主要是为了兼容正数增量和负数增量
    }
}
void build(int root ,int L, int R){
    tree[root].L = L;
    tree[root].R = R;
    tree[root].inc = -1;
    tree[root].sum = R - L + 1;//区间空花瓶
    int mid = tree[root].mid();
    if(L != R){
        build(root * 2 + 1, L ,mid);
        build(root * 2 + 2, mid + 1, R);
    }
}
void update(int root ,int vs ,int ve ,int val){
    if(tree[root].L == vs && tree[root].R == ve){
        tree[root].inc = val;
        tree[root].sum = (ve - vs + 1) * val;
        return;//结束,向上归回去
    }
    int mid = tree[root].mid();
    pushdown(root);
    if(ve <= mid){
        update(root * 2 + 1, vs ,ve ,val);//递归更新
    }else if(vs > mid){
        update(root * 2 + 2, vs ,ve ,val);
    }else{
        update(root * 2 + 1, vs ,mid ,val);
        update(root * 2 + 2, mid + 1, ve , val);
    }
    tree[root].sum = tree[root * 2 + 1].sum + tree[root * 2 + 2].sum;
}
int query(int root ,int vs, int ve){
    if(tree[root].L == vs && tree[root].R == ve){
        return tree[root].sum;
    }
    pushdown(root);
    int mid = tree[root].mid();
    int ans;
    if(ve <= mid){
        ans = query(root * 2 + 1, vs ,ve);
    }else if(vs > mid){
        ans = query(root * 2 + 2, vs ,ve);
    }else{
        ans = query(root * 2 + 1, vs ,mid) + query(root * 2 + 2, mid + 1, ve);
    }
    tree[root].sum = tree[root * 2 + 1].sum + tree[root * 2 + 2].sum;
    return ans;
}
int kase, m;
int n;
int search(int index, int num){
    int L = index, R = n - 1;
    int pos;
    while(L <= R){
        int mid = L + (R - L) / 2;
        if(query(0 ,index, mid) >= num){
            pos = mid, R = mid - 1;
        }else{
            L = mid + 1;
        }
    }
    return pos;
}
int main(){
    const int root = 0;
    //freopen("C:\\Users\\administrator01\\CLionProjects\\untitled13\\data.txt", "rt" , stdin);
    scanf("%d" , &kase);
    while(kase--) {
        scanf("%d%d", &n, &m);
        build(root, 0, n - 1);
        int cmd;
        for (int i = 0; i < m; ++i) {
            scanf("%d", &cmd);
            if (cmd == 1) {
                int from, val;
                scanf("%d%d", &from, &val);
                int res = query(root, from, n - 1);//区间总共还剩下的花瓶
                if (res == 0) {
                    puts("Can not put any one.");
                } else {
                    int first = search(from, 1);
                    int second = search(from, min(res, val));
                    printf("%d %d\n", first, second);
                    update(root, first , second, 0);
                }
            } else {
                //清空花瓶s
                int from, to;
                scanf("%d%d", &from, &to);
                int ans = query(root, from, to);
                //printf("The number of empty bottle in %d to %d is %d\n", from, to, ans);
                printf("%d\n", (to - from + 1) - ans);
                update(root, from, to, 1);
            }
        }
        puts("");
    }
    return 0;
}
发布了69 篇原创文章 · 获赞 1 · 访问量 3046

猜你喜欢

转载自blog.csdn.net/Stagflation/article/details/102541128