我们考虑 \(\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的更多相关文章

  1. CF数据结构练习(二)

    1. 833D Red-Black Cobweb 大意: 给定树, 边为黑色或白色, 求所有黑白边比例在$[\frac{1}{2},2]$内的路径边权乘积的乘积. 考虑点分治, 记黑边数为$a$, 白 ...

  2. R Customizing graphics

    Customizing graphics GraphicsLaTeXLattice (Treillis) plots In this chapter (it tends to be overly co ...

  3. (转) Functions

    Functions Functions allow to structure programs in segments of code to perform individual tasks. In ...

  4. 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 ...

  5. [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 ...

  6. Greenplum记录(一):主体结构、master、segments节点、interconnect、performance monitor

    结构:Client--master host--interconnect--segment host 每个节点都是单独的PG数据库,要获得最佳的性能需要对每个节点进行独立优化. master上不包含任 ...

  7. Application package 'AndroidManifest.xml' must have a minimum of 2 segments.

    看了源码就是packagename里面必须包含一个. 源码在: ./sdk/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/id ...

  8. asp.net MVC helper 和自定义函数@functions小结

    asp.net Razor 视图具有.cshtml后缀,可以轻松的实现c#代码和html标签的切换,大大提升了我们的开发效率.但是Razor语法还是有一些棉花糖值得我们了解一下,可以更加强劲的提升我们 ...

  9. segments&cache

    Segments 执行效果 命令  在 sense 里边执行  GET /abcd/_segments  前边的是索引名称,后边是请求 段信息 说明  索引是面向分片的,是由于索引是由一个或多个分片( ...

  10. 【跟着子迟品 underscore】Array Functions 相关源码拾遗 & 小结

    Why underscore 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. 阅读一些著名框架类库的源码,就好像和一个个大师对 ...

随机推荐

  1. 浏览器内存漫游解决方案(js逆向)

    //浏览器内存漫游解决方案(js逆向) //原理通过ast把所有的变量,参数中间值进行内存的存储 //搜索AST-hook,进入github //现在github的库下载下来 //anyproxy n ...

  2. 2021-01-26HDOJ_Lowest_Bit

    挺水的,但也学到了简单方法 题目如下: Lowest Bit Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...

  3. 搭建漏洞环境及实战——搭建XSS测试平台

    XSS测试平台是测试XSS漏洞获取cookie并接收Web页面的平台,XSS可以做成JS能做的所有事,包括但不限于窃取cookie.后台增删文章.钓鱼.利用CSS漏洞进行传播.修改网页代码.网站重定向 ...

  4. week_11

    Andrew Ng 机器学习笔记 ---By Orangestar Week_11(the Last Week!!!!) Congratulations on making it to the ele ...

  5. ArcObjects SDK开发 024开发的技术和技巧

    1.基本技术 开发方面.会使用C#开发语言和Visual Studio开发工具.会使用WinForm或者WPF开发. 理论知识方面.了解GIS的相关概念,例如矢量数据,栅格数据,空间参考.比例尺等概念 ...

  6. 【转载】解决CHM帮助文件无法从网络共享位置上直接打开的问题的方法

    近日在内网共享了些书籍,但发现其中的.chm文件竟然无法正常打开,而文件百分百是正常的..症状:无法从网上邻居的共享位置上直接打开.chm文件.从网络共享位置上打开.chm文件,显示为空白或运行不正常 ...

  7. 常用 Git 命令行操作

    本文记录了一些常用 Git 命令行操作的具体使用方式 git clone git clone REPOSITORY_URL 拉取仓库,并使用仓库名作为本地文件名 git clone REPOSITOR ...

  8. Netty-架构设计及入门程序-3

    一.原生 NIO 存在的问题 1.NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握 Selector.ServerSocketChannel.SocketChannel.ByteBuffer等. ...

  9. Qt界面设计--侧边栏隐藏和滑出

    在日常项目中,界面布局上经常使用到侧边栏的方式,在侧边栏放置控件进行复合使用,可以实现子功能界面的隐藏和滑出,效果展示如下: 界面控件很简单,主界面QWidget,侧边栏也用一个QWidget和一个按 ...

  10. 刷题笔记——1112:C语言考试练习题_一元二次方程

    题目 1112:C语言考试练习题_一元二次方程 代码 import math while True: try: a,b,c=map(float,input().strip().split()) del ...