题意:有四种操作
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;
}

最新文章

  1. GUID简介
  2. 使用noConflict重命名jQuery对象
  3. adpatch options=hotpatch
  4. WPF 进程间通讯----inter-process communication
  5. Automator一键生成所需的iOS 图片icon
  6. Java GC 概念摘要
  7. python for selenium 数据驱动测试
  8. qt实现类似QQ伸缩窗口--鼠标事件应用
  9. Python:代码调试的好帮手sys._getframe()
  10. PowerDesigner创建物理模型
  11. HDU 1518 Square 搜索
  12. overflow的几个坑
  13. C#关于HttpClient的应用(二):融云IM集成
  14. CentOS 在同一窗口打开文件夹
  15. 运维&amp;网络知识(一)
  16. js的学习(window对象的使用)
  17. 常用Markdown公式整理 &amp;&amp; 页内跳转注意 &amp;&amp; Markdown preview
  18. mac升级后idea提示Can&#39;t start git
  19. Java - 静态代理详讲
  20. Intent的那些事儿

热门文章

  1. oracle 自治事物 -- autonomous transaction
  2. 使用phpmailer发送邮件(以QQ邮箱为例)
  3. Linq101-Generation
  4. &lt;c:if&gt;判断参数是否同时为空
  5. oracle中创建一个用户,只能查看指定的视图,如何授权,创建别名
  6. oc总结
  7. C# == 和equals()区别
  8. sublime3 插件pylinter的安装
  9. EclipsePHP Studio 常用设置笔记
  10. codeforces 305E Playing with String