题意:有两种操作,第一种从A开始插花,如果有花就跳到下一个,然后输出最后一个花瓶的编号,如果花瓶不够把多余的花丢掉。操作2把区间清空
分析:很明显的线段树操作,就是插花的时候麻烦一下,需要先找出来他剩余的花瓶数,要不没办法更新。
*******************************************************************
#include<algorithm>
#include<stdio.h>
using namespace std; #define lson r<<1
#define rson r<<1|1 const int MAXN = 1e5+; struct stgmentTree
{//sum花瓶的剩余量
    int x, y, sum, cover;//cover, 操作1赋值为释放花瓶,操作2沾满花瓶
    int mid(){return (x+y)>>;}
    int len(){return y-x+;}
}a[MAXN<<];
int ans;
void Build(int r, int x, int y)
{
    a[r].x = x, a[r].y = y;
    a[r].sum = a[r].len(), a[r].cover = ;     if(x == y)
        return ;     Build(lson, x, a[r].mid());
    Build(rson, a[r].mid()+, y);
}
void Down(int r)
{
    if(a[r].x != a[r].y && a[r].cover)
    {
        a[lson].cover = a[rson].cover = a[r].cover;
        a[lson].sum = a[r].cover== ?  : a[lson].len();
        a[rson].sum = a[r].cover== ?  : a[rson].len();         a[r].cover = ;
    }
}
void Insert(int r, int x, int y, int op)
{
    if(a[r].x == x && a[r].y == y)
    {
        ans += a[r].len()-a[r].sum;
        a[r].cover = op;
        a[r].sum = (op== ?  : a[r].len());         return ;
    }     Down(r);     if(y <= a[r].mid())
        Insert(lson, x, y, op);
    else if(x > a[r].mid())
        Insert(rson, x, y, op);
    else
    {
        Insert(lson, x, a[r].mid(), op);
        Insert(rson, a[r].mid()+, y, op);
    }     a[r].sum  = a[rson].sum + a[lson].sum;
}
int QueryPreSum(int r, int k)//求k前面的空花瓶数
{
    Down(r);     if(a[r].x == a[r].y)
        return ;
    if(k <= a[r].mid())
        return QueryPreSum(lson, k);
    else
        return a[lson].sum + QueryPreSum(rson, k);
}
int QueryLast(int r, int p)//查找第p个花瓶位置
{
    Down(r);     if(a[r].x == a[r].y)
        return a[r].x;     if(a[lson].sum >= p)
        return QueryLast(lson, p);
    else
        return QueryLast(rson, p-a[lson].sum);
} int main()
{
    int T;     scanf("%d", &T);     while(T--)
    {
        int N, M, op, x, y, L, R;         scanf("%d%d", &N, &M);         Build(, , N-);         while(M--)
        {
            scanf("%d%d%d", &op, &x, &y);
            if(op == )
            {
                int PreSum = QueryPreSum(, x);                 if(PreSum == a[].sum)
                    printf("Can not put any one.\n");
                else
                {
                    L = QueryLast(, PreSum+);                     if(PreSum+y >= a[].sum)
                        PreSum = a[].sum;
                    else
                        PreSum += y;
                    R = QueryLast(, PreSum);                     Insert(, L, R, );                     printf("%d %d\n", L, R);
                }
            }
            else
            {
                ans = ;
                Insert(, x, y, );
                printf("%d\n", ans);
            }
        }         printf("\n");
    }     return ;
}
/*
2
10 8
1 2 5
2 3 4
1 0 8
2 2 5
1 6 1
1 4 4
1 2 3

*/

L - Vases and Flowers - hdu 4614(区间操作)的更多相关文章

  1. L - Vases and Flowers HDU - 4614 线段树+二分

    题意 给出一排空花瓶 有两种操作  1是 从A花瓶开始放F朵花 如果当前瓶有花就跳过前往下一个 直到花用完或者 瓶子到了最后一个为止 输出 成功放花的第一个和最后一个  如果没有输出 can not. ...

  2. HDU-4614 Vases and Flowers 线段树区间更新

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 线段树保存区间是否被覆盖以及区间的和即可,在询问的时候在线段树上二分查找就可以了...代码写得比 ...

  3. 【HDU 4614】Vases and Flowers(线段树区间更新懒惰标记)

    题目0到n-1的花瓶,操作1在下标a开始插b朵花,输出始末下标.操作2清空[a,b]的花瓶,求清除的花的数量.线段树懒惰标记来更新区间.操作1,先查询0到a-1有num个空瓶子,然后用线段树的性质,或 ...

  4. 2013 多校联合2 D Vases and Flowers (hdu 4614)

    Vases and Flowers Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others ...

  5. HDU 4614 Vases and Flowers(线段树+二分)

    Vases and Flowers Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others ...

  6. HDU 4614 Vases and Flowers (2013多校2 1004 线段树)

    Vases and Flowers Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others ...

  7. HDU-4614 Vases and Flowers(线段树区间更新+二分查找)

    http://acm.hdu.edu.cn/showproblem.php?pid=4614 Time Limit: 4000/2000 MS (Java/Others)    Memory Limi ...

  8. HDU 4578——Transformation——————【线段树区间操作、确定操作顺序】

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others)T ...

  9. HDU 1754 I Hate It (Splay 区间操作)

    题目大意 维护一个序列,支持两种操作 操作一:将第x个元素的值修改为y 操作二:询问区间[x,y]内的元素的最大值 解题分析 splay的区间操作,事先加入两个编号最小和最大的点防止操作越界. 具体的 ...

随机推荐

  1. Codeforces 190E - Counter Attack

    [题意]给一个无向图的反图(即给定的边实际上不存在,而未给的边是存在的),求连通块数.(点数n<=5*10^5,边数m<=10^6) 一开始我想的用DFS,枚举每一个点,跳过不存在的点,直 ...

  2. Camera类

    Camera类 使用 Camera 类可从连接到运行 Flash Player 的计算机的摄像头中 捕获视频. 使用 Video 类可在本地监视视频. 使用 NetConnection  和 NetS ...

  3. 转载:C# HashSet 用法

    原文地址:http://www.cnblogs.com/xiaopin/archive/2011/01/08/1930540.html   感谢博主分享! NET 3.5在System.Collect ...

  4. KMP算法总结

    kmp算法的T子字符串的下标的变化规律 大话数据结构这边书中的KMP算法的讲解跟最终的算法代码还是有很大的差别 java语言只会if判断语句,循环语句,但是这些语句以及可以包罗万象了,可以适用很多情况 ...

  5. 佛祖保佑 永无BUG(网转 by atkfc)

        //                   _ooOoo_    //                  o8888888o    //                  88" . ...

  6. Objective-C学习篇04—多态

    多态 多态的概念 有这样一个例子.早上我和同事说口渴了.结果:A同事拿着我的水杯去给我接了一杯水.B同事顺手在饮水机上拿了一次性纸杯给我接了杯水.C同事给了我一瓶他早上刚买的饮料.同事们得到的是同样的 ...

  7. json+一般处理程序读取数据库数据

    一般处理程序的语法结构 string jsoncallback = context.Request["jsoncallback"]; 声明变量 前台传值使用        stri ...

  8. css水平居中的小小探讨

    水平居中是常用的几种布局方式之一.主要分为行内元素的居中,块元素的居中.块元素的居中还分为固定宽度的居中,不定宽度的居中.行内元素的居中,使用text-align:center就可以实现,已知宽度的块 ...

  9. http请求头响应头大全

    转:http://www.jb51.net/article/51951.htm 本文为多篇“HTTP请求头相关文章”及<HTTP权威指南>一书的阅读后个人汇总整理版,以便于理解. 通常HT ...

  10. C++11中int,float,double与string的转化

    在C++11中可以使用std::to_string()函数将数值转换为string格式,十分方便. 以下部分来选自cplusplus.com. std::to_string string to_str ...