左闭右开线段树 2019牛客多校(第七场)E_Find the median(点代表区间
@
题意
链接:here
我理解的题意就是:初始序列为空,有\(n(400000)\)次操作,每次操作把区间\([Li,Ri]\)的数字加进序列,序列自动有序,每次操作后输出中位数是多大。
感觉赛时想的方法应该也是可以写的,很有道理可能会麻烦一点,大概就是二分答案再瞎搞一下。。
一种解析
一个套路:左闭右开线段树
还是很像权值线段树,不过叶子节点代表的不是一个点的值了,而是代表这个区间值域的情况。
添加了\(n\)个值域区间,他们会将这个大的值域切割成很多部分。显然添加\([Li,Ri]\)这个值域时,可以分解成添加了很多段值域区间。
把每个点都当成一个左闭右开的区间,把所有的\(Li,Ri+1\)离散化下来。
然后更新就是做一个区间加法的操作,一个点加了一次表示它代表的区间每个值都出现了一次。
查询就和普通权值线段树查询一样。查到叶子节点是,先算出这个区间每个值出现的次数\(len\),已知我要找排在第\(p\)位的数,这个点代表值域的左端点是\(L\),那么答案就是:\((p+len-1)/len+L-1\)。
AC_Code
#pragma comment(linker, "/STACK:102400000,102400000")
//#include<bits/stdc++.h>
#include <ctime>
#include <iostream>
#include <assert.h>
#include <vector>
#include <queue>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define fi first
#define se second
#define endl '\n'
#define o2(x) (x)*(x)
#define BASE_MAX 31
#define mk make_pair
#define eb push_back
#define SZ(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()
#define clr(a, b) memset((a),(b),sizeof((a)))
#define iis std::ios::sync_with_stdio(false); cin.tie(0)
#define my_unique(x) sort(all(x)),x.erase(unique(all(x)),x.end())
using namespace std;
#pragma optimize("-O3")
typedef long long LL;
typedef unsigned long long uLL;
typedef pair<int, int> pii;
inline LL read() {
LL x = 0;int f = 0;
char ch = getchar();
while (ch < '0' || ch > '9') f |= (ch == '-'), ch = getchar();
while (ch >= '0' && ch <= '9') x = (x << 3) + (x << 1) + ch - '0', ch = getchar();
return x = f ? -x : x;
}
inline void write(LL x, bool f) {
if (x == 0) {putchar('0'); if(f)putchar('\n');else putchar(' ');return;}
if (x < 0) {putchar('-');x = -x;}
static char s[23];
int l = 0;
while (x != 0)s[l++] = x % 10 + 48, x /= 10;
while (l)putchar(s[--l]);
if(f)putchar('\n');else putchar(' ');
}
int lowbit(int x) { return x & (-x); }
template<class T>T big(const T &a1, const T &a2) { return a1 > a2 ? a1 : a2; }
template<class T>T sml(const T &a1, const T &a2) { return a1 < a2 ? a1 : a2; }
template<typename T, typename ...R>T big(const T &f, const R &...r) { return big(f, big(r...)); }
template<typename T, typename ...R>T sml(const T &f, const R &...r) { return sml(f, sml(r...)); }
void debug_out() { cerr << '\n'; }
template<typename T, typename ...R>void debug_out(const T &f, const R &...r) {cerr << f << " ";debug_out(r...);}
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]: ", debug_out(__VA_ARGS__);
const LL INFLL = 0x3f3f3f3f3f3f3f3fLL;
const int HMOD[] = {1000000009, 1004535809};
const LL BASE[] = {1572872831, 1971536491};
const int mod = 1e9 + 0;//998244353
const int MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int MXN = 1e6 + 7;
const int MXE = 1e6 + 7;
int n, m;
int xs[MXN], ys[MXN], ls[MXN], rs[MXN];
LL a1, a2, b1, b2, c1, c2, m1, m2;
vector<int> vs;
int lazy[MXN<<2];
LL sum[MXN<<2];
void push_down(int rt, int l, int mid, int r) {
if(lazy[rt] == 0) return;
lazy[rt<<1] += lazy[rt], lazy[rt<<1|1] += lazy[rt];
sum[rt<<1] += (LL)lazy[rt] * (vs[mid + 1] - 1 - (vs[l] - 1));
sum[rt<<1|1] += (LL)lazy[rt] * (vs[r + 1] - 1 - (vs[mid + 1] - 1));
lazy[rt] = 0;
}
void update(int L, int R, int l, int r, int rt) {
if(L <= l && r <= R) {
sum[rt] += vs[R + 1] - 1 - (vs[L] - 1);
// debug(L, R, vs[R+1] - 1, vs[L] - 1)
++ lazy[rt];
return;
}
int mid = (l + r) >> 1;
push_down(rt, l, mid, r);
if(L > mid) update(L, R, mid + 1, r, rt<<1|1);
else if(R <= mid) update(L, R, l, mid, rt<<1);
else {
update(L, mid, l, mid, rt<<1), update(mid + 1, R, mid + 1, r, rt<<1|1);
}
sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}
int query(LL p, int l, int r, int rt) {
if(l == r) {
// debug(l, vs[l], p, sum[rt])
LL len = sum[rt]/(vs[l+1] - vs[l]);
return (p + len - 1)/len + vs[l] - 1;
}
int mid = (l + r) >> 1;
push_down(rt, l, mid, r);
// debug(rt, sum[rt], sum[rt<<1], sum[rt<<1|1])
if(sum[rt<<1] >= p) return query(p, l, mid, rt<<1);
else return query(p - sum[rt<<1], mid + 1, r, rt<<1|1);
}
int main() {
#ifndef ONLINE_JUDGE
freopen("/home/cwolf9/CLionProjects/ccc/in.txt", "r", stdin);
// freopen("/home/cwolf9/CLionProjects/ccc/out.txt", "w", stdout);
#endif
n = read();
xs[1] = read(), xs[2] = read(), a1 = read(), b1 = read(), c1 = read(), m1 = read();
ys[1] = read(), ys[2] = read(), a2 = read(), b2 = read(), c2 = read(), m2 = read();
vs.eb(0);
vs.eb(ls[1] = sml(xs[1], ys[1]) + 1), vs.eb((rs[1] = big(xs[1], ys[1]) + 1)+1);
vs.eb(ls[2] = sml(xs[2], ys[2]) + 1), vs.eb((rs[2] = big(xs[2], ys[2]) + 1)+1);
for(int i = 3; i <= n; ++i) {
xs[i] = (xs[i-1] * a1 + xs[i-2] * b1 + c1)%m1, ys[i] = (ys[i-1] * a2 + ys[i-2] * b2 + c2)%m2;
vs.eb(ls[i] = sml(xs[i], ys[i]) + 1), vs.eb((rs[i] = big(xs[i], ys[i]) + 1)+1);
}
my_unique(vs);
for(auto x: vs) printf("%d ", x); printf("\n");
for(int i = 1, tx, ty; i <= n; ++i) {
tx = lower_bound(all(vs), ls[i]) - vs.begin();
ty = upper_bound(all(vs), rs[i]) - vs.begin();
// debug(tx, ty, vs.size())
update(tx, ty - 1 , 1, vs.size(), 1);
// debug(sum[1], sum[1]/2+(sum[1]%2))
printf("%d\n", query(sum[1]/2+(sum[1]%2), 1, vs.size(), 1));
// debug(sum[1])
// if(i == 2) break;
}
return 0;
}
左闭右开线段树 2019牛客多校(第七场)E_Find the median(点代表区间的更多相关文章
- 2019牛客多校第七场E Find the median 权值线段树+离散化
Find the median 题目链接: https://ac.nowcoder.com/acm/contest/887/E 题目描述 Let median of some array be the ...
- 2019牛客多校第七场C-Governing sand(线段树+枚举)
Governing sand 题目传送门 解题思路 枚举每一种高度作为最大高度,则需要的最小花费的钱是:砍掉所有比这个高度高的树的所有花费+砍掉比这个高度低的树里最便宜的m棵树的花费,m为高度低的里面 ...
- 2019牛客多校第七场E Find the median 离散化+线段树维护区间段
Find the median 题意 刚开始集合为空,有n次操作,每次操作往集合里面插入[L[i],R[i]]的值,问每次操作后中位数是多少 分析 由于n比较大,并且数可以达到1e9,我们无法通过权值 ...
- 2019牛客多校第七场 F Energy stones 树状数组+算贡献转化模拟
Energy stones 题意 有n块石头,每块有初始能量E[i],每秒石头会增长能量L[i],石头的能量上限是C[i],现有m次时刻,每次会把[s[i],t[i]]的石头的能量吸干,问最后得到了多 ...
- 2019牛客多校第七场H Pair 数位DP
题意:给你一个3个数A, B, C问有多少对pair(i, j),1 <= i <= A, 1 <= j <= B, i AND j > C或 i XOR j < ...
- Find the median(2019年牛客多校第七场E题+左闭右开线段树)
题目链接 传送门 题意 每次往集合里面添加一段连续区间的数,然后询问当前集合内的中位数. 思路 思路很好想,但是卡内存. 当时写的动态开点线段树没卡过去,赛后机房大佬用动态开点过了,\(tql\). ...
- 2019牛客多校第八场 F题 Flowers 计算几何+线段树
2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或 ...
- 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数
目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...
- 牛客多校第七场 C Governing sand 线段树
题意: 有一个树林,树林中不同种类的树有不同的数量,高度,砍伐它们的价格.现在要求砍掉一些树,使得高度最高的树占剩下的树的总数的一半以上,求最小花费. 题解: 用线段树维护不同种类树的信息,叶子节点从 ...
随机推荐
- 测开之路四十八:Django之重定向与cookie
基础配置与上一篇一致 404错误 定义一个error页面 <!DOCTYPE html><html lang="en"><head> <m ...
- VMWARE ESXI 虚拟硬盘的格式:精简置备、厚置备延迟置零、厚置备置零
精简置备(thin): 精 简配置就是无论磁盘分配多大,实际占用存储大小是现在使用的大小,即用多少算多少.当客户机有输入输出的时候,VMkernel首先分配需要的空间并进行 清零操作,也就是说如果使用 ...
- CSS 6种完全居中最佳实践(整理)
2016年4月28日 1.最佳法: .Absolute-Center { width: 50%; height: 50%; overflow: auto; margin: auto; position ...
- Thymeleaf 遇到的问题
1. 后台传递long类型的值作为 js 执行方法的参数,精准度失效解决办法 解决办法:用thymeleaf的拼接字符串方法来解决 例:<button class="btn btn-p ...
- go语言统计字符个数
具体代码如下: package main import "fmt" func main() { m := make(map[rune]int, 1) var input strin ...
- mongo数据库基本查询语句
D:\MongoDB\Server\3.4\bin>mongo MongoDB shell version v3.-g83c3022fe4 connecting to: mongodb://12 ...
- 61.Merge k Sorted Lists(合并k个排序链表)
Level: Hard 题目描述: Merge k sorted linked lists and return it as one sorted list. Analyze and descri ...
- Windows IIS PHP7 连接 SQLServer 2012
下载 php7 对 SQL Server 的扩展 https://www.microsoft.com/en-us/download/details.aspx?id=20098 下载后 安装到一个 目录 ...
- Spring学习笔记(14)——注解零配置
我们在以前学习 Spring 的时候,其所有的配置信息都写在 applicationContext.xml 里,大致示例如下: java代码: <beans> <bean n ...
- Python二分查找算法
Python 二分查找算法: 什么是二分查找,二分查找的解释: 二分查找又叫折半查找,二分查找应该属于减值技术的应用,所谓减值法,就是将原问题分成若干个子问题后,利用了规模为n的原问题的解与较小规模( ...