描述


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中的static关键字解析(转自海子)__为什么main方法必须是static的,因为程序在执行main方法的时候没有创建任何对象,因此只有通过类名来访问。

    Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...

  2. Oracle官网下载地址大全(包括11g、10g和9i)

    Oracle11g下载: Microsoft Windows(32 位)的 Oracle Database 11g 第 2 版 (11.2.0.1.0) http://download.oracle. ...

  3. iOS-开发日志-UIimageView

      UIImageView属性   1.Image 设置图片,默认显示 UIImageView *_imageView = [[UIImageView alloc]init]; _imageView. ...

  4. javascript dom编程艺术笔记之图片库的改进

    dom的操作要遵守的原则 1.平稳退化 2.分离javascript 3.向后兼容 4.性能考虑 改进后的显示图片方法 function showpic(whichpic){ if(!document ...

  5. javascript dom编程艺术笔记第三章:DOM操作的5个基本方法

    JavaScript的 DOM操作,主要是对DOM这三个字母中D.O.M的操作.D代表的是document(文档),即我们可以使用javascript对文档进行操作,O代表的是object(对象),对 ...

  6. Solr集群的搭建以及使用(内涵zookeeper集群的搭建指南)

    1   什么是SolrCloud SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud.当一个系统的索引数据量少的时候 ...

  7. Codevs 1074 食物链 2001年NOI全国竞赛

    1074 食物链 2001年NOI全国竞赛 时间限制: 3 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 动物王国中有三类动物 A,B ...

  8. 九度OJ 1453 Greedy Tino -- 动态规划

    题目地址:http://ac.jobdu.com/problem.php?pid=1453 题目描述: Tino wrote a long long story. BUT! in Chinese... ...

  9. 九度OJ 1205 N阶楼梯上楼问题 -- 动态规划(递推求解)

    题目地址:http://ac.jobdu.com/problem.php?pid=1205 题目描述: N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式.(要求采用非递归) 输入: 输入包括 ...

  10. 字符串匹配算法——KMP、BM、Sunday

    KMP算法 KMP算法主要包括两个过程,一个是针对子串生成相应的“索引表”,用来保存部分匹配值,第二个步骤是子串匹配. 部分匹配值是指字符串的“前缀”和“后缀”的最长的共有元素的长度.以“ABCDAB ...