题意:

初始序列为空。一共 NNN 次操作,每次操作往序列中加入区间 [L,R][L,R][L,R] 中的所有数。每次操作结束后询问当前序列中的中位数。(1≤N≤4∗105,1≤L≤R≤109)(1\leq N\leq 4*10^5,1\leq L\leq R\leq 10^9)(1≤N≤4∗105,1≤L≤R≤109)


思路:

涉及到了中位数,因此不难想到权值线段树。但是每次是对一个区间 +1+1+1,而且这个区间范围非常大,因此显然不能将整个区间的数存下来。对区间的端点进行离散化是一步显然的操作。

赛后看完题,第一个想法是区间离散化之后,点 xxx 维护一个 sum[x]sum[x]sum[x],表示 111 ~ xxx 中一共有多少个数。每次区间操作 [L,R][L,R][L,R],对于大于等于 RRR 的所有节点,sum=sum+R−L+1sum=sum+R-L+1sum=sum+R−L+1。对于区间 [L,R][L,R][L,R] 之间的数字,sum[x]=sum[x]+x−L+1sum[x]=sum[x]+x-L+1sum[x]=sum[x]+x−L+1,因此先区间加上 −L+1-L+1−L+1,再让区间中第 xxx 个点加上 xxx,即一共有两种加法操作,也需要维护两个加法 lazylazylazy。

之后看了一些其它的题解,发现并不需要这么麻烦,可以将操作进行简化。

首先对于区间 [L,R][L,R][L,R],将 R=R+1R=R+1R=R+1 进行离散化,线段树中每个节点维护一个 sum[x]sum[x]sum[x] 表示有多少个数在 [sum[x],sum[x+1])[sum[x],sum[x+1])[sum[x],sum[x+1]) 这个区间中,注意右端点为开区间。

例如区间操作 [1,8][1,8][1,8],右端点 +1+1+1 为 [1,9][1,9][1,9],离散化之后 sum[1]=9−1=8,sum[9]=0sum[1]=9-1=8,sum[9]=0sum[1]=9−1=8,sum[9]=0。可以发现将右端点 +1+1+1 的目的就是为了避免算个数时 +1+1+1 等操作,简化一些细节,降低出错率。

因此对于一个区间操作,只需另该区间中涉及的每一个端点(即其它区间离散化后的端点)加上当前端点到后一个端点之间数的个数即可,具体可以看看代码,也可以自己根据节点意义来进行推演,不要力图看懂每一个细节,应该追求点到为止,其余部分让自己来思考。


总结:

这道权值线段树的问题,主要关键在于你如何定义线段树节点代表的意义。如果按我一开始的想法去定义的话,必然会涉及到维护两种不同的 lazylazylazy,而按照后一种想法去定义,则只需要维护一个信息。

此处两种定义方法主要区别在于,第一种在每个节点处维护的是前面所有节点的信息,而第二种只维护当前节点和后一个节点之间的信息,因此大大降低了复杂程度。

这有一定程度上启发了我们,定义线段树节点状态时,不要妄图维护所有的信息,只需要维护单个节点或者与前后节点之间的信息即可,切忌维护过多。毕竟维护过多就代表信息发生了重叠,而重叠部分即为无用功。


代码:

#include <bits/stdc++.h>
#define __ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define rep(i,a,b) for(int i = a; i <= b; i++)
#define LOG1(x1,x2) cout << x1 << ": " << x2 << endl;
#define LOG2(x1,x2,y1,y2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << endl;
#define LOG3(x1,x2,y1,y2,z1,z2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << " , " << z1 << ": " << z2 << endl;
typedef long long ll;
typedef double db;
const db EPS = 1e-9;
const int N = 4*1e5+100;
using namespace std;int n,tot;
ll a1,b1,c1,m1;
ll a2,b2,c2,m2;
ll b[2*N],X[N],Y[N],L[N],R[N],sum[4*N],lazy[4*N],c[2*N]; //c[N]:维护前缀和int find(ll x){return lower_bound(b+1,b+1+tot,x)-b;
}inline int get_id(int l,int r) {return (l+r)|(l!=r);}void push_down(int l,int r){int mid = (l+r)>>1;int now = get_id(l,r), ls = get_id(l,mid), rs = get_id(mid+1,r);sum[ls] += lazy[now]*(c[mid]-c[l-1]); sum[rs] += lazy[now]*(c[r]-c[mid]);lazy[ls] += lazy[now]; lazy[rs] += lazy[now];lazy[now] = 0;
}void update(int l,int r,int lp,int rp){int now = get_id(l,r);if(lp <= l && r <= rp){sum[now] += c[r]-c[l-1];lazy[now]++;return;}if(lazy[now]) push_down(l,r);int mid = (l+r)>>1;if(lp <= mid) update(l,mid,lp,rp);if(rp > mid) update(mid+1,r,lp,rp);sum[now] = sum[get_id(l,mid)]+sum[get_id(mid+1,r)];
}ll query(int l,int r,ll num){int now = get_id(l,r);if(l == r){ll len = b[r+1]-b[r];ll hp = sum[now];ll cnt = hp/len; //每个点有几个return (b[l]+(num-1)/cnt);}if(lazy[now]) push_down(l,r);int mid = (l+r)>>1;if(sum[get_id(l,mid)] < num) return query(mid+1,r,num-sum[get_id(l,mid)]);else return query(l,mid,num);
}int main()
{scanf("%d",&n);scanf("%lld%lld%lld%lld%lld%lld",&X[1],&X[2],&a1,&b1,&c1,&m1);scanf("%lld%lld%lld%lld%lld%lld",&Y[1],&Y[2],&a2,&b2,&c2,&m2);rep(i,1,n){if(i >= 3){X[i] = (a1*X[i-1]+b1*X[i-2]+c1)%m1;Y[i] = (a2*Y[i-1]+b2*Y[i-2]+c2)%m2;}L[i] = min(X[i],Y[i])+1ll;R[i] = max(X[i],Y[i])+1ll;b[++tot] = L[i]; b[++tot] = R[i]+1;}sort(b+1,b+1+tot);tot = unique(b+1,b+1+tot)-b-1;rep(i,1,n){L[i] = find(L[i]); R[i] = find(R[i]+1);R[i]--;}rep(i,1,tot-1) c[i] = b[i+1]-b[i]+c[i-1];ll total = 0;rep(i,1,n){   update(1,tot,L[i],R[i]);total += b[R[i]+1]-b[L[i]];ll num = (total+1ll)/2ll;printf("%lld\n",query(1,tot,num));}return 0;
}
/*
题意:每个给出一个区间,在序列中添加上这个区间的所有数,每次插入时询问中位数
*/

【2019牛客暑期多校训练营(第七场)E】Find the median【权值线段树】相关推荐

  1. 【2019牛客暑期多校训练营(第二场) - H】Second Large Rectangle(单调栈,全1子矩阵变形)

    题干: 链接:https://ac.nowcoder.com/acm/contest/882/H 来源:牛客网 题目描述 Given a N×MN \times MN×M binary matrix. ...

  2. 2019牛客暑期多校训练营(第一场)E-ABBA(dp)

    链接:https://ac.nowcoder.com/acm/contest/881/E 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语言1048 ...

  3. 2019牛客暑期多校训练营(第一场)

    传送门 参考资料: [1]:官方题解(提取码:t050 ) [2]:标程(提取码:rvxr ) [3]:牛客题解汇总 A.Equivalent Prefixes(单调栈) •题意 定义两个数组 u,v ...

  4. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...

  5. 【2019牛客暑期多校训练营(第二场)- E】MAZE(线段树优化dp,dp转矩阵乘法,线段树维护矩阵乘法)

    题干: 链接:https://ac.nowcoder.com/acm/contest/882/E?&headNav=acm 来源:牛客网 Given a maze with N rows an ...

  6. 【2019牛客暑期多校训练营(第二场)- F】Partition problem(dfs,均摊时间优化)

    题干: 链接:https://ac.nowcoder.com/acm/contest/882/F 来源:牛客网 Given 2N people, you need to assign each of ...

  7. 【2019牛客暑期多校训练营(第二场) - D】Kth Minimum Clique(bfs,tricks)

    题干: 链接:https://ac.nowcoder.com/acm/contest/882/D 来源:牛客网 Given a vertex-weighted graph with N vertice ...

  8. 【2019牛客暑期多校训练营(第一场) - A】Equivalent Prefixes(单调栈,tricks)

    题干: 链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Two arrays u and v each with m distinct elem ...

  9. 【2019牛客暑期多校训练营(第一场) - H】XOR(线性基,期望的线性性)

    题干: 链接:https://ac.nowcoder.com/acm/contest/881/H 来源:牛客网 Bobo has a set A of n integers a1,a2,-,ana1, ...

  10. 2019牛客暑期多校训练营(第九场)H Cutting Bamboos(主席树+二分)

    链接:https://ac.nowcoder.com/acm/contest/889/H 来源:牛客网 题目描述 There are n bamboos arranged in a line. The ...

最新文章

  1. 查询oracle模式对象信息,ORACLE 模式和模式对象
  2. Magento模块解析
  3. Dalvik与JVM区别
  4. PCB布线技术 很好很强大
  5. jsdiff 比较文本内容差异
  6. 云顶之弈机器人法爆_LOL云顶之弈机器人出装怎么选
  7. 推荐几个Android开发非常有用的工具(for android studio)
  8. windows winrar 指令_Windows上WinRAR.exe命令行参数说明(转载) .
  9. L2-012. 关于堆的判断-PAT团体程序设计天梯赛GPLT
  10. NSIS 安装打包安装程序
  11. poi填充word,动态生成表格+LibreOffice转成pdf
  12. H3C设备网吧万兆光模块解决方案
  13. IDEA开发Springboot时,远程使用企业内部不能连接数据库的解决方法
  14. springboot 应用:异常管理,应用启动过程,应用监控 Prometheus 和 Grafana
  15. LINUX:拷贝文件src/指定目录下,文件夹图标上有个叉.更改文件权限可解决该问题。
  16. c 语言字符型转换为整形,高楼平地起!C语言数据的两种类型转换
  17. HP Chromebox G1刷Coreboot Bios
  18. 开源节流系列之工程施工篇
  19. linux如何管理进程,在嵌入式linux中进程是怎么管理的
  20. 千万高考考生的期待,蚂蚁区块链如何守护?

热门文章

  1. 转:Scrapy(爬虫框架)入门教程
  2. 对代码更有信心--单元测试工具Mockito简单介绍
  3. Python 2.7的新特性
  4. 微软的“后门”:NTSD.exe,NTSD 的远程调试功能
  5. js实现登录表单验证
  6. 数据结构实验3-带头结点的单链表
  7. oracle in table类型,Oracle Built-in Data Types(Oracle内置数据类型)
  8. 3. 使用Keras-神经网络来拟合非线性模型
  9. oracle数据库ora01012错误,Oracle自定义异常收集(二)
  10. php有意思的小程序,这应该是迄今为止最全的小程序Top 100 榜单了,php中文网诚意奉上...