描述


BZOJ: http://www.lydsy.com/JudgeOnline/problem.php?id=1798

Codevs: http://codevs.cn/problem/2216/

给出n和行星的质量,进行m次操作:

1.将[l,r]区间内所有行星质量*c.

2.将[l,r]区间内所有行星质量+c.

3.询问[l,r]区间内行星质量和.

分析


双标记线段树,多加一个乘法的标记.a[k]位置的标记表示的是要传给a[k]的子节点的值,乘法位置为a[k].f,加法为a[k].p,表示的是先乘后加.按照先乘后加的规定,当跟新值时,ax+b变为(ax+b)*c1+c2=axc1+bc1+c2=(axc1)+(bc1+c2),也就是标记向下传递(push_down)的时候,乘法位置要乘,加法位置要先乘后加.

之前一直wa,最后才发现数组没开够...

感觉好像把乘法转化为加法也能做...但没尝试.

注意:

1.最好在确保扔给函数的参数都是取过模的,这样不容易出错.

2.可以不用long long定义,在乘法的时候强制转换一下就好了.

 #include<cstdio>
#include<algorithm>
#define ll long long
#define lson 2*k
#define rson 2*k+1 const int maxn=1e5+;
int n,m,mod;
int w[maxn];
struct node { int l,r,x,f,p; }a[*maxn]; void build_tree(int l,int r,int k)
{
a[k].l=l; a[k].r=r; a[k].f=; a[k].p=;
if(l==r)
{
a[k].x=w[l];
return;
}
int mid=l+(r-l)/;
build_tree(l,mid,lson);
build_tree(mid+,r,rson);
a[k].x=(a[lson].x+a[rson].x)%mod;
} inline void cal(int k,int f,int p)
{
a[k].x=(int)((((ll)a[k].x*(ll)f)%mod+((ll)(a[k].r-a[k].l+)%mod)*(ll)p)%mod);
a[k].f=(int)(((ll)a[k].f*(ll)f)%mod);
a[k].p=(int)((((ll)a[k].p*(ll)f)%mod+p)%mod);
} inline void push_down(int k)
{
cal(lson,a[k].f,a[k].p);
cal(rson,a[k].f,a[k].p);
a[k].f=;
a[k].p=;
} void update(int l,int r,int k,int f,int p)
{
if(a[k].l==l&&a[k].r==r)
{
cal(k,f,p);
return;
}
if(a[k].f!=||a[k].p)
{
push_down(k);
}
int mid=a[k].l+(a[k].r-a[k].l)/;
if(r<=mid)
{
update(l,r,lson,f,p);
}
else if(l>mid)
{
update(l,r,rson,f,p);
}
else
{
update(l,mid,lson,f,p);
update(mid+,r,rson,f,p);
}
a[k].x=(a[lson].x+a[rson].x)%mod;
} int search(int l,int r,int k)
{
if(a[k].l==l&&a[k].r==r)
{
return a[k].x;
}
if(a[k].f!=||a[k].p)
{
push_down(k);
}
int mid=a[k].l+(a[k].r-a[k].l)/;
if(r<=mid)
{
return (search(l,r,lson)%mod);
}
else if(l>mid)
{
return (search(l,r,rson)%mod);
}
else
{
return ((search(l,mid,lson)+search(mid+,r,rson))%mod);
}
} int main()
{
#ifndef ONLINE_JUDGE
freopen("star.in","r",stdin);
freopen("star.out","w",stdout);
#endif
scanf("%d%d",&n,&mod); for(int i=;i<=n;i++)
{
scanf("%d",&w[i]);
}
build_tree(,n,);
scanf("%d",&m);
int qry,l,r,c;
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&qry,&l,&r);
switch(qry)
{
case :
scanf("%d",&c);
c%=mod;
update(l,r,,c,);
break;
case :
scanf("%d",&c);
c%=mod;
update(l,r,,,c);
break;
case :
printf("%d\n",search(l,r,));
break;
}
}
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
system("star.out");
#endif
return ;
}

BZOJ_1798_&_Codevs_2216_[AHOI_2009]_行星序列_(线段树)的更多相关文章

  1. 【wikioi】2216 行星序列(线段树)

    http://wikioi.com/problem/2216/ 这题太让我感动了QAQ,让我找到了我一直以来写线段树的错误!!!! 就是,pushdown一定要放在最前面!要不然顺序会错.也就是说,当 ...

  2. 【题解】P4247 [清华集训]序列操作(线段树修改DP)

    [题解]P4247 [清华集训]序列操作(线段树修改DP) 一道神仙数据结构(DP)题. 题目大意 给定你一个序列,会区间加和区间变相反数,要你支持查询一段区间内任意选择\(c\)个数乘起来的和.对1 ...

  3. BZOJ_1018_[SHOI2008]_交通堵塞traffic_(线段树)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1018 \(2*n\)的距形,起初没有边相连,之后有三种操作: 1.加边. 2.删边. 3.询问 ...

  4. BZOJ 1835: [ZJOI2010]base 基站选址 [序列DP 线段树]

    1835: [ZJOI2010]base 基站选址 题目描述 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立 ...

  5. [AHOI 2009] 维护序列(线段树模板题)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...

  6. 【BZOJ-2962】序列操作 线段树 + 区间卷积

    2962: 序列操作 Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 678  Solved: 246[Submit][Status][Discuss] ...

  7. 【BZOJ-1858】序列操作 线段树

    1858: [Scoi2010]序列操作 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1961  Solved: 991[Submit][Status ...

  8. hdu 4521 小明系列问题——小明序列(线段树 or DP)

    题目链接:hdu 4521 本是 dp 的变形,却能用线段树,感觉好强大. 由于 n 有 10^5,用普通的 dp,算法时间复杂度为 O(n2),肯定会超时.所以用线段树进行优化.线段树维护的是区间内 ...

  9. HDU 4521-小明序列(线段树好题)

    题意: n个数字的序列,求各数位置间隔大于d的最长上升子序列 分析: 最基本的dp但是数据量大O(n^2)肯定超时 前dp[i]为的最长上升子序列是由前dp[1]---dp[i-d-1]符合条件的最大 ...

随机推荐

  1. PHP中刷新输出缓冲

    http://www.cnblogs.com/mutuan/archive/2012/03/18/2404957.html PHP中刷新输出缓冲buffer是一个内存地址空间,Linux系统默认大小一 ...

  2. javascript中event.keycode大全

    keycode 8 = BackSpace BackSpace  keycode 9 = Tab Tab  keycode 12 = Clear  keycode 13 = Enter  keycod ...

  3. 'DEVENV' is not recognized as an internal or external command,

    使用命令行 DEVENV 编译c# 工程, C:\MyProject>DEVENV "MyProject.sln" /build Release /useenv'DEVENV ...

  4. Linux运维工程师面试

    一.Linux操作系统知识 1.常见的Linux发行版本都有什么?你最擅长哪一个?它的官网网站是什么?说明你擅长哪一块?   2.Linux开机启动流程详细步骤是什么?系统安装完,忘记密码如何破解? ...

  5. sqlserver字符串转日期

    declare   @str   varchar(15)     declare   @dt   datetime     select   @str='2005-8-26'     set   @d ...

  6. PL/SQL学习(二)条件和循环语句

      原文参考:http://plsql-tutorial.com/   PLSQL条件语句 IF THEN ELSE STATEMENT 1) IF condition THEN  statement ...

  7. 限制apache错误日志大小

    ①配置错误日志 在http.conf配置: ErrorLog "| /opt/lampp/bin/rotatelogs /opt/lampp/logs/%Y_%m_%d_error_log  ...

  8. Python中的redis学习笔记

    redis是一个key-value结构的数据库,value的格式可以使string,set,list,map(即python里面的dict),sorted set(有序集合) 1.初始化 1)直接连接 ...

  9. SQL Server 2008 R2 主从数据库同步设置

    一.准备工作: 主数据库服务器: OS:Windows Server 2008 R2    DB: SQL Server 2008 R2 Hostname : CXMasterDB IP: 192.1 ...

  10. RESTheart官方文档

    作者:Andrea Di Cesare, Maurizio Turatti RESTHeart是SoftInstigate公司创建并开发的开源项目. MongoDB的WEB操作接口 RESTHEART ...