题目:

2019牛客暑期多校训练营第七场E:Find the median

题意:

给出N个操作,每次操作向数组中插入【L,R】的数字,每次操作后询问数组中的中位数

分析:

如果L,R都比较小,就可以建一颗权值线段树,然后根据左右节点的数量直接二分查询;这里L,R很大,同样用权值线段树的思想,只不过这里的叶子节点不在是一个数字,而是一段数字;具体做法:先将【Li,Ri】离线后离散化,用 1 表示[w[1],w[2])这段数字,依次类推;需要维护每个节点下数字的个数和每段数字出现的次数;查询时,一定要到叶子节点,假设叶子节点代表[L,R)的数字,整段出现了tag[x]次,那么要找到这些数中的第K小,这很好求的

代码:

#include <bits/stdc++.h>using namespace std;
typedef long long LL;
const int maxn = 4e5+45;
int n,cnt,a2,a1,b2,b1,c2,c1,m2,m1;
int w[maxn<<1],x[maxn],y[maxn],L[maxn],R[maxn];
void init()
{for(int i = 3;i <= n; ++i){x[i] = (1ll*a1*x[i-1]+1ll*b1*x[i-2]+c1) % m1;y[i] = (1ll*a2*y[i-1]+1ll*b2*y[i-2]+c2) % m2;}for(int i = 1;i <= n; ++i){L[i] = min(x[i],y[i])+1;R[i] = max(x[i],y[i])+2;//这里我Ri多加了1,契合左闭右开,也不会有Li==Ri的情况w[++cnt] = L[i]; w[++cnt] = R[i];}sort(w+1,w+cnt+1); cnt = unique(w+1,w+cnt+1)-w;
}
LL tr[maxn<<3],tag[maxn<<3];
inline void pushdown(int x,int l,int r){int mid = (l+r)>>1;tag[x<<1] += tag[x];tag[x<<1|1] += tag[x];tr[x<<1] += tag[x]*(w[mid+1]-w[l]);tr[x<<1|1] += tag[x]*(w[r+1]-w[mid+1]);tag[x] = 0;
}
void UpdataTree(int l,int r,int L,int R,int x,LL val){if(l > R || r < L) return;if(l >= L && r <= R){tr[x] += val*(w[r+1]-w[l]);tag[x] += val;return ;}if(tag[x]) pushdown(x,l,r);int mid = (l+r)>>1;UpdataTree(l,mid,L,R,x<<1,val);UpdataTree(mid+1,r,L,R,x<<1|1,val);tr[x] = tr[x<<1]+tr[x<<1|1];
}
void QueryTree(int l,int r,int x,LL k,int &ans){if(l == r){int t = k/tag[x];if(k-t*tag[x]>0) t++;ans = w[l]+t-1;return ;}if(tag[x]) pushdown(x,l,r);int mid = (l+r)>>1;if(tr[x<<1] >= k) QueryTree(l,mid,x<<1,k,ans);else QueryTree(mid+1,r,x<<1|1,k-tr[x<<1],ans);
}
void solve(){LL sum = 0; int ans;for(int i = 1;i <= n; ++i){int l = lower_bound(w+1,w+cnt,L[i])-w;int r = lower_bound(w+1,w+cnt,R[i])-w;UpdataTree(1,cnt,l,r-1,1,1);   //r减了1sum += w[r] - w[l];QueryTree(1,cnt,1,(sum+1)/2,ans);printf("%d\n",ans);}
}
int main(){scanf("%d",&n);scanf("%d%d%d%d%d%d",&x[1],&x[2],&a1,&b1,&c1,&m1);scanf("%d%d%d%d%d%d",&y[1],&y[2],&a2,&b2,&c2,&m2);init(); solve();return 0;
}

2019牛客暑假多校7E:Find the median【线段树上二分】相关推荐

  1. 2019牛客暑假多校训练 第四场 triples I 按位或运算

    链接:https://ac.nowcoder.com/acm/contest/884/D 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  2. 2019牛客暑假多校训练赛第七场C Governing sand(暴力)

    题目链接:https://ac.nowcoder.com/acm/contest/887/C 题意:给出n种树和n个h[i],c[i],p[i]代表每种树的高度,砍掉一棵的花费,树的个数.现在要求砍掉 ...

  3. 2019牛客暑期多校训练营(第五场)C generator 2 (BSGS)

    2019牛客暑期多校训练营(第五场)C generator 2 思路 x0=x0x_0 = x_0x0​=x0​ x1=a∗x0∗bx_1 = a * x_0 * bx1​=a∗x0​∗b x2=a∗ ...

  4. 2019牛客暑期多校训练营(第四场)----E- triples II

    首先发出题目链接: 链接:https://ac.nowcoder.com/acm/contest/884/E 来源:牛客网 涉及:位运算,容斥定义,dp 点击这里回到2019牛客暑期多校训练营解题-目 ...

  5. 2019牛客暑期多校9H:Cutting Bamboos【主席树+二分】

    题目: 2019牛客暑期多校训练营9H:Cutting Bamboos 题意: 给出一排竹子,然后给出Q次询问,每次询问你需要水平砍y刀将[L,R]区间里的竹子砍完,并且每次砍下的竹子高度和一样,问第 ...

  6. 2021牛客暑假多校第二场 K题—Stack (链表)

    2021牛客暑假多校第二场 K题-Stack 题意: 一个单调栈,给你第n次操作时里面数据的数量,让你给出里面塞入的会是哪些数字. 主要思想:链表模拟 (代码里面有注释) (题解一开始说的是拓扑,后来 ...

  7. 2019牛客暑期多校训练营(第三场)H.Magic Line

    2019牛客暑期多校训练营(第三场)H.Magic Line 题目链接 题目描述 There are always some problems that seem simple but is diff ...

  8. 2021牛客暑假多校第八场 K题—Yet Another Problem About Pi

    2021牛客暑假多校第八场 K题-Yet Another Problem About Pi 题意:告诉你一个单元格的长和宽,问你走Π(3.1415926-)的长度距离最多可以走几个单元格 思路:沿着单 ...

  9. 暑假N天乐【比赛篇】 —— 2019牛客暑期多校训练营(第三场)

    这场相对来说友好一点,本来前几天就补差不多了,然后忘记发了... 以下题解包括:\(A \ \ \ B \ \ \ F \ \ \ G \ \ \ H \ \ \ J\) \(D\) 题队友补了,我也 ...

最新文章

  1. 我哭了,工业界AI项目落地有多难?
  2. 零基础python入门课程-零基础 Python 入门
  3. python paramiko 问题总结
  4. Leetcode双指针滑动窗口相关题目
  5. Windows x64内核学习笔记(三)—— SMEP SMAP
  6. webflow_Webflow是否适合开发人员? 我的经验
  7. 第五周软件工程作业-每周例行报告
  8. CentOS6 安装Sendmail + Dovecot + Squirrelmail
  9. waitpid调用返回出错提示: No child processes问题
  10. Javascript 刷新框架及页面的方法汇总(转)
  11. 双轴旋转云台plc控制_Robomaster电控入门(7)双轴云台控制
  12. 高精度乘法+刘汝佳BigNumber高精度结构体
  13. 配置paraview 服务器
  14. 周鸿祎:做到这五点,才算是好用户体验
  15. 远程接入Linux、unix、Windows工具-opentext ETX
  16. 用Qt实现Q-M算法化简逻辑表达式及Qt项目打包发布方法
  17. 房价,经济转型,技术创新
  18. 手机web字体css设置,手机web字体css怎么设置微软雅黑
  19. HTML/JSP中一些单书名号标签的用途
  20. 小马哥---高仿红米note 刷机 主板型号T7203主板图与开机识别图 6572芯片

热门文章

  1. UE4汽车导入,并行驶
  2. hive 上卷下钻聚合函数使用
  3. 数据结构上机-尾、头插法建立单链表-单链表遍历C语言完整代码实现
  4. 程序员的十年之功(经典文章翻译)
  5. 微信管制下,如何让你的H5诱导分享更高效?
  6. 钛备份-Android备份神器
  7. 一女生上厕所忘带纸了。
  8. Matlab高频强调滤波增强,高斯高通滤波器,巴特沃斯高通滤波器图像处理
  9. 计算机小白学什么软件,作为一个电脑小白,有啥方法快速掌握办公软件?
  10. 记第一次完成-jsp小项目-jsp商城+源码