线段树模板1
来源:互联网 发布:淘宝达人怎么发帖子 编辑:程序博客网 时间:2024/06/05 17:54
最近刚刚开始学线段树,今天终于A掉了区间修改区间求和感人啊(还要打标记!!!!)
题目来源:https://www.luogu.org/problem/show?pid=3372#sub
#include<iostream>
#include<algorithm>#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#define M 500005
using namespace std;
long long e[M];//标记
long long d[M];//和
long long a[M];
long long b[M];
long long c[M];
long long sum1;
void build(int k,int x,int y)
{
b[k]=x;
c[k]=y;
if (x==y){
d[k]=a[x];
return;
}
else {
int mid=(x+y)/2;
build(k*2,x,mid);
build(2*k+1,mid+1,y);
d[k]=d[k*2]+d[k*2+1];
}
}
void mountain(int k)
{
e[k*2]=e[k*2]+e[k];
e[k*2+1]=e[k*2+1]+e[k];
d[k*2]=d[k*2]+e[k]*(c[k*2]-b[k*2]+1);
d[k*2+1]=d[k*2+1]+e[k]*(c[k*2+1]-b[k*2+1]+1);
e[k]=0;
}
void add(int k,int left,int right,int ckr)//[left,right]区间加上ckr
{
if (right<b[k]||left>c[k]){
return;
}
else{
if (left<=b[k]&&right>=c[k]){
e[k]=e[k]+ckr;
d[k]=d[k]+ckr*(c[k]-b[k]+1);
return;
}
if (e[k]) mountain(k);
add(k*2,left,right,ckr);
add(k*2+1,left,right,ckr);
d[k]=d[k*2]+d[k*2+1];
}
}
long long sum(int left,int right,int k)
{
if (right<b[k]||left>c[k]){
return 0;
}
else {
if (left<=b[k]&&right>=c[k]){
return d[k];
}
if (e[k]){
mountain(k);
}
int mid=(b[k]+c[k])/2;
if (right<=mid){
return sum(left,right,k*2);
}
if (left>mid){
return sum(left,right,k*2+1);
}
if (left<=mid&&right>mid){
return sum(left,mid,k*2)+sum(mid+1,right,k*2+1);
}
}
}
/*void sum(int k,int left,int right)
{
if (right<b[k]||left>c[k]){
return;
}
if (left<=b[k]&&right>c[k]){
sum1=sum1+d[k];
return;
}
if (e[k]) mountain(k);
int mid=(b[k]+c[k])/2;
if (right<=mid){
sum(left,right,k*2);
}
else {
if (left>mid){
sum(left,right,k*2+1);
}
else {
sum(left,mid,k*2);
sum(mid+1,right,k*2+1);
}
}
}*/
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
build(1,1,n);
for (int i=1;i<=m;i++){
int p;
scanf("%d",&p);
if (p==2){
int x,y,z;
scanf("%d%d",&x,&y);
long long sum1=sum(x,y,1);
printf("%lld\n",sum1);
}
else {
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(1,x,y,z);
}
}
return 0;
}
0 0
- 【模板】线段树 1
- 线段树模板1
- 模板线段树1
- [P3372][模板]线段树1
- ACM 线段树模板(模板)
- 洛谷 3372_【模板】线段树 1_线段树
- 【洛谷】P3372线段树1 线段树模板
- 模板:线段树(1)点修改
- 【洛谷P3372】【模板】线段树 1
- 洛谷P3374模板线段树1
- 洛谷3372[模板]线段树1
- 洛谷 P3372【模板】线段树 1
- 洛谷P3372 【模板】线段树 1
- 洛谷 P3372 【模板】线段树 1
- 【洛谷P3372】【模板】线段树1
- 线段树模板
- hdu_1166_线段树模板
- 线段树模板
- PCA与KPCA
- Arcgis4js实现链家找房的效果
- Hibernate入门(五)hibernate的级联(cascade)表操作
- 阿里云服务器部署mysql、tomcat、jdk
- spring的AOP简介与事务传播特性总结(转载)
- 线段树模板1
- R3抹掉加载的DLL
- CentOS7下安装tomcat及操作
- mysql-5.7.17-winx64的安装配置
- h5遇到的问题
- 常用Java设计模式系列(1)- 单例模式
- Orcl分页查询
- javascript中实现继承的三种方式(一看就懂)
- wex5中win10操作系统studio中新建.w向导或其他的编辑窗口显示不全