毒瘤题。找了一下午+晚上的BUG,才发现原来query_tree写的是a%p;

真的是一个教训

UPD:2019.6.18

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<queue>
#define lson i*2,l,mid //这个是宏定义,用前面的lson替代后面的i*2,l,mid
#define rson i*2+1,mid+1,r
using namespace std; struct tree{
long long mul; //mul是乘的缩写,add是加,sum是求和
long long add;
long long sum;
int l,r;
}t[]; int n,m,a[],p; void build_tree(int i,int l,int r)
{
t[i].l=l; //相乘的话必须是1,有大佬说l,r可以不定义,但是我码力不够
t[i].r=r;
t[i].mul=;
t[i].sum=;
t[i].add=;
if(l==r)
{
t[i].sum=a[l];
return ;
}
int mid=(l+r)/;
build_tree(lson);
build_tree(rson);
t[i].sum=(t[i*].sum+t[i*+].sum)%p;
} void pushdown2(int i) //回溯也有坑,大佬说两个push_down可以合并,特别注意mul最后赋值为1,向下传递的时候不要忘了下面的add和mul
{
t[i*].mul=t[i].mul*t[i*].mul%p;
t[i*+].mul=t[i].mul*t[i*+].mul%p;
t[i*].add=(t[i*].add*t[i].mul+t[i].add)%p;
t[i*+].add=(t[i*+].add*t[i].mul+t[i].add)%p;
t[i*].sum=(t[i].mul*t[i*].sum+t[i].add*(t[i*].r-t[i*].l+))%p;
t[i*+].sum=(t[i].mul*t[i*+].sum+t[i].add*(t[i*+].r-t[i*+].l+))%p;
t[i].add=;
t[i].mul=;
}
void pushdown(int i)
{
t[i*].mul=t[i].mul*t[i*].mul%p;
t[i*+].mul=t[i*+].mul*t[i].mul%p;
t[i*].add=(t[i*].add*t[i].mul+t[i].add)%p;
t[i*+].add=(t[i*+].add*t[i].mul+t[i].add)%p;
t[i*].sum=(t[i].mul*t[i*].sum+t[i].add*(t[i*].r-t[i*].l+))%p;
t[i*+].sum=(t[i].mul*t[i*+].sum+t[i].add*(t[i*+].r-t[i*+].l+))%p;
t[i].add=;
t[i].mul=;
}
void mul_tree(int i,int l,int r,int x,int y,int a)
{
if(l>=x&&r<=y)
{
t[i].sum*=a%p;
t[i].mul*=a%p;
t[i].add*=a%p;
return ;
}
pushdown(i);
int mid=(l+r)/;
if(x<=mid) mul_tree(lson,x,y,a);
if(y>mid) mul_tree(rson,x,y,a);
t[i].sum=(t[i*].sum+t[i*+].sum)%p;
}
void add_tree(int i,int l,int r,int x,int y,int a)
{
if(l>=x&&r<=y)
{
//t[i].mul*=a%p;
t[i].add+=a%p;
t[i].sum+=(t[i].r-t[i].l+)*a%p;
return ;
}
pushdown(i);
int mid=(l+r)/;
if(x<=mid) add_tree(lson,x,y,a);
if(y>mid) add_tree(rson,x,y,a);
t[i].sum=(t[i*].sum+t[i*+].sum)%p;
} int query_tree(int i,int l,int r,int a,int b)
{
if(l>=a&&r<=b) //l,r包含在ab区间则这一段直接返回
{
return t[i].sum%p;
}
int mid=(l+r)/;
long long ans=;
pushdown(i);
if(a<=mid) ans+=query_tree(lson,a,b)%p;
if(b>mid) ans+=query_tree(rson,a,b)%p;
return ans%p; }
int main()
{
scanf("%d %d %d",&n,&m,&p);
int i,j;
for(i=;i<=n;i++)
scanf("%d",&a[i]);
build_tree(,,n);
for(i=;i<=m;i++)
{
int k;
int t1,t2,t3;
scanf("%d",&k);
if(k==)
{
scanf("%d %d %d",&t1,&t2,&t3);
mul_tree(,,n,t1,t2,t3);
//printf("%d \n",query_tree(1,1,n,t1,t2)%p); //听说过复制粘贴吧
}
if(k==)
{
scanf("%d %d %d",&t1,&t2,&t3);
add_tree(,,n,t1,t2,t3);
//printf("%d \n",query_tree(1,1,n,t1,t2)%p);
}
if(k==)
{
scanf("%d %d",&t1,&t2);
printf("%d \n",query_tree(,,n,t1,t2)%p);
}
}
return ;
}

洛谷P3373 线段树2(补上注释了)的更多相关文章

  1. 洛谷P3373线段树模板2

    题目:https://www.luogu.org/problemnew/show/P3373 带乘的线段树,更新时把加的标记也乘一下,然后取值时先乘后加. 代码如下: #include<iost ...

  2. 洛谷P3372线段树1

    难以平复鸡冻的心情,虽然可能在大佬眼里这是水题,但对蒟蒻的我来说这是个巨大的突破(谢谢我最亲爱的lp陪我写完,给我力量).网上关于线段树的题解都很玄学,包括李煜东的<算法竞赛进阶指南>中的 ...

  3. NOIP2017提高组Day2T3 列队 洛谷P3960 线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/9265380.html 题目传送门 - 洛谷P3960 题目传送门 - LOJ#2319 题目传送门 - Vij ...

  4. 洛谷 P3372 线段树1

    这是一道模板题 线段树介绍https://www.cnblogs.com/nvwang123/p/10420832.html #include<bits/stdc++.h> using n ...

  5. 洛谷P3372线段树模板1——线段树

    题目:https://www.luogu.org/problemnew/show/P3372 线段树模板. 代码如下: #include<iostream> #include<cst ...

  6. 洛谷3372线段树模板题 对区间+k或者查询区间和

    #include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll; ty ...

  7. 洛谷 P3373 【模板】线段树 2

    洛谷 P3373 [模板]线段树 2 洛谷传送门 题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xx 将某区间每一个数加上 xx 求出某区间每一个数的和 输入格式 第一 ...

  8. 洛谷1087 FBI树 解题报告

    洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...

  9. 洛谷P3018 [USACO11MAR]树装饰Tree Decoration

    洛谷P3018 [USACO11MAR]树装饰Tree Decoration树形DP 因为要求最小,我们就贪心地用每个子树中的最小cost来支付就行了 #include <bits/stdc++ ...

随机推荐

  1. Apple Tree POJ - 2486

    Apple Tree POJ - 2486 题目大意:一棵点带权有根树,根节点为1.从根节点出发,走k步,求能收集的最大权值和. 树形dp.复杂度可能是O(玄学),不会超过$O(nk^2)$.(反正这 ...

  2. Linux命令(009) -- tar

    tar命令可以为Linux的文件和目录创建档案(备份).利用该命令,可以为某一特定文件创建备份,也可以在档案中改变文件或向档案中加入新的文件:可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件 ...

  3. jmeter(三)参数传递

    [一]参数化 录制脚本中有登录操作,需要输入用户名和密码,假如系统不允许相同的用户名和密码同时登录,或者想更好的模拟多个用户来登录系统. 这个时候就需要对用户名和密码进行参数化,使每个虚拟用户都使用不 ...

  4. 怎么将ts文件快速合成一个文件

    ts文件的排序要有一定的规则,最简单的就是:1.ts.2.ts.3.ts等.   使用Win + R打开下面窗口.   输入“cmd”,点击“确定”,打开下面窗口.   输入命令行:“copy /b ...

  5. 基于Windows7下snort+apache+php 7 + acid(或者base) + adodb + jpgraph的入侵检测系统的搭建(图文详解)(博主推荐)

    为什么,要写这篇论文? 是因为,目前科研的我,正值研三,致力于网络安全.大数据.机器学习.人工智能.区域链研究领域! 论文方向的需要,同时不局限于真实物理环境机器实验室的攻防环境.也不局限于真实物理机 ...

  6. [转]Asp.net Mvc2中重构View的三种方式

    本文转自:http://www.cnblogs.com/zhuqil/archive/2010/07/14/asp-net-mvc2-view-refactoring.html 我们在Asp.net ...

  7. 死磕 java魔法类之Unsafe解析

    问题 (1)Unsafe是什么? (2)Unsafe只有CAS的功能吗? (3)Unsafe为什么是不安全的? (4)怎么使用Unsafe? 简介 本章是java并发包专题的第一章,但是第一篇写的却不 ...

  8. AJPFX总结面向对象思想设计原则

    面向对象思想设计原则   A.单一职责原则           其实就是开发人员经常说的”高内聚,低耦合”           也就是说,每个类应该只有一个职责,对外只能提供一种功能,而引起类变化的原 ...

  9. Toast解析

    课程Demo public class MainActivity extends AppCompatActivity { private Button bt1; private Button bt2; ...

  10. Scala基础篇-02函数与代码块

    1.block 代码块也是表达式,其最终求得的值是最后一个表达式的值. {exp1;exp2} { exp1 exp2 } 2.function def funtionName(param:Param ...