2019牛客暑假多校7E:Find the median【线段树上二分】
题目:
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【线段树上二分】相关推荐
- 2019牛客暑假多校训练 第四场 triples I 按位或运算
链接:https://ac.nowcoder.com/acm/contest/884/D 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
- 2019牛客暑假多校训练赛第七场C Governing sand(暴力)
题目链接:https://ac.nowcoder.com/acm/contest/887/C 题意:给出n种树和n个h[i],c[i],p[i]代表每种树的高度,砍掉一棵的花费,树的个数.现在要求砍掉 ...
- 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∗ ...
- 2019牛客暑期多校训练营(第四场)----E- triples II
首先发出题目链接: 链接:https://ac.nowcoder.com/acm/contest/884/E 来源:牛客网 涉及:位运算,容斥定义,dp 点击这里回到2019牛客暑期多校训练营解题-目 ...
- 2019牛客暑期多校9H:Cutting Bamboos【主席树+二分】
题目: 2019牛客暑期多校训练营9H:Cutting Bamboos 题意: 给出一排竹子,然后给出Q次询问,每次询问你需要水平砍y刀将[L,R]区间里的竹子砍完,并且每次砍下的竹子高度和一样,问第 ...
- 2021牛客暑假多校第二场 K题—Stack (链表)
2021牛客暑假多校第二场 K题-Stack 题意: 一个单调栈,给你第n次操作时里面数据的数量,让你给出里面塞入的会是哪些数字. 主要思想:链表模拟 (代码里面有注释) (题解一开始说的是拓扑,后来 ...
- 2019牛客暑期多校训练营(第三场)H.Magic Line
2019牛客暑期多校训练营(第三场)H.Magic Line 题目链接 题目描述 There are always some problems that seem simple but is diff ...
- 2021牛客暑假多校第八场 K题—Yet Another Problem About Pi
2021牛客暑假多校第八场 K题-Yet Another Problem About Pi 题意:告诉你一个单元格的长和宽,问你走Π(3.1415926-)的长度距离最多可以走几个单元格 思路:沿着单 ...
- 暑假N天乐【比赛篇】 —— 2019牛客暑期多校训练营(第三场)
这场相对来说友好一点,本来前几天就补差不多了,然后忘记发了... 以下题解包括:\(A \ \ \ B \ \ \ F \ \ \ G \ \ \ H \ \ \ J\) \(D\) 题队友补了,我也 ...
最新文章
- 我哭了,工业界AI项目落地有多难?
- 零基础python入门课程-零基础 Python 入门
- python paramiko 问题总结
- Leetcode双指针滑动窗口相关题目
- Windows x64内核学习笔记(三)—— SMEP SMAP
- webflow_Webflow是否适合开发人员? 我的经验
- 第五周软件工程作业-每周例行报告
- CentOS6 安装Sendmail + Dovecot + Squirrelmail
- waitpid调用返回出错提示: No child processes问题
- Javascript 刷新框架及页面的方法汇总(转)
- 双轴旋转云台plc控制_Robomaster电控入门(7)双轴云台控制
- 高精度乘法+刘汝佳BigNumber高精度结构体
- 配置paraview 服务器
- 周鸿祎:做到这五点,才算是好用户体验
- 远程接入Linux、unix、Windows工具-opentext ETX
- 用Qt实现Q-M算法化简逻辑表达式及Qt项目打包发布方法
- 房价,经济转型,技术创新
- 手机web字体css设置,手机web字体css怎么设置微软雅黑
- HTML/JSP中一些单书名号标签的用途
- 小马哥---高仿红米note 刷机 主板型号T7203主板图与开机识别图 6572芯片