[kuangbin带你飞]专题七 线段树 E - Just a Hook
2017-10-01 14:51
417 查看
D貌似要用离散化的思想,还不会,下次补。
#include <iostream>
#include <cstdio>
#include <cstring>
#define lid (id << 1)
#define rid (id << 1 | 1)
using namespace std;
const int maxn = 1e5+6;
int n,a[maxn],q;
struct node
{
int l,r;
long long sum,lazy;
void updata(long long x)
{
sum = (r-l+1)*x; //修改
lazy=x;
}
} tr[maxn*4];
void push_up(int id)
{
tr[id].sum=tr[lid].sum+tr[rid].sum;
}
void push_down(int id)
{
int lazyvalue=tr[id].lazy;
if(lazyvalue)
{
tr[lid].updata(lazyvalue);
tr[rid].updata(lazyvalue);
tr[id].lazy=0;
}
}
void build(int id,int l,int r)
{
tr[id].l=l,tr[id].r=r,tr[id].lazy=0;
if(l==r) tr[id].sum=1;
else
{
int mid=(l+r)/2;
build(lid,l,mid);
build(rid,mid+1,r);
push_up(id);
}
}
void updata(int id,int l,int r,long long val)
{
if(l==tr[id].l&&tr[id].r==r) tr[id].updata(val);
else
{
push_down(id);
int mid = (tr[id].l+tr[id].r)>>1;
if(r<=mid) updata(lid,l,r,val);
else if (l>mid) updata(rid,l,r,val);
else
{
updata(lid,l,mid,val);
updata(rid,mid+1,r,val);
}
push_up(id);
}
}
long long query_sum(int id,int l,int r)
{
if(l==tr[id].l&&tr[id].r==r) return tr[id].sum;
else
{
push_down(id);
int mid = (tr[id].l+tr[id].r)/2;
if(r<=mid) return query_sum(lid,l,r);
else if(l>mid) return query_sum(rid,l,r);
else return query_sum(lid,l,mid)+query_sum(rid,mid+1,r);
push_up(id);
}
}
int main(){
int m,ca,num=1;
scanf("%d",&m);
while(m--){
scanf("%d%d",&n,&ca);
build(1,1,n);
while(ca--){
int l,r,x;
scanf("%d%d%d",&l,&r,&x);
updata(1,l,r,x);
}
printf("Case %d: The total value of the hook is %d.\n",num++,query_sum(1,1,n));
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <cstring>
#define lid (id << 1)
#define rid (id << 1 | 1)
using namespace std;
const int maxn = 1e5+6;
int n,a[maxn],q;
struct node
{
int l,r;
long long sum,lazy;
void updata(long long x)
{
sum = (r-l+1)*x; //修改
lazy=x;
}
} tr[maxn*4];
void push_up(int id)
{
tr[id].sum=tr[lid].sum+tr[rid].sum;
}
void push_down(int id)
{
int lazyvalue=tr[id].lazy;
if(lazyvalue)
{
tr[lid].updata(lazyvalue);
tr[rid].updata(lazyvalue);
tr[id].lazy=0;
}
}
void build(int id,int l,int r)
{
tr[id].l=l,tr[id].r=r,tr[id].lazy=0;
if(l==r) tr[id].sum=1;
else
{
int mid=(l+r)/2;
build(lid,l,mid);
build(rid,mid+1,r);
push_up(id);
}
}
void updata(int id,int l,int r,long long val)
{
if(l==tr[id].l&&tr[id].r==r) tr[id].updata(val);
else
{
push_down(id);
int mid = (tr[id].l+tr[id].r)>>1;
if(r<=mid) updata(lid,l,r,val);
else if (l>mid) updata(rid,l,r,val);
else
{
updata(lid,l,mid,val);
updata(rid,mid+1,r,val);
}
push_up(id);
}
}
long long query_sum(int id,int l,int r)
{
if(l==tr[id].l&&tr[id].r==r) return tr[id].sum;
else
{
push_down(id);
int mid = (tr[id].l+tr[id].r)/2;
if(r<=mid) return query_sum(lid,l,r);
else if(l>mid) return query_sum(rid,l,r);
else return query_sum(lid,l,mid)+query_sum(rid,mid+1,r);
push_up(id);
}
}
int main(){
int m,ca,num=1;
scanf("%d",&m);
while(m--){
scanf("%d%d",&n,&ca);
build(1,1,n);
while(ca--){
int l,r,x;
scanf("%d%d%d",&l,&r,&x);
updata(1,l,r,x);
}
printf("Case %d: The total value of the hook is %d.\n",num++,query_sum(1,1,n));
}
return 0;
}
相关文章推荐
- kuangbin——线段树专题 E - Just a Hook
- 【算法系列学习】线段树 单点覆盖,区间查询最大值 [kuangbin带你飞]专题七 线段树 B - I Hate It
- [kuangbin带你飞]专题七 线段树 G POJ 3264
- 【算法系列学习】线段树 区间修改,区间求和 [kuangbin带你飞]专题七 线段树 C - A Simple Problem with Integers
- [kuangbin带你飞]专题七 线段树 H HDU-4027
- [kuangbin带你飞]专题七 线段树
- [kuangbin带你飞]专题七 线段树 H HDU4027
- 线段树专题—HDU1698 Just a Hook
- [kuangbin带你飞]专题七 线段树 ABCDE 题解,持续更新
- [kuangbin带你飞]专题七 线段树 【A、B、C、E、G、H】
- [kuangbin带你飞]专题七 线段树 B - I Hate It(单点修改,区间最大值)
- [kuangbin带你飞]专题七 线段树 I HDU 1540
- [kuangbin带你飞]专题七 线段树 C - A Simple Problem with Integers
- 【算法系列学习】线段树vs树状数组 单点修改,区间查询 [kuangbin带你飞]专题七 线段树 A - 敌兵布阵
- [kuangbin带你飞]专题七 线段树 B HDU 1754
- [kuangbin带你飞]专题七 线段树 题解(未完)
- [kuangbin带你飞]专题七 线段树 C POJ 3468
- [kuangbin带你飞]专题七 线段树 A - 敌兵布阵 (单点修改,区间求和)
- [kuangbin带你飞]专题七 线段树 G POJ 3264
- 线段树专题—HDU1698 Just a Hook