BZOJ 3542 [Poi2014]Couriers ——可持久化线段树
【题目分析】
查找区间内出现次数大于一半的数字。
直接用主席树,线段树上维护区间大小,由于要求出现次数大于一半,每到一个节点可以分治下去。
时间复杂度(N+Q)logN
【代码】
- #include <cstdio>
- #include <cstring>
- #include <cstdlib>
- #include <cmath>
- #include <set>
- #include <map>
- #include <string>
- #include <algorithm>
- #include <vector>
- #include <iostream>
- #include <queue>
- using namespace std;
- #define maxn 500005
- #define mlog 30
- #define inf (0x3f3f3f3f)
- int read()
- {
- int x=0,f=1; char ch=getchar();
- while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
- while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
- return x*f;
- }
- int rt[maxn],ls[maxn*mlog],rs[maxn*mlog],siz[maxn*mlog],idx=0;
- int n,m,x,a[maxn];
- int ins(int o,int l,int r,int x)
- {
- int k=++idx; siz[k]=siz[o]+1; int mid=(l+r)/2;
- if (l==r) return k;
- if (x<=mid) rs[k]=rs[o],ls[k]=ins(ls[o],l,mid,x);
- else ls[k]=ls[o],rs[k]=ins(rs[o],mid+1,r,x);
- return k;
- }
- int query(int o1,int o2,int l,int r,int tim)
- {
- // printf("%d %d\n",l,r);
- if (l==r)
- {
- if (siz[o2]-siz[o1]>tim) return l;
- else return 0;
- }
- if (siz[ls[o2]]-siz[ls[o1]]>siz[rs[o2]]-siz[rs[o1]])
- return query(ls[o1],ls[o2],l,(l+r)/2,tim);
- else return query(rs[o1],rs[o2],(l+r)/2+1,r,tim);
- }
- int main()
- {
- n=read();m=read();
- for (int i=1;i<=n;++i) a[i]=x=read(),rt[i]=ins(rt[i-1],1,n,x);
- // for (int i=1;i<=n;++i) printf("%d ",a[i]); printf("\n");
- for (int i=1;i<=m;++i)
- {
- int l=read(),r=read();
- // printf("ask for %d to %d\n",l,r);
- if (l==r)
- {
- // printf("l == r\n");
- printf("%d\n",a[r]);
- }
- else printf("%d\n",query(rt[l-1],rt[r],1,n,(r-l+1)/2));
- }
- }
BZOJ 3542 [Poi2014]Couriers ——可持久化线段树的更多相关文章
- 【BZOJ 3524】【Poi2014】Couriers 可持久化线段树
为什么这个主席树叫可持久化线段树,我不知道,具体得问达神.我无限T,然后DaD3zZ一针见血地指出了我的N*50爆内存导致无限编译超时O)ZO)ZO)Z真是太神啦.以图为鉴: 达神题解传送门:http ...
- BZOJ-3524 Couriers 可持久化线段树
可持久化线段树,其实就是类主席树了.. 3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 128 MB Submit: 1124 Sol ...
- bzoj 2653 二分答案+可持久化线段树
首先离散化,然后我们知道如果对于一个询问的区间[l1,r1],[l2,r2],我们二分到一个答案x,将[l1,r2]区间中的元素大于等于x的设为1,其余的设为-1,那么如果[l1,r1]的最大右区间和 ...
- bzoj 2653 middle (可持久化线段树)
middle Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1981 Solved: 1097[Submit][Status][Discuss] D ...
- [BZOJ 3218] A + B Problem 【可持久化线段树 + 网络流】
题目连接:BZOJ - 3218 题目分析 题目要求将 n 个点染成黑色或白色,那么我们可以转化为一个最小割模型. 我们规定一个点 i 最后属于 S 集表示染成黑色,属于 T 集表示染成白色,那么对于 ...
- [BZOJ 3207] 花神的嘲讽计划Ⅰ【Hash + 可持久化线段树】
题目链接:BZOJ - 3207 题目分析 先使用Hash,把每个长度为 k 的序列转为一个整数,然后题目就转化为了询问某个区间内有没有整数 x . 这一步可以使用可持久化线段树来做,虽然感觉可以有更 ...
- BZOJ.4771.七彩树(可持久化线段树)
BZOJ 考虑没有深度限制,对整棵子树询问怎么做. 对于同种颜色中DFS序相邻的两个点\(u,v\),在\(dfn[u],dfn[v]\)处分别\(+1\),\(dfn[LCA(u,v)]\)处\(- ...
- BZOJ.2653.[国家集训队]middle(可持久化线段树 二分)
BZOJ 洛谷 求中位数除了\(sort\)还有什么方法?二分一个数\(x\),把\(<x\)的数全设成\(-1\),\(\geq x\)的数设成\(1\),判断序列和是否非负. 对于询问\(( ...
- BZOJ.3218.a + b Problem(最小割ISAP 可持久化线段树优化建图)
BZOJ UOJ 首先不考虑奇怪方格的限制,就是类似最大权闭合子图一样建图. 对于奇怪方格的影响,显然可以建一条边\((i\to x,p_i)\),然后由\(x\)向\(1\sim i-1\)中权值在 ...
随机推荐
- bootstrap清除拟态框内添加新HTML再打开时会有缓存现象
$(function(){ $("#editor").on("hidden.bs.modal",function(){ //清除缓存方法 $(this).fin ...
- iOS 中CoreData的简单使用
原文链接:http://www.jianshu.com/p/4411f507dd9f 介绍:本文介绍的CoreData不在AppDelegate中创建,在程序中新建工程使用,即创建本地数据库,缓存数据 ...
- php curl get post
post有3种. 1.post方式 privatefunction send_post($url,$post_data){ $ch = curl_init($url); curl_setopt($ch ...
- iOS 多线程及其他补充
NSOperation NSOperation是个抽象类,并不具备封装操作的能力,必须使用它的子类 NSInvocationOperation 如果直接执行NSInvocationOperatio ...
- supersr--NSURLSessionConfiguration-下载进度
//// ViewController.m// 下载进度 // // Created by Super on 14/7/4. // Copyright (c) 2014年 iOS. All r ...
- [Android Pro] CPU占用计算方法
1: AVTest CPU计算方法读取每个进程的 stat 文件 (/proc/<PID>/stat)计算采样间隔10min下utime的差值minusUtime,stime的差值min ...
- September 7th 2016 Week 37th Wednesday
Patience is bitter, but its fruit is sweet. 忍耐是痛苦的,但它的果实却是甜蜜的. However, many may give up before they ...
- BigInteger类型的解析_超详细解析
/*9876543210987654234522345 214748364723453452323452345 2147483647234523452323452345 181760911432744 ...
- C#学习笔记-----C#枚举中的位运算权限分配
一.基础知识 什么是位运算? 用二进制来计算,1&2:这就是位运算,其实它是将0001与0010做位预算 得到的结果是 0011,也就是3 2.位预算有多少种?(我们就将几种我们权限中会 ...
- Unity依赖注入使用
构造器注入(Constructor Injection):IoC容器会智能地选择选择和调用适合的构造函数以创建依赖的对象.如果被选择的构造函数具有相应的参数,IoC容器在调用构造函数之前会自定义创建相 ...