洛谷P3373 线段树2(补上注释了)
毒瘤题。找了一下午+晚上的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(补上注释了)的更多相关文章
- 洛谷P3373线段树模板2
题目:https://www.luogu.org/problemnew/show/P3373 带乘的线段树,更新时把加的标记也乘一下,然后取值时先乘后加. 代码如下: #include<iost ...
- 洛谷P3372线段树1
难以平复鸡冻的心情,虽然可能在大佬眼里这是水题,但对蒟蒻的我来说这是个巨大的突破(谢谢我最亲爱的lp陪我写完,给我力量).网上关于线段树的题解都很玄学,包括李煜东的<算法竞赛进阶指南>中的 ...
- NOIP2017提高组Day2T3 列队 洛谷P3960 线段树
原文链接https://www.cnblogs.com/zhouzhendong/p/9265380.html 题目传送门 - 洛谷P3960 题目传送门 - LOJ#2319 题目传送门 - Vij ...
- 洛谷 P3372 线段树1
这是一道模板题 线段树介绍https://www.cnblogs.com/nvwang123/p/10420832.html #include<bits/stdc++.h> using n ...
- 洛谷P3372线段树模板1——线段树
题目:https://www.luogu.org/problemnew/show/P3372 线段树模板. 代码如下: #include<iostream> #include<cst ...
- 洛谷3372线段树模板题 对区间+k或者查询区间和
#include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll; ty ...
- 洛谷 P3373 【模板】线段树 2
洛谷 P3373 [模板]线段树 2 洛谷传送门 题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xx 将某区间每一个数加上 xx 求出某区间每一个数的和 输入格式 第一 ...
- 洛谷1087 FBI树 解题报告
洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...
- 洛谷P3018 [USACO11MAR]树装饰Tree Decoration
洛谷P3018 [USACO11MAR]树装饰Tree Decoration树形DP 因为要求最小,我们就贪心地用每个子树中的最小cost来支付就行了 #include <bits/stdc++ ...
随机推荐
- 银联手机支付控件官方使用指南(ios版)
目录 版本信息... 2 目录 3 1 概述... 1 2 支付流程介绍... 1 3 测试帐号... 2 4 iOS客户端... 3 4.1 ...
- vijos P1426兴奋剂检查 多维费用背包问题的hash
https://vijos.org/p/1426 这是个好题,容易想到用dp[i][v1][v2][v3][v4][v5]表示在前i个物品中,各种东西的容量是那个的时候,能产生的最大价值. 时间不会T ...
- jQuery委托
$('#container').on('click', '.elementClass', function() { // code }); http://stackoverflow.com/quest ...
- HttpWebRequest 以及WebRequest的使用
1.WebRequest的发送数据以及接收数据 class Program { static void Main(string[] args) { //创建一个实例并发送请求 HttpWebReque ...
- 5 Transforms 转移 笔记
5 Transforms 转移 笔记 Transforms Unfortunately, no one can be told what the Matrix is. You have to ...
- xamarin 学习笔记02- IOS Simulator for windows 安装
微软发布了在window下的ios模拟器 下载 ios模拟器 并安装在windows系统上. Xamarin for Visual Studio 和 网络上的 Mac 中的 Xamarin.iOS 开 ...
- 前复权是从今天的价格倒推 后复权是从上市价格前推 不复权就是原始K线。
前复权是从今天的价格倒推 后复权是从上市价格前推 不复权就是原始K线.
- springboot学习笔记(二)
首先我们来看一看,springboot启动类@RestController//@ResponseBody+@Controller@SpringBootApplicationpublic class H ...
- HTML a标签的href 属性 tel 点击可以直接拨打电话 ( 移动端 )
<a href="tel:13828172679">13622178579</a>
- php生成订单号-当天从1开始自增
/** * 生成订单号 * -当天从1开始自增 * -订单号模样:20190604000001 * @param Client $redis * @param $key * @param $back: ...