Codeforces Round #179 (Div. 1) A题 线段树
来源:互联网 发布:laravel获取表单数据 编辑:程序博客网 时间:2024/06/05 03:21
有m个操作,每个操作给出l,r,d值,表示从a(l)到a(r)区间内的每个值加d。
接下来k个范围,每个范围为x到y,表示从第x个操作到第y个操作都执行一次。
输出最后得到的数组a。
两次线段树,第一次求出每种操作各需要多少次,第二次根据第一次结果求出最终结果。
代码如下
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#define INF 200000000#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1#define maxm 200005__int64 time[maxm<<2],lazy1[maxm<<2],cover[maxm<<2],lazy2[maxm<<2],a[maxm+5],op[maxm+5][3];void pushdown1(__int64 rt){ time[rt]+=lazy1[rt]; lazy1[rt<<1]+=lazy1[rt]; lazy1[rt<<1|1]+=lazy1[rt]; lazy1[rt]=0;}void build1(__int64 l,__int64 r,__int64 rt){ __int64 mid; time[rt]=0; lazy1[rt]=0; if(r>l) { mid=(l+r)>>1; build1(lson); build1(rson); }}void update1(__int64 L,__int64 R,__int64 l,__int64 r,__int64 rt){ __int64 mid; if(L<=l&&r<=R) { lazy1[rt]++; return ; } pushdown1(rt); if(r>l) { mid=(l+r)>>1; if(L<=mid) update1(L,R,lson); if(R>mid) update1(L,R,rson); }}__int64 search1(__int64 d,__int64 l,__int64 r,__int64 rt){ __int64 mid; pushdown1(rt); if(l==r) { return time[rt]; } mid=(l+r)>>1; if(d<=mid) return search1(d,lson); else return search1(d,rson);}void build2(__int64 l,__int64 r,__int64 rt){ __int64 mid; cover[rt]=0; lazy2[rt]=0; if(r>l) { mid=(l+r)>>1; build2(lson); build2(rson); }}void pushdown2(__int64 rt){ cover[rt]+=lazy2[rt]; lazy2[rt<<1]+=lazy2[rt]; lazy2[rt<<1|1]+=lazy2[rt]; lazy2[rt]=0;}void update2(__int64 L,__int64 R,__int64 c,__int64 l,__int64 r,__int64 rt){ __int64 mid; if(L<=l&&r<=R) { lazy2[rt]+=c; return ; } pushdown2(rt); if(r>l) { mid=(l+r)>>1; if(L<=mid)update2(L,R,c,lson); if(R>mid)update2(L,R,c,rson); }}__int64 search2(__int64 d,__int64 l,__int64 r,__int64 rt){ __int64 mid; pushdown2(rt); if(l==r) return cover[rt]; mid=(l+r)>>1; if(d<=mid) return search2(d,lson); else return search2(d,rson);}int main(){ __int64 i,j,k,l,n,m,kk,le,ri; while(scanf("%I64d%I64d%I64d",&n,&m,&kk)!=EOF) { for(i=1;i<=n;i++) scanf("%I64d",&a[i]); for(i=1;i<=m;i++) scanf("%I64d%I64d%I64d",&op[i][0],&op[i][1],&op[i][2]); build1(1,m,1); for(i=1;i<=kk;i++) { scanf("%I64d%I64d",&le,&ri); update1(le,ri,1,m,1); } build2(1,n,1); for(i=1;i<=m;i++) { j=op[i][2]; k=search1(i,1,m,1); update2(op[i][0],op[i][1],j*k,1,n,1); } for(i=1;i<n;i++) printf("%I64d ",a[i]+search2(i,1,n,1)); printf("%I64d\n",a[i]+search2(i,1,n,1)); } return 0;}
0 0
- Codeforces Round #179 (Div. 1) A题 线段树
- 线段树Codeforces Round #169 (Div. 2)(好题)
- Codeforces Round #275 (Div. 2) D题 (线段树)
- 【线段树延迟更新】Codeforces Round #104 (Div. 1) E
- Codeforces Round #200 (Div. 1) (树上的线段树)
- 线段树Codeforces Beta Round #99 (Div. 1)C
- Codeforces Round #250 (Div. 1) D 线段树
- Codeforces Round #225 (Div. 1) C 树状数组 || 线段树
- Codeforces Round #275 Div.1 B Interesting Array --线段树
- Codeforces Round #225 (Div. 1)C(dfs+线段树)
- Codeforces Round #225 (Div. 1)-C. Propagating tree(线段树)
- 线段树Codeforces Round #136 (Div. 2)
- Codeforces Round #312 (Div. 2) E. A Simple Task 线段树 延时标记
- [Codeforces Round#312 Div.2] A Simple Task 【线段树+lazy_tag】
- A Simple Task(Codeforces Round #312 (Div. 2) 线段树+计数排序)
- Codeforces Round #312 (Div. 2) E A Simple Task 线段树
- Codeforces Round #333 (Div. 2) B. Approximating a Constant Range (线段树区间最值)
- Codeforces Round #442 (Div. 2) E. Danil and a Part-time Job【线段树+dfs序】
- 解决android SDK更新不了问题
- android应用抓包
- iOS企业开发者计划介绍及使用方法
- $(addprefix PREFIX,NAMES…)
- GCC使用
- Codeforces Round #179 (Div. 1) A题 线段树
- 火车进站出站问题
- iOS页面跳转及数据传递
- SEAndroid笔记(二)
- 45 个非常有用的 Oracle 查询语句
- 两种不同的方法使用不当Animation 四个动画效果Alpha.Scale.Rotate.Translate
- shell 面试题
- oracle sql日期比较
- Android下取出partition数据