[POI 2014] Couriers
[题目链接]
https://www.lydsy.com/JudgeOnline/problem.php?id=3524
[算法]
首先离线 , 将询问按右端点排序
如果我们知道[l , r]这个区间中[L , mid]中的数有多少个和[mid + 1 , R]中的数有多少个 , 则可以通过二分的方式求出答案
可持久化线段树可以完成这个任务
时间复杂度 : O(NlogN)
[代码]
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 5e5 + ; struct query
{
int l , r;
int id;
} q[MAXN]; int n , m , idx;
int a[MAXN] , lson[MAXN << ] , rson[MAXN << ] , sum[MAXN << ] , root[MAXN] , tmp[MAXN] , ans[MAXN]; template <typename T> inline void chkmax(T &x,T y) { x = max(x,y); }
template <typename T> inline void chkmin(T &x,T y) { x = min(x,y); }
template <typename T> inline void read(T &x)
{
T f = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
x *= f;
}
inline bool cmp(query a , query b)
{
return a.r < b.r;
}
inline void build(int &k , int l , int r)
{
k = ++idx;
if (l == r) return;
int mid = (l + r) >> ;
build(lson[k] , l , mid);
build(rson[k] , mid + , r);
}
inline void modify(int &k , int old , int l , int r , int pos , int value)
{
k = ++idx;
lson[k] = lson[old] , rson[k] = rson[old];
sum[k] = sum[old] + value;
if (l == r) return;
int mid = (l + r) >> ;
if (mid >= pos) modify(lson[k] , lson[k] , l , mid , pos , value);
else modify(rson[k] , rson[k] , mid + , r , pos , value);
}
inline int query(int rt1 , int rt2 , int l , int r , int x)
{
if (l == r) return l;
int mid = (l + r) >> ;
if (sum[lson[rt1]] - sum[lson[rt2]] > x) return query(lson[rt1] , lson[rt2] , l , mid , x);
else if (sum[rson[rt1]] - sum[rson[rt2]] > x) return query(rson[rt1] , rson[rt2] , mid + , r , x);
else return ;
} int main()
{ read(n); read(m);
for (int i = ; i <= n; i++)
{
read(a[i]);
tmp[i] = a[i];
}
sort(tmp + , tmp + n + );
int len = unique(tmp + , tmp + n + ) - tmp - ;
for (int i = ; i <= n; i++) a[i] = lower_bound(tmp + , tmp + len + , a[i]) - tmp;
for (int i = ; i <= m; i++)
{
read(q[i].l);
read(q[i].r);
q[i].id = i;
}
sort(q + , q + m + , cmp);
build(root[] , , len);
int now = ;
for (int i = ; i <= n; i++)
{
modify(root[i] , root[i - ] , , n , a[i] , );
while (now <= m && q[now].r == i) ans[q[now].id] = tmp[query(root[i] , root[q[now].l - ] , , n , (q[now].r - q[now].l + ) / )] , ++now;
}
for (int i = ; i <= m; i++) printf("%d\n" , ans[i]); return ; }
[POI 2014] Couriers的更多相关文章
- bzoj 3522 / 4543 [POI 2014] Hotel - 动态规划 - 长链剖分
题目传送门 bzoj 3522 需要root权限的传送点 bzoj 4543 快速的传送点 慢速的传送点 题目大意 给定一棵树,问有多少个无序三元组$(x, y, z)$使得这三个不同点在树上两两距离 ...
- [POI 2014]RAJ-Rally
Description 题库链接 给定一个 \(N\) 个点 \(M\) 条边的有向无环图,每条边长度都是 \(1\).请找到一个点,使得删掉这个点后剩余的图中的最长路径最短. \(1\leq N\l ...
- 解题:POI 2014 Ant colony
题面 既然我们只知道最后数量为$k$的蚂蚁会在特殊边上被吃掉,不妨逆着推回去,然后到达每个叶节点的时候就会有一个被吃掉的蚂蚁的区间,然后二分一下就好啦 #include<cstdio> # ...
- POI 2014 HOTELS (树形DP)
题目链接 HOTELS 依次枚举每个点,以该点为中心扩展. 每次枚举的时候,从该点的儿子依次出发,搜完一个儿子所有的点之后进行答案统计. 这里用了一个小trick. #include <bits ...
- [POI 2014] Little Bird
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3831 [算法] 单调队列优化动态规划 时间复杂度 : O(N) [代码] #incl ...
- bzoj 3872 [ Poi 2014 ] Ant colony —— 二分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3872 从食蚁兽所在的边向叶节点推,会得到一个渐渐放大的取值区间,在叶子节点上二分有几群蚂蚁符 ...
- [POI 2014]PTA-Little Bird
Description 题库连接 给你 \(n\) 棵树,第 \(i\) 棵树的高度为 \(d_i\).有一只鸟从 1 号树出发,每次飞跃不能超过 \(k\) 的距离.若飞到下一棵树的高度大于等于这一 ...
- Solution -「POI 2014」「洛谷 P5904」HOT-Hotels 加强版
\(\mathcal{Description}\) Link. 给定一棵 \(n\) 个点的树,求无序三元组 \((u,v,w)\) 的个数,满足其中任意两点树上距离相等. \(n\le1 ...
- POI题解整合
我也不知道为啥我就想把POI的题全都放到一篇blog里写完. POI 2005 SAM-Toy Cars 贪心,每次选下次出现最晚的. POI 2006 KRA-The Disks 箱子位置单调,所以 ...
随机推荐
- Codeforces D. Iahub and Xors
题目大意:给定一个N*N的区间,1:对(x0,y0,x1,y1)每个直 都xor v: 2: 求(x0,y0,x1,y1)区间的 sum xor: http://codeforces.com/blog ...
- 你知道在springboot中如何使用WebSocket吗
一.背景 我们都知道 http 协议只能浏览器单方面向服务器发起请求获得响应,服务器不能主动向浏览器推送消息.想要实现浏览器的主动推送有两种主流实现方式: 轮询:缺点很多,但是实现简单 webso ...
- 解决ionic 上拉加载组件 ion-infinite-scroll自动调用多次的问题或禁止第一次加载
ionic 中一个上拉刷新的组件 ion-infinite-scroll,如果页面未填充满页面高度,会自动检测并无限调用多次加载更多的函数: 当然,主要会导致首次调用的时候,会执行几次加载更多的函数: ...
- java开始到熟悉70-71
本次内容:file类 package array; /** * file类 */ import java.io.File; import java.io.IOException; public cla ...
- opencvSGBM半全局立体匹配算法的研究(1)
转载请说明出处:http://blog.csdn.net/zhubaohua_bupt/article/details/51866567 这段时间对opencvSGBM半全局立体匹配算法进行了比較仔细 ...
- iOS开发 - App程序启动原理
Info.plist和pch文件的作用 建立一个project后,会在Supporting files目录下看到一个"project名-Info.plist"的文件,该文件对pro ...
- python day-3 基本数据类型
1. 编码 1. 最早的计算机编码是ASCII. 美国人创建的. 包含了英文字母(大写字母, 小写字母). 数字, 标点等特殊字符!@#$% 128个码位 2**7 在此基础上加了一位 2**8 8位 ...
- 初识Restful(学习笔记)
什么是Restful? REST -- Resource Representational State Transfer(表现层状态转移) 本质上是一种优雅的URL表达方式,描述资源的状态和状态的转移 ...
- Docker and Go: why did we decide to write Docker in Go?
Docker and Go: why did we decide to write Docker in Go? | Hacker News https://news.ycombinator.com/i ...
- sqlldr的用法
在 Oracle 数据库中,我们通常在不同数据库的表间记录进行复制或迁移时会用以下几种方法: 1. A 表的记录导出为一条条分号隔开的 insert 语句,然后执行插入到 B 表中2. 建立数据库间的 ...