毒瘤题。找了一下午+晚上的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. 洛谷 P3285 [SCOI2014]方伯伯的OJ

    看到这题,第一眼:平衡树水题,随便做一做好了 然后....我在花了n个小时去调试(维护平衡树父节点)之后,... 调了三个小时后,第一次失败的代码(只能查找排名为k的用户编号,不能根据编号查排名) # ...

  2. 树上最长链 Farthest Nodes in a Tree LightOJ - 1094 && [ZJOI2007]捉迷藏 && 最长链

    树上最远点对(树的直径) 做法1:树形dp 最长路一定是经过树上的某一个节点的. 因此: an1[i],an2[i]分别表示一个点向下的最长链和次长链,次长链不存在就设为0:这两者很容易求 an3[i ...

  3. C# PropertyInfo(官网)

    using System; using System.Reflection; class Module1 { public static void Main() { // This variable ...

  4. 441 Arranging Coins 排列硬币

    你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币.给定一个数字 n,找出可形成完整阶梯行的总行数.n 是一个非负整数,并且在32位有符号整型的范围内.示例 1:n ...

  5. [转]ASP.net MVC 2 自定义模板来显示数据

    本文转自:http://blog.163.com/liaojunbo@126/blog/static/1394892972012113104653651/ 在ASP.net MVC 2中,一个很有意思 ...

  6. ABP教程(二)- 将ABP在本地运行起来

    上一篇 我们介绍了什么是ABP,这一篇我们通过原作者的”简单任务系统”例子,演示如何运用ABP开发项目 从模板创建空的web应用程序 ABP提供了一个启动模板用于新建的项目(尽管你能手动地创建项目并且 ...

  7. Android学习备忘笺02Fragment

    Android中Fragment可以将UI界面分成多个区块,一般静态或动态添加Fragment. 01.新建Fragment实例 一个Fragment实例包括两个部分:类对象和布局文件(可视化部分). ...

  8. Java 线程实例 刷碗烧水和倒计时

    线程——烧水刷碗和倒计时实例 (一)烧水刷碗 刷碗的同时烧水:下面是碗的程序: 下面是烧水的程序:在水的实现类中,调用了Thread线程,让烧水刷碗同时进行. 注意:刷碗2s一次,烧水10s (二)1 ...

  9. Apache Tomcat 之路(三 部署多个应用)

    想要在一台服务器上部署多个web应用的时候有两种部署方式:1.拷贝多个tomcat 服务器,每个服务器启动不同的web应用;2.一个tomcat容器部署多个web应用 两种方式的优缺点:多个tomca ...

  10. idea下关联spark源码环境(转)

    0.环境: java 1.8 scala 2.11.8 maven 3.5.0 idea 2017 spark 2.2.0 1完成以下配置 java环境变量 scala环境变量 maven setti ...