[kuangbin带你飞]专题七 线段树 C POJ 3468
2016-09-20 23:03
302 查看
题目地址:https://vjudge.net/contest/66989#problem/C
思路:线段树上区间成段更新,意识到了不能像之前一样一个一个修改,想了一晚上,没什么好想法,就搜了一下题解。思路真是很巧妙,学到了。
原文地址:http://blog.csdn.net/acceptedxukai/article/details/6933446
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1e5+10;
int n,m;
struct seg{
int l,r;
long long n,add;
}T[maxn*4];
void PushDown(int k,int m)
{
if(T[k].add)
{
T[k<<1].add+=T[k].add;
T[k<<1|1].add+=T[k].add;
T[k<<1].n+=T[k].add*(m-(m>>1));
T[k<<1|1].n+=T[k].add*(m>>1);
T[k].add=0;
}
}
void update(int c,int l,int r,int k)
{
if(T[k].l==l && T[k].r==r)
{
T[k].add+=c;
T[k].n+=(long long)c*(r-l+1);
return;
}
if(T[k].l==T[k].r) return;
PushDown(k,T[k].r-T[k].l+1);
int mid=(T[k].l+T[k].r)>>1;
if(r<=mid)
update(c,l,r,k<<1);
else if(l>mid)
update(c,l,r,k<<1|1);
else
{
update(c,l,mid,k<<1);
update(c,mid+1,r,k<<1|1);
}
T[k].n=T[k<<1].n+T[k<<1|1].n;
}
void build(int l,int r,int k)
{
T[k].l=l,T[k].r=r,T[k].add=0;
if(l==r)
{
scanf("%I64d",&T[k].n);
return;
}
int mid=(l+r)>>1;
build(l,mid,2*k);
build(mid+1,r,2*k+1);
T[k].n=T[2*k].n+T[2*k+1].n;
}
long long ans;
void search(int l,int r,int k)
{
if(T[k].l==l && T[k].r==r)
{
ans+=T[k].n;
return;
}
PushDown(k,T[k].r-T[k].l+1);
int mid=(T[k].l+T[k].r)>>1;
if(r<=mid)
search(l,r,2*k);
else if(l>mid)
search(l,r,2*k+1);
else
{
search(l,mid,2*k);
search(mid+1,r,2*k+1);
}
}
int main()
{
scanf("%d%d",&n,&m);
build(1,n,1);
for(int i=0;i<m;i++)
{
char aa[1];
scanf("%s",aa);
if(aa[0]=='Q')
{
int a,b;
scanf("%d%d",&a,&b);
ans=0;
search(a,b,1);
printf("%I64d\n",ans);
}
else if(aa[0]=='C')
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
update(c,a,b,1);
}
}
}
思路:线段树上区间成段更新,意识到了不能像之前一样一个一个修改,想了一晚上,没什么好想法,就搜了一下题解。思路真是很巧妙,学到了。
原文地址:http://blog.csdn.net/acceptedxukai/article/details/6933446
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1e5+10;
int n,m;
struct seg{
int l,r;
long long n,add;
}T[maxn*4];
void PushDown(int k,int m)
{
if(T[k].add)
{
T[k<<1].add+=T[k].add;
T[k<<1|1].add+=T[k].add;
T[k<<1].n+=T[k].add*(m-(m>>1));
T[k<<1|1].n+=T[k].add*(m>>1);
T[k].add=0;
}
}
void update(int c,int l,int r,int k)
{
if(T[k].l==l && T[k].r==r)
{
T[k].add+=c;
T[k].n+=(long long)c*(r-l+1);
return;
}
if(T[k].l==T[k].r) return;
PushDown(k,T[k].r-T[k].l+1);
int mid=(T[k].l+T[k].r)>>1;
if(r<=mid)
update(c,l,r,k<<1);
else if(l>mid)
update(c,l,r,k<<1|1);
else
{
update(c,l,mid,k<<1);
update(c,mid+1,r,k<<1|1);
}
T[k].n=T[k<<1].n+T[k<<1|1].n;
}
void build(int l,int r,int k)
{
T[k].l=l,T[k].r=r,T[k].add=0;
if(l==r)
{
scanf("%I64d",&T[k].n);
return;
}
int mid=(l+r)>>1;
build(l,mid,2*k);
build(mid+1,r,2*k+1);
T[k].n=T[2*k].n+T[2*k+1].n;
}
long long ans;
void search(int l,int r,int k)
{
if(T[k].l==l && T[k].r==r)
{
ans+=T[k].n;
return;
}
PushDown(k,T[k].r-T[k].l+1);
int mid=(T[k].l+T[k].r)>>1;
if(r<=mid)
search(l,r,2*k);
else if(l>mid)
search(l,r,2*k+1);
else
{
search(l,mid,2*k);
search(mid+1,r,2*k+1);
}
}
int main()
{
scanf("%d%d",&n,&m);
build(1,n,1);
for(int i=0;i<m;i++)
{
char aa[1];
scanf("%s",aa);
if(aa[0]=='Q')
{
int a,b;
scanf("%d%d",&a,&b);
ans=0;
search(a,b,1);
printf("%I64d\n",ans);
}
else if(aa[0]=='C')
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
update(c,a,b,1);
}
}
}
相关文章推荐
- [kuangbin带你飞]专题七 线段树 G POJ 3264
- [kuangbin带你飞]专题七 线段树 G POJ 3264
- [kuangbin带你飞]专题一 简单搜索D - Fliptile(POJ 3279)
- [kuangbin带你飞]专题四 最短路练习 G POJ 1502
- [kuangbin带你飞]专题九 连通图 E - Redundant Paths POJ - 3177
- POJ - 3414 bfs [kuangbin带你飞]专题一
- [kuangbin带你飞]专题1 简单搜索 C - Catch That Cow POJ - 3278
- [kuangbin带你飞]专题一 简单搜索F - Prime Path(POJ 3126)
- [kuangbin带你飞]专题一 简单搜索 G - Shuffle'm Up poj 3087
- POJ 3984 迷宫问题(kuangbin带你飞 专题一:简单搜索)
- [kuangbin带你飞]专题四 最短路练习 H POJ 3660
- 【算法系列学习】线段树 单点覆盖,区间查询最大值 [kuangbin带你飞]专题七 线段树 B - I Hate It
- POJ - 1321 dfs [kuangbin带你飞]专题一
- [kuangbin带你飞]专题六 最小生成树 A POJ 1251
- [kuangbin带你飞]专题七 线段树 【A、B、C、E、G、H】
- [kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher H POJ 2752
- [kuangbin带你飞]专题一 简单搜索 - A - 棋盘问题 POJ - 1321
- [kuangbin带你飞]专题七 线段树 C - A Simple Problem with Integers
- [kuangbin带你飞]专题一 简单搜索 H - Pots poj 3414
- [kuangbin带你飞]专题1 简单搜索 K - 迷宫问题 POJ - 3984