poj3468 A Simple Problem with Integers (线段树段修改)
来源:互联网 发布:淘宝店铺注册单可靠吗 编辑:程序博客网 时间:2024/06/07 18:47
题意:线段树段修改的板子题
思路:套板子,注意mark _down和值都要用longlong
#include <cstdio> #include<iostream> typedef long long ll; using namespace std; const int maxn=100000*5+100; struct segn { ll su,mark_add; }segt[maxn]; void push_dowm_segadd(int root,int st,int en) { if(segt[root].mark_add!=0) { segt[root*2+1].su+=((st+en)/2-st+1)*segt[root].mark_add; segt[root*2+2].su+=(en-(st+en)/2)*segt[root].mark_add; segt[root*2+1].mark_add+=segt[root].mark_add; segt[root*2+2].mark_add+=segt[root].mark_add; segt[root].mark_add=0; } } void build(ll *arr,int root,int st,int en) { if(st==en) { segt[root].mark_add=0; segt[root].su=arr[st]; return; } int mid=(st+en)/2; build(arr,root*2+1,st,mid); build(arr,root*2+2,mid+1,en); segt[root].su=segt[root*2+1].su+segt[root*2+2].su; } void segadd(int qst,int qen,int tst,int ten,int root,ll addnum) { if(qst>ten||qen<tst)//不符合的区间 { return ; } if(tst>=qst&&ten<=qen)//找到要加的区间 { segt[root].mark_add+=addnum; segt[root].su+=addnum*(ten-tst+1); return ; } int mid =(tst+ten)/2; push_dowm_segadd(root,tst,ten); segadd(qst,qen,tst,mid,root*2+1,addnum); segadd(qst,qen,mid+1,ten,root*2+2,addnum); if(tst!=ten)segt[root].su=segt[root*2+1].su+segt[root*2+2].su; }ll query(int root,int qst,int qen,int tst,int ten){ if(segt[root].mark_add!=0&&tst!=ten)push_dowm_segadd(root,tst,ten); if(qst>ten||qen<tst)return 0; if(qst<=tst&&qen>=ten)return segt[root].su; ll mm= query(2*root+1,qst,qen,tst,(tst+ten)/2)+query(2*root+2,qst,qen,(tst+ten)/2+1,ten); if(tst!=ten)segt[root].su=segt[root*2+1].su+segt[root*2+2].su; return mm;}int main(){ int n,qn; ll arr[100100]; while(~scanf("%d%d",&n,&qn)) { for(int i=0;i<n;i++) { // scanf("%d",&arr[i]); cin>>arr[i]; } build(arr,0,0,n-1); char gr[3]; int st,en;ll num; while(qn--) { scanf("%s",gr); if(gr[0]=='C') { cin>>st>>en>>num; segadd(st-1,en-1,0,n-1,0,num); } else if(gr[0]=='Q') { scanf("%d%d",&st,&en); cout<<query(0,st-1,en-1,0,n-1)<<endl; } //for(int i=0;i<2*n;i++)cout<<segt[i].su<<" ";cout<<endl; } }}
阅读全文
0 0
- poj3468 A Simple Problem with Integers (线段树段修改)
- POJ3468-A Simple Problem with Integers(线段树 成段更新求和)
- poj3468 A Simple Problem with Integers(spaly&&线段树)
- poj3468 A Simple Problem with Integers(线段树)
- poj3468(A Simple Problem with Integers)线段树实现
- poj3468 A Simple Problem with Integers(线段树)
- POJ3468 A Simple Problem with Integers(线段树)
- POJ3468 A Simple Problem with Integers(线段树)
- poj3468:A Simple Problem with Integers(线段树lazy)
- poj3468 A Simple Problem with Integers(线段树区间修改)
- POJ3468 A Simple Problem with Integers(线段树区间修改)
- POJ3468--A Simple Problem with Integers(成段更新)
- poj3468 A Simple Problem with Integers(成段更新)
- POJ3468 A Simple Problem with Integers 线段树 区间成段更新+区间求和
- poj3468 A Simple Problem with Integers 线段树,成段更新
- POJ3468 A Simple Problem with Integers 【线段树】+【成段更新】
- 线段树---poj3468 A Simple Problem with Integers:成段增减:区间求和
- poj3468 A Simple Problem with Integers 线段树的扩展
- Java LinkedList
- Egret-H5游戏开发之性能优化总结
- 下拉刷新html
- [arc066e]Addition and Subtraction Hard
- 记录篇,自己在项目中使用过的。
- poj3468 A Simple Problem with Integers (线段树段修改)
- 关于Python里MYSQL使用变量作为表名时该如何使用
- Java常用链接与学习
- MongoDB管理用户并启用身份验证
- CSS巩固学习之一
- 2017-11-16
- PHP date格式化时间戳
- DevOps监控微服务的五条原则
- 汇编(七)