描述


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. 深入理解Java的接口和抽象类 _摘抄

    http://www.cnblogs.com/dolphin0520/p/3811437.html 原文 深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可 ...

  2. 周末充电之WPF(一).初试牛刀

    追的剧已经赶上更新的速度了,突然觉得一下子就闲了.趁着这点时间,刚好学点 WPF .看到这边,好多人估计得感叹技术宅约等于单身狗,哈哈.好了,赶紧进入学习状态. 关注 WPF 或者说对它感兴趣其实多半 ...

  3. iOS lanchImage 和icon的设置

    1 icon的设置 打开项目中的Assets.xcassets   这里边有一个icon 首先需要有icon 的尺寸 尺寸如下: 29*29   2x 29*29   3x 40*40  2x 40* ...

  4. 设置表格边框css样式

    table{ width:70%; text-align:center; border-left:#C8B9AE solid 1px; border-top:#C8B9AE solid 1px; bo ...

  5. 16_MyBatis中期小结

    [MyBatis是什么] MyBatis是一个持久层框架,Mybatis是一个不完全的ORM框架,SQL语句需要程序员自己去编写,但是MyBatis也有映射(输入参数映射.输出结果映射). MyBat ...

  6. 九度OJ 1435 迷瘴

    题目地址:http://ac.jobdu.com/problem.php?pid=1435 题目描述: 通过悬崖的yifenfei,又面临着幽谷的考验—— 幽谷周围瘴气弥漫,静的可怕,隐约可见地上堆满 ...

  7. Sql server 浅谈用户定义表类型

    1.1 简介 SQL Server 中,用户定义表类型是指用户所定义的表示表结构定义的类型.您可以使用用户定义表类型为存储过程或函数声明表值参数,或者声明您要在批处理中或在存储过程或函数的主体中使用的 ...

  8. 菜鸟的MySQL学习笔记(四)

    MySQL中的运算符和函数: 1.字符函数: 2.数值运算符与函数: 3.比较运算符与函数: 4.日期时间函数: 5.信息函数: 6.聚合函数: 7.加密函数等:   6-1.字符函数: CONCAT ...

  9. centos 安装php-fpm , nginx二级域名配置 ,但为什么必须要 域名提供商 哪里解析新的二级域名一下 才能用呢?

    yum -y install php-fpm php-mysql(当然还有其它扩展) /etc/init.d/php-fpm restart (重启php-fpm) /etc/php.ini (php ...

  10. Cocos2d-x课程大纲/学习路线

    Cocos2d-x课程大纲/学习路线 这是什么? 这个一个Cocos2d-x技术路线的课程大纲/学习大纲. 你能用它做什么? 如果你是找工作的人, 利用本大纲, 你可以学习Cocos2d-x, 做一个 ...