zoukankan      html  css  js  c++  java
  • P3130 [USACO15DEC]计数haybalesCounting Haybales

    P3130 [USACO15DEC]计数haybalesCounting Haybales

    1)给定一段连续的田地,给每一个田地都增加一些新的草包。

    2)给定一段连续的田地,找出草包最少的田地有多少草包。

    3)给定一段连续的田地,统计一共有多少草包。


    错误日志: (pushdown) 时记录懒标记用了 (int) , 下次(在没有把握的情况下)应全部替换


    Solution

    线段树, 懒标记, 靠前练手

    Code

    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<cstring>
    #include<algorithm>
    #include<climits>
    #define LL long long
    using namespace std;
    LL RD(){
        LL out = 0,flag = 1;char c = getchar();
        while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
        while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
        return flag * out;
        }
    const LL maxn = 400019;
    LL num, na;
    LL v[maxn];
    #define lid (id << 1)
    #define rid (id << 1) | 1
    struct seg_tree{
    	LL l, r;
    	LL min, sum, lazy;
    	}tree[maxn << 2];
    void pushup(LL id){
    	tree[id].sum = tree[lid].sum + tree[rid].sum;
    	tree[id].min = min(tree[lid].min, tree[rid].min);
    	}
    void build(LL id, LL l, LL r){
    	tree[id].l = l, tree[id].r = r;
    	if(l == r){
    		tree[id].min = tree[id].sum = v[l];
    		return ;
    		}
    	LL mid = (l + r) >> 1;
    	build(lid, l, mid), build(rid, mid + 1, r);
    	pushup(id);
    	}
    void pushdown(LL id){
    	if(tree[id].lazy != 0){
    		LL val = tree[id].lazy;
    		tree[lid].sum += val * (tree[lid].r - tree[lid].l + 1);
    		tree[rid].sum += val * (tree[rid].r - tree[rid].l + 1);
    		tree[lid].min += val;
    		tree[rid].min += val;
    		tree[lid].lazy += val;
    		tree[rid].lazy += val;
    		tree[id].lazy = 0;
    		}
    	}
    void update(LL id, LL val, LL l, LL r){
    	pushdown(id);
    	if(tree[id].l == l && tree[id].r == r){
    		tree[id].lazy += val;
    		tree[id].sum += val * (tree[id].r - tree[id].l + 1);
    		tree[id].min += val;
    		return ;
    		}
    	LL mid = (tree[id].l + tree[id].r) >> 1;
    	if(mid < l)update(rid, val, l, r);
    	else if(mid >= r)update(lid, val, l, r);
    	else update(lid, val, l, mid), update(rid, val, mid + 1, r);
    	pushup(id);
    	}
    LL get_sum(LL id, LL l, LL r){
    	pushdown(id);
    	if(tree[id].l == l && tree[id].r == r){
    		return tree[id].sum;
    		}
    	LL mid = (tree[id].l + tree[id].r) >> 1;
    	if(mid < l)return get_sum(rid, l, r);
    	else if(mid >= r)return get_sum(lid, l, r);
    	else return get_sum(lid, l, mid) + get_sum(rid, mid + 1, r);
    	}
    LL get_min(LL id, LL l, LL r){
    	pushdown(id);
    	if(tree[id].l == l && tree[id].r == r){
    		return tree[id].min;
    		}
    	LL mid = (tree[id].l + tree[id].r) >> 1;
    	if(mid < l)return get_min(rid, l, r);
    	else if(mid >= r)return get_min(lid, l, r);
    	else return min(get_min(lid, l, mid), get_min(rid, mid + 1, r));
    	}
    int main(){
    	num = RD(), na = RD();
    	for(LL i = 1;i <= num;i++)v[i] = RD();
    	build(1, 1, num);
    	char cmd;
    	while(na--){
    		cin>>cmd;
    		LL l = RD(), r = RD();
    		if(cmd == 'M')printf("%lld
    ", get_min(1, l, r));
    		else if(cmd == 'S')printf("%lld
    ", get_sum(1, l, r));
    		else{
    			LL val = RD();
    			update(1, val, l, r);
    			}
    		}
    	return 0;
    	}
    
  • 相关阅读:
    hdu 1025 lis 注意细节!!!【dp】
    简单的数据生成方法
    注意特殊情况!最长上升子序列!!poj2533
    括号序列问题 uva 1626 poj 1141【区间dp】
    UVa 10502【dp】
    hdu 1024 MAX Sum Plus Plus【dp】
    python 《核心编程》 1,2章
    c语言 文件链表实现最简单的学生管理系统
    Python和Python解释器
    计算机基础小结
  • 原文地址:https://www.cnblogs.com/Tony-Double-Sky/p/9725249.html
Copyright © 2011-2022 走看看