毒瘤题。找了一下午+晚上的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. 【数据结构(C语言版)系列一】 线性表

    最近开始看数据结构,该系列笔记简单记录总结下所学的知识,更详细的推荐博主StrayedKing的数据结构系列,笔记部分也摘抄了博主总结的比较好的内容. 一些基本概念和术语 数据是对客观事物的符号表示, ...

  2. Linux下VIM配置以及常用快捷键

    一.VIM配置 在目录 /etc/vim下面,有个名为vimrc的文件,这是系统中公共的vim设置文件,对所有用户都有效.而在每个用户的主目录下,都能自己建立私有的设置文件,命名为:“.vimrc”. ...

  3. ACM_给你100块钱

    给你100块钱 Time Limit: 2000/1000ms (Java/Others) Problem Description: 小光见到昨晚旭能神没拿到一血,又损失了一百块,很同情他.但是为了不 ...

  4. win10系统下使用EDGE浏览器找不到Report Builder 启动图标

    Win10系统下如果要使用Report Builder,可能存在EDGE浏览器或者Chrome找不到ReportBuilder的启动图标的情况,此时,应以管理员权限运行IE浏览器,即可看到图标.

  5. Suricata是什么?

    不多说,直接上干货! 见Suricata的官网 https://suricata.readthedocs.io/en/latest/what-is-suricata.html snort.suirca ...

  6. poj2393 Yogurt factory

    思路: 贪心. 实现: #include <iostream> #include <cstdio> #include <algorithm> using names ...

  7. .NET 微信开发之 获取用户数据

    通过微信接口获取用户信息主要分为以下几个步骤: a.获取公众号的access_token b.通过查询所有用户OPenid接口获取所有用户. string url = "https://ap ...

  8. Eclipse打包多渠道包(库工程版)

    请先移步多渠道打包http://www.cnblogs.com/bhm666/p/6438776.html 自从上次使用了Gradle打渠道包后,遇到了各种各样的问题,不过也是小问题,仍然在几个项目上 ...

  9. scala打印error,debug,info

    1.以wordcount为例 package org.apache.spark.examples import org.apache.spark.examples.SparkPi.logger imp ...

  10. R in action读书笔记(10)-第八章:回归-- 异常观测值 改进措施

    8.4 异常观测值 8.4.1 离群点 car包也提供了一种离群点的统计检验方法.outlierTest()函数可以求得最大标准化残差绝对值Bonferroni调整后的p值: > library ...