CF837G - Functions On The Segments
我们考虑 \(\sum_{i=l}^r{f_i(x)}\) 是个什么东西。首先这个奇怪的东西很好离线做,所以尽管题目要求强制在线,我们还是离线下来试试。
我们发现,我们可以 \(x\) 坐标从 \(1\) 到 \(200000\) 扫过去,对于每个 \(f_i\),在 \(x_{i,1}+1\) 和 \(x_{i,2}+1\) 两个位置打标记进行更改。这样整个扫描过程就是 \(O(k+n)\) 的。然后考虑维护答案,我们发现,\(y=y_1\) 和 \(y=y_2\) 其实可以写成 \(y=0x+y_1,y=0x+y_2\) 的形式。那么,我们的 \(f_i(x)\) 就可以统一写成 \(ax+b\) 的形式。则 \(\sum_{i=l}^r{f_i(x)}=(\sum_{i=l}^r{a_i})x+\sum_{i=l}^r{b_i}\)。
这样,我们就只需要维护 \(a\) 和 \(b\) 的区间和。我们分别开两个线段树维护 \(a\) 和 \(b\) 的区间和。每次更改,就单点修改位置 \(i\) 上面的 \(a_i\) 和 \(b_i\)。然后我们提前把所有的询问挂在自己的 \(x_i\) 上,处理完当前 \(x\) 上的所有操作之后,对所有的 \([l,r]\) 询问进行查询得到 \(\sum_{i=l}^r{a_i}\) 和 \(\sum_{i=l}^r{b_i}\)。
但是现在强制在线,怎么做呢?
我们发现,只要我们存储下每个 \(x\) 所对应的 \(a\) 和 \(b\) 序列,就可以每次快速得到答案。但是存储 \(a\) 和 \(b\) 显然不现实,我们就考虑可持久化线段树。我们找到原先的所有操作:单点修改、区间查询,这恰好是可以使用主席树完成的工作。又因为是静态的,我们完全可以把主席树处理出来之后,带到询问里去计算。
还有一个小小的问题,询问时的 \(x\) 是可能达到 \(10^9\) 的,如何做呢?我们发现 \(2\cdot 10^5\) 之后的 \(x\) 都已经到了第三阶段,也就是 \(y=y_2\),可以直接处理其前缀和,然后 \(O(1)\) 计算答案。
注意我们同一个 \(x\) 上可能有很多的操作,也可能没有操作,不能把 \(x\) 作为主席树的时间轴,而应当对每个 \(x\) 上的所有操作执行完之后,记录当前主席树的最新版本。
如果我们记 \(k\) 为 更改 操作中出现的最大 \(x\),那么时间复杂度就是 \(O(k+(n+m)\log n)\),空间复杂度 \(O(n\log n)\)。
#define rd(i,n) for(ll i=0;i<n;i++)
#define rp(i,n) for(ll i=1;i<=n;i++)
#define rep(i,a,b) for(ll i=a;i<=b;i++)
typedef long long ll;
class pst{
private:
ll sum[10000005];
int ls[10000005],rs[10000005],cnt,Len;
int root[400005],Ti;
inline void Init(int &i,int l,int r,int* a){
i=++cnt;
if(l==r){
sum[i]=a[l];
return;
}
int mid=l+r>>1;
Init(ls[i],l,mid,a);
Init(rs[i],mid+1,r,a);
sum[i]=sum[ls[i]]+sum[rs[i]];
}
inline void Modify(int &i,int his,int x,int v,int l,int r){
i=++cnt;
if(l==r){
sum[i]=v;
return;
}
int mid=l+r>>1;
if(x<=mid){
rs[i]=rs[his];
Modify(ls[i],ls[his],x,v,l,mid);
}else{
ls[i]=ls[his];
Modify(rs[i],rs[his],x,v,mid+1,r);
}
sum[i]=sum[ls[i]]+sum[rs[i]];
}
inline ll Query(int i,int L,int R,int l,int r){
if(!i)return 0;
if(L<=l&&r<=R)return sum[i];
int mid=l+r>>1;
ll res=0;
if(ls[i]&&L<=mid)res+=Query(ls[i],L,R,l,mid);
if(rs[i]&&R>mid)res+=Query(rs[i],L,R,mid+1,r);
return res;
}
public:
inline void init(int len,int* a){
Len=len;
Init(root[0],1,len,a);
}
inline void modify(int x,int v){
int cnt=++Ti;
Modify(root[cnt],root[cnt-1],x,v,1,Len);
}
inline ll query(int ti,int l,int r){
return Query(root[ti],l,r,1,Len);
}
inline int curver(){
return Ti;
}
}ta,tb;
const int N=75005;
const int M=200000;
const int P=1000000000;
int n,m,q,l,r,x,xl[N],xr[N],yl[N],yr[N],a[N],b[N],Empty[N];
ll sum[N];
int vera[M+5],verb[M+5];
vt<int>v1[M+5],v2[M+5];
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
n=in();
rp(i,n)xl[i]=in(),xr[i]=in(),yl[i]=in(),a[i]=in(),b[i]=in(),yr[i]=in();
rp(i,n)v1[xl[i]+1].pb(i),v2[xr[i]+1].pb(i);
ta.init(n,Empty);tb.init(n,yl);
rep(ti,1,M){
for(auto j:v1[ti]){
ta.modify(j,a[j]);
tb.modify(j,b[j]);
}
for(auto j:v2[ti]){
ta.modify(j,0);
tb.modify(j,yr[j]);
}
vera[ti]=ta.curver();
verb[ti]=tb.curver();
}
rp(i,n)sum[i]=sum[i-1]+yr[i];
q=in();
ll ans=0;
rd(_,q){
l=in(),r=in(),x=in();
x=(x+ans)%P;
if(x<=M){
ans=ta.query(vera[x],l,r)*x+tb.query(verb[x],l,r);
}else{
ans=sum[r]-sum[l-1];
}
out(ans)('\n');
}
return 0;
}
//Crayan_r
CF837G - Functions On The Segments的更多相关文章
- CF数据结构练习(二)
1. 833D Red-Black Cobweb 大意: 给定树, 边为黑色或白色, 求所有黑白边比例在$[\frac{1}{2},2]$内的路径边权乘积的乘积. 考虑点分治, 记黑边数为$a$, 白 ...
- R Customizing graphics
Customizing graphics GraphicsLaTeXLattice (Treillis) plots In this chapter (it tends to be overly co ...
- (转) Functions
Functions Functions allow to structure programs in segments of code to perform individual tasks. In ...
- IDA .edata .rdata .idata .text segments
.rdata is for const data. It is the read only version of the .data segment. .idata holds the import ...
- [LeetCode] Number of Segments in a String 字符串中的分段数量
Count the number of segments in a string, where a segment is defined to be a contiguous sequence of ...
- Greenplum记录(一):主体结构、master、segments节点、interconnect、performance monitor
结构:Client--master host--interconnect--segment host 每个节点都是单独的PG数据库,要获得最佳的性能需要对每个节点进行独立优化. master上不包含任 ...
- Application package 'AndroidManifest.xml' must have a minimum of 2 segments.
看了源码就是packagename里面必须包含一个. 源码在: ./sdk/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/id ...
- asp.net MVC helper 和自定义函数@functions小结
asp.net Razor 视图具有.cshtml后缀,可以轻松的实现c#代码和html标签的切换,大大提升了我们的开发效率.但是Razor语法还是有一些棉花糖值得我们了解一下,可以更加强劲的提升我们 ...
- segments&cache
Segments 执行效果 命令 在 sense 里边执行 GET /abcd/_segments 前边的是索引名称,后边是请求 段信息 说明 索引是面向分片的,是由于索引是由一个或多个分片( ...
- 【跟着子迟品 underscore】Array Functions 相关源码拾遗 & 小结
Why underscore 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. 阅读一些著名框架类库的源码,就好像和一个个大师对 ...
随机推荐
- python基础语法&数据类型&运算符
1.标识符 # -*- coding:utf-8 -*- # @Time :2021/1/16 10:28 # @Author :QAbujiaban # @Email :wbxztoo@163.co ...
- week_2
Andrew Ng 机器学习笔记 ---by OrangeStar Week_2 1.Multiple Features 更有效的线性回归形式 此时,h函数已经不是二阶了. \[ X = \begin ...
- 百倍加速IO读写!快使用Parquet和Feather格式!⛵
作者:韩信子@ShowMeAI 数据分析实战系列:https://www.showmeai.tech/tutorials/40 本文地址:https://www.showmeai.tech/artic ...
- JavaScript:对象:如何去遍历输出一个对象的属性?语句for-in
使用for-in的for循环语句,可以去遍历一个对象的属性,这类似于Java的增强for循环: 但是注意,这并不能遍历对象的所有属性,有些隐藏的属性,是无法遍历出来的,虽然我们可以通过控制台去查看这些 ...
- 大数据 - DWM层 业务实现
DWM 建表,需要看 DWS 需求. DWS 来自维度(访客.商品.地区.关键词),为了出最终的指标 ADS 需求指标 DWT 为什么实时数仓没有DWT,因为它是历史的聚集,累积结果,实时数仓中不需要 ...
- .Net 7 团队把国内的龙芯确实当做一等公民和弃用的项目
楔子: 国内龙芯据说是用的自己的指令集,在研究ILC的时候,发现了龙芯在微软那边确实是一等公民的存在. 龙芯官网 龙芯平台.NET,是龙芯公司基于开源社区.NET独立研发适配的龙芯版本,我们会长期进行 ...
- 一步步教你在Edge浏览器上安装网风笔记
微软于2022年6月15日正式结束对浏览器"Internet Explorer (IE)"的支持,IE已正式退出历史舞台,取而代之的是目前风头正盛的被微软称为当今最好用的Edge浏 ...
- VMware搭建内网渗透环境
网络结构: 攻击机:kali 192.168.1.103 DMZ区域:防火墙 WAN:192.168.1.104 LAN:192.168.10.10 winserver03 LAN:192.168.1 ...
- [C++]const_cast,dynamic_cast,reinterpret_cast,static_cast转型
C++四种新式转型: const_cast(expression) dynamic_cast(expression) reinterpret_cast(expression) static_cast( ...
- 扒一扒Bean注入到Spring的那些姿势,你会几种?
大家好,我是三友~~ 这篇文章我准备来扒一扒Bean注入到Spring的那些姿势. 其实关于Bean注入Spring容器的方式网上也有很多相关文章,但是很多文章可能会存在以下常见的问题 注入方式总结的 ...