hdu6464 线段树
http://acm.hdu.edu.cn/showproblem.php?pid=6464
题意
一个空序列,q次操作,一种是往序列后插入x个y,另一种是查询序列中第x小到第y小的数字之和
题解
- 线段树维护区间和,区间个数
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN=1e5+5;
const int P=1e9+7;
ll V[MAXN<<2],W[MAXN<<2],b[MAXN],lt[MAXN],x[MAXN],y[MAXN];
int sz=0,Q[MAXN];
int tot=0;
void push_up(int o){
V[o]=V[o<<1]+V[o<<1|1];V[o]%=P;
W[o]=W[o<<1]+W[o<<1|1];
}
void ud(int o,int l,int r,int p,ll v){
if(l==r){W[o]+=v;V[o]+=b[l]%P*v%P;V[o]%=P;return;}
int mid=(l+r)/2;
if(p<=mid)ud(o<<1,l,mid,p,v);
else ud(o<<1|1,mid+1,r,p,v);
push_up(o);
}
int search(int o,int l,int r,ll k){
if(l==r){lt[++tot]=k;return l;}
int mid=(l+r)/2;
if(k<=W[o<<1])return search(o<<1,l,mid,k);
else return search(o<<1|1,mid+1,r,k-W[o<<1]);
}
ll qy(int o,int l,int r,int L,int R){
if(L>R)return 0;
if(L<=l&&r<=R)return V[o];
int mid=(l+r)/2;
ll ans=0;
if(L<=mid){ans+=qy(o<<1,l,mid,L,R);ans%=P;}
if(R>mid){ans+=qy(o<<1|1,mid+1,r,L,R);ans%=P;}
return ans;
}
ll qW(int o,int l,int r,int p){
if(l==r)return W[o];
int mid=(l+r)/2;
if(p<=mid)return qW(o<<1,l,mid,p);
else return qW(o<<1|1,mid+1,r,p);
}
int q;
int id(ll x){
return lower_bound(b+1,b+sz+1,x)-b;
}
int main(){
cin>>q;
for(int i=0;i<q;i++){
scanf("%d%lld%lld",&Q[i],&x[i],&y[i]);
if(Q[i]==1)b[++sz]=y[i];
}
sort(b+1,b+sz+1);sz=unique(b+1,b+sz+1)-(b+1);
//for(int i=1;i<=sz;i++)cout<<b[i]<<" ";
//cout<<endl;
for(int i=0;i<q;i++){
if(Q[i]==1){
ud(1,1,sz,id(y[i]),x[i]);
}else{
tot=0;
int A=search(1,1,sz,x[i]);
int B=search(1,1,sz,y[i]);
//cout<<A<<" "<<B<<endl;
ll ans=0;
if(A==B){ans=(lt[2]-lt[1]+1)*b[A]%P;}
else{
ans=qy(1,1,sz,A+1,B-1);
ans+=(qW(1,1,sz,A)-lt[1]+1)*b[A]%P;ans%=P;
ans+=lt[2]*b[B]%P;ans%=P;
}
printf("%lld\n",ans);
}
}
}
hdu6464 线段树的更多相关文章
- bzoj3932--可持久化线段树
题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树
#44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...
- CF719E(线段树+矩阵快速幂)
题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...
- 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序
3779: 重组病毒 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 224 Solved: 95[Submit][Status][Discuss] ...
- 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1878 Solved: 846[Submit][Status ...
随机推荐
- React 基础笔记
概览 React 是一个声明式,高效且灵活的用于构建用户界面的 JavaScript库.可以将一些简短.独立的代码片段组合成复杂的UI界面,这些片段被称为"组件". React 大 ...
- 团队项目之Scrum4
小组:BLACK PANDA 时间:2019.11.24 每天举行站立式会议 提供当天站立式会议照片一张 2 昨天已完成的工作 2 基本实现web富文本编辑功能 后台的编辑接口已经基本完成,还有一些b ...
- 使用Eclipse开发Web项目(JSP)——简单登录、无sql
1.使用Eclipse开发Web项目(JSP) tomcat 2.在Eclipse中创建的Web项目: 浏览器可以直接访问webContent中的文件 例如http://localhost:8080/ ...
- [译]Vulkan教程(15)图形管道基础之RenderPass
[译]Vulkan教程(15)图形管道基础之RenderPass Render passes Setup 设置 Before we can finish creating the pipeline, ...
- php isset()和 in_array()
结果: 结论: isset()完胜
- Java入门总结
1. 一个Java源码只能定义一个public类型的class,并且class名称和文件名要完全一致: 使用javac可以将.java源码编译成.class字节码: 使用java可以运行一个已编译的J ...
- 浅谈Httpmodules
HttpModule是ASP.NET过滤器,可以理解为HTTP请求的必经之地我们只要实现IHttpModule接口,就可以取代HttpModule namespace BookShop.Handler ...
- 保护模式中的PDE与PTE
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 保护模式中的PDE与PTE 1. PDE与PTE的认知 我们在上一 ...
- InnoSetup 根据选择的安装语言显示不同语言的(协议)License和更新说明
需求 在安装时,选择中文安装,显示中文版协议(License)文件. 在安装时,选择英文安装,显示英文版协议(License)文件. 解决 [Languages] 段中有LicenseFile属性和I ...
- 随机的标识符GUID
Guid guid = Guid.NewGuid();Console.WriteLine(guid.ToString());