「JSOI2011」棒棒糖
「JSOI2011」棒棒糖
传送门
双倍经验
考虑主席树做法。
对于当前的主席树节点,如果 \(\le mid\) 的个数足够就往左边走,否则就尝试往右边走,都不行就返回 \(0\)。
参考代码:
#include <algorithm>
#include <cstdio>
#define rg register
#define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)
using namespace std;
template < class T > inline void read(T& s) {
    s = 0; int f = 0; char c = getchar();
    while ('0' > c || c > '9') f |= c == '-', c = getchar();
    while ('0' <= c && c <= '9') s = s * 10 + c - 48, c = getchar();
    s = f ? -s : s;
}
const int _ = 5e4 + 5;
int n, m, a[_], tot, rt[_];
struct node { int lc, rc, cnt; } t[_ << 5];
inline void build(int& p, int l = 1, int r = n) {
    p = ++tot;
    if (l == r) return ;
    int mid = (l + r) >> 1;
    build(t[p].lc, l, mid), build(t[p].rc, mid + 1, r);
}
inline void update(int& p, int q, int x, int l = 1, int r = n) {
    t[p = ++tot] = t[q], ++t[p].cnt;
    if (l == r) return ;
    int mid = (l + r) >> 1;
    if (x <= mid) update(t[p].lc, t[q].lc, x, l, mid);
    else update(t[p].rc, t[q].rc, x, mid + 1, r);
}
inline int query(int p, int q, int v, int l = 1, int r = n) {
    if (l == r) return l;
    int mid = (l + r) >> 1;
    if ((t[t[p].lc].cnt - t[t[q].lc].cnt) * 2 > v) return query(t[p].lc, t[q].lc, v, l, mid);
    if ((t[t[p].rc].cnt - t[t[q].rc].cnt) * 2 > v) return query(t[p].rc, t[q].rc, v, mid + 1, r);
    return 0;
}
int main() {
#ifndef ONLINE_JUDGE
    file("cpp");
#endif
    read(n), read(m);
    for (rg int i = 1; i <= n; ++i) read(a[i]);
    build(rt[0]);
    for (rg int i = 1; i <= n; ++i) update(rt[i], rt[i - 1], a[i]);
    for (rg int l, r; m--; ) read(l), read(r), printf("%d\n", query(rt[r], rt[l - 1], r - l + 1));
    return 0;
}
「JSOI2011」棒棒糖的更多相关文章
- 「JSOI2011」任务调度
		「JSOI2011」任务调度 传送门 一开始还在想写平衡树,看到 \(\text{TRANS}\) 操作后就晓得要用可并堆了. 这题好像就是个可并堆的板子题??? ADD 直接往对应的对里面加元素 D ... 
- 「JSOI2011」柠檬
		「JSOI2011」柠檬 传送门 斜率优化题. 在优化前,还有一个值得一提的优化: 对于最后的最优分割方案,每一段的两个端点一定是同颜色的,并且作为这一段的 \(s_0\) 证明:如果不作为这一段的 ... 
- 「JSOI2011」分特产
		「JSOI2011」分特产 传送门 计数题. 考虑容斥掉每人至少一个的限制. 就直接枚举至少有多少人没有分到特产,然后剩下的随便分. \[Ans = \sum_{i = 0}^n (-1)^i {n ... 
- 「译」JUnit 5 系列:条件测试
		原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ... 
- 「译」JUnit 5 系列:扩展模型(Extension Model)
		原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ... 
- JavaScript OOP 之「创建对象」
		工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ... 
- 「C++」理解智能指针
		维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ... 
- 「JavaScript」四种跨域方式详解
		超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ... 
- 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management
		写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ... 
随机推荐
- CodeForces Gym 100213F Counterfeit Money
			CodeForces Gym题目页面传送门 有\(1\)个\(n1\times m1\)的字符矩阵\(a\)和\(1\)个\(n2\times m2\)的字符矩阵\(b\),求\(a,b\)的最大公共 ... 
- IntelliJ IDEA 2017.3尚硅谷-----创建工程
- imread函数+cvtColor()函数
			加载图像(用cv::imread) imread功能是加载图像文件成为一个Mat对象,其中第一个参数表示图像文件名称 第二个参数,表示加载的图像是什么类型,支持常见的三个参数值 IMREAD_UNCH ... 
- Windows Server 2008 R2远程桌面服务安装配置和授权激活
			1.安装 2.远程桌面授权激活 2.1 管理工具——远程桌面服务——(远程桌面授权管理)RD授权管理器: 2.2 由于RD授权服务器还未激活,所以授权服务器图标右下角显示红色×号: 点服务器展开——右 ... 
- DataGridView编辑后立即更新到数据库的两种方法
			DataGridView控件是微软预先写好的一个显示数据的控件,功能非常强大,可以显示来自数据库表的数据和XML等其他来源的数据. 方法一:基于DataAdapter对象创建一个CommandBuli ... 
- 吴裕雄 python 机器学习——集成学习AdaBoost算法回归模型
			import numpy as np import matplotlib.pyplot as plt from sklearn import datasets,ensemble from sklear ... 
- Go_goroutine初识
			package main import ( "fmt" ) func main() { /* 一个goroutine打印数字,另外一个goroutine打印字母,观察运行结果.. ... 
- C语言实例-大小写字母间的转换
			初学C语言都会遇到要求写大小写转换的题目 这类题目主要通过ASCII(美国信息交换标准代码)码差值实现,A对应ASCII码十进制数字是65,a对应ASCII码十进制数字是97,即大小写字母之间ASCI ... 
- linux  sftp 和scp 运用
			Linux scp命令: Upload to remote :复制本地文件到远程 Part1: Scp -P port local_file remote_user@remote_ip:rem ... 
- iOS内存管理的知识梳理
			从作用上来说,手机内存小,划分给每个App的内存有限,合理的进行内存管理,有利于提高软件的运行性能和用户体验: 另外,内存管理是一大理论知识块,对这块知识的理解程度也是考核面试者的重要标准. 内存管理 ... 
