题意:有四种操作
1,  区间 [l, r] 的值都加上 C
2,  区间 [l, r] 的值都乘上 C
3,  区间 [l, r] 的值都变为C
4,  求区间 [l, r]所有数的p次方的和
分析:是比较麻烦的区间操作,设计四种操作,更新的时候无法更新到底部,不过仔细思考可以想到这都是对区间进行的操作,所以会造成一部分的区间值相等,所以只需要更新到相等区间部分就行了,而且注意有第三种操作的时候,第二和第一种操作可以去掉,操作的优先性是3>2>1,。
WA了一次,因为操作三进行的的时候没有把前两种操作去除
*************************************************************************
#include<algorithm>
#include<stdio.h>
using namespace std; #define lson u<<1
#define rson u<<1|1 const int MAXN = 1e5+5;
const int mod = 1e4+7; struct node
{///num表示这个区间的数(区间里面的值都相等,不相等时候为0),mul记录乘的次数,add表示需要加的数
    int l, r, num, mul, add, cover;///cover 等于0的时候表示区间的值不相同,等于1表示区间进行覆盖操作,等于2表示区间的值相同
    int m(){return (l+r)>>1;}
    int len(){return r-l+1;}
}a[MAXN<<2]; void Up(int u)
{
    if( a[lson].cover && a[rson].cover )
    if( a[lson].num == a[rson].num )
        a[u].num = a[lson].num, a[u].cover = 2;
}
void Down(int u)
{
    if(a[u].l != a[u].r)
    {
        if( a[u].cover == 1 )
        {
            a[lson].cover = a[rson].cover = 1;
            a[lson].num = a[rson].num = a[u].num;
            a[lson].add = a[rson].add = 0;
            a[lson].mul = a[rson].mul = 1;             a[u].cover = 2, a[u].mul = 1, a[u].add = 0;
        }
        if( a[u].mul > 1 )
        {
            (a[lson].mul *= a[u].mul)%=mod, (a[rson].mul *= a[u].mul)%=mod;
            (a[lson].num *= a[u].mul)%=mod, (a[rson].num *= a[u].mul)%=mod;
            (a[lson].add *= a[u].mul)%=mod, (a[rson].add *= a[u].mul)%=mod;             a[u].mul = 1;
        }         if( a[u].add )
        {
            (a[lson].add += a[u].add)%=mod, (a[rson].add += a[u].add)%=mod;
            (a[lson].num += a[u].add)%=mod, (a[rson].num += a[u].add)%=mod;             a[u].add = 0;
        }
    }
}
void Build(int u, int l, int r)
{
    a[u].add = 0, a[u].cover = 2, a[u].mul = 1;
    a[u].num = 0, a[u].l = l, a[u].r = r;     if(l == r)
        return ;     Build(lson, l, a[u].m());
    Build(rson, a[u].m()+1, r);
}
void Insert(int u, int l, int r, int op, int val)
{
    if(a[u].l == l && a[u].r == r && a[u].cover)
    {
        if(op == 3)
            a[u].add=0, a[u].cover = 1, a[u].mul = 1, a[u].num = val;
        else if(op == 2)
            (a[u].mul *= val)%=mod, (a[u].add *= val)%=mod, (a[u].num *= val)%=mod;
        else
            (a[u].add += val)%=mod, (a[u].num += val)%=mod;         return ;
    }     Down(u); a[u].cover = 0;     if(r <= a[u].m())
        Insert(lson, l, r, op, val);
    else if(l > a[u].m())
        Insert(rson, l, r, op, val);
    else
    {
        Insert(lson, l, a[u].m(), op, val);
        Insert(rson, a[u].m()+1, r, op, val);
    }     Up(u);
}
int  Query(int u, int l, int r, int p)
{     if(a[u].l == l && a[u].r == r && a[u].cover)
    {
        int ans = 1;
        while(p--) (ans *= a[u].num)%=mod;
        ans = (ans * a[u].len())%mod;         return ans;
    }     Down(u);     if(r <= a[u].m())
        return Query(lson, l, r, p);
    else if(l > a[u].m())
        return Query(rson, l, r, p);
    else
    {
        int lsum = Query(lson, l, a[u].m(), p);
        int rsum = Query(rson, a[u].m()+1, r, p);         return (lsum+rsum) % mod;
    }
} int  main()
{
    int N, M;     while(scanf("%d%d", &N, &M), N+M)
    {
        int u, v, op, c;         Build(1, 1, N);         while(M--)
        {
            scanf("%d%d%d%d", &op, &u, &v, &c);             if(op != 4)
                Insert(1, u, v, op, c);
            else
                printf("%d\n", Query(1, u, v, c));
        }
    }     return 0;
}

K - Transformation-hdu 4578(多操作混合区间更新)线段树的更多相关文章

  1. Codeforces Round #535 (Div. 3) E2. Array and Segments (Hard version) 【区间更新 线段树】

    传送门:http://codeforces.com/contest/1108/problem/E2 E2. Array and Segments (Hard version) time limit p ...

  2. K - Transformation HDU - 4578 线段树经典题(好题)

    题意:区间  加   变成定值 乘  区间查询:和 平方和 立方和 思路:超级超级超级麻烦的一道题  设3个Lazy 标记分别为  change 改变mul乘 add加  优先度change>m ...

  3. Codeforces Round #538 (Div. 2) F 欧拉函数 + 区间修改线段树

    https://codeforces.com/contest/1114/problem/F 欧拉函数 + 区间更新线段树 题意 对一个序列(n<=4e5,a[i]<=300)两种操作: 1 ...

  4. hdu 5700区间交(线段树)

    区间交 Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...

  5. HDU 1754:I Hate It(线段树模板)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  6. BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针

    BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间, ...

  7. xdoj-1324 (区间离散化-线段树求区间最值)

    思想 : 1 优化:题意是覆盖点,将区间看成 (l,r)转化为( l-1,r) 覆盖区间 2 核心:dp[i]  覆盖从1到i区间的最小花费 dp[a[i].r]=min (dp[k])+a[i]s; ...

  8. 2017 CCPC 杭州 HDU6273J 区间修改(线段树&差分数组)

    http://acm.hdu.edu.cn/downloads/CCPC2018-Hangzhou-ProblemSet.pdf 解析 线段树区间延迟更新 或 差分数组 两个数   统计2和3的最少的 ...

  9. 【题解】P1712 [NOI2016]区间(贪心+线段树)

    [题解]P1712 [NOI2016]区间(贪心+线段树) 一个observe是,对于一个合法的方案,将其线段长度按照从大到小排序后,他极差的来源是第一个和最后一个.或者说,读入的线段按照长度分类后, ...

随机推荐

  1. yii redirect

    redirect 这个方法是在 CController 里定义的 先来看下官方介绍 redirect() 方法 public void redirect(mixed $url, boolean $te ...

  2. Another app is currently holding the yum lock; waiting for it to exit... 怎么解决

    Another app is currently holding the yum lock; waiting for it to exit... 怎么解决 这个问题说明你的程序yum程序正在运行,必须 ...

  3. Python之路,Day22 - 网站用户访问质量分析监测分析项目开发

    Python之路,Day22 - 网站用户访问质量分析监测分析项目开发   做此项目前请先阅读 http://3060674.blog.51cto.com/3050674/1439129  项目实战之 ...

  4. codevs2622数字序列( 连续子序列最大和O(n)算法)

    /* 算法描述:维护一个s[p]表示累加和 并且更新最大值ans 如果s[p]<0 则从p+1重新累加 证明:设某个区间的起点和终点分别为s t 分两种情况 1.t<p:设s2表示1到s的 ...

  5. 织梦DedeCMS广告管理模块增加图片上传功能插件

    网站广告后台管理非常方便,但是织梦后台的广告管理模块,发布广告时图片没有上传选项,只能用URL地址,很不方便,那么下面就教大家一个方法实现广告图片后台直接上传,非常方便. 先给大家看下修改后的广告图片 ...

  6. SASS详解之沿袭(extend)

    SASS详解之继承(extend) 每一个类名都有可能有另一个类名的所有样式和它自己的特定样式的.当一个div的身上有两个类名,一个是“one”,另一个是“two”的时候.如下 HTML代码 < ...

  7. Mac下Sublime快捷键

    由于自己笔记本是mac,造成window与mac中sublime快捷键不同,现在稍微整理下常用的方便于记忆: 1.control+alt+enter 打开Emmet(Zencoding) 2.supe ...

  8. ASP.NET5配置

    ASP.NET5支持各种各样的配置,应用程序配置数据可以来自JSON, XML或者INI格式的文件,也能来自环境变量,你也可以自定义你自己的Configuration Provider. 1. 获取和 ...

  9. [转] 与调试器共舞 - LLDB 的华尔兹

    你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值? NSLog(@"%@", whatIsInsideThisThing); 或者跳过一个函数调用来简化程序的行为? NSNu ...

  10. iOS8中添加的extensions总结(一)——今日扩展

    通知栏中的今日扩展 分享扩展 Action扩展 图片编辑扩展 文件管理扩展 第三方键盘扩展 注:此教程来源于http://www.raywenderlich.com的<iOS8 by Tutor ...