bzoj-3524 Couriers
题意:
给出一个长度为n的序列和m次询问。
每次询问给出区间[l,r],求区间中出现次数大于(r-l+1)/2的数字。
n。m<=500000。1<=每一个数字<=n;
题解:
主席树的算是裸题吧,静态序列不用套树状数组,数据范围也省了离散化;
直接上主席树就能够了,复杂度就是O((n+m)logn)的样子;
空间略爆炸。可是假设取消Build()函数就能够过了。
orz icebound神犇,搞了一种奇妙的建树法:
void Insert(int l,int r,int &now,int val)
{
a[++cnt]=a[now];
now=cnt,a[now].sum++;
if(l==r) return ;
int mid=l+r>>1;
if(val<=mid) Insert(l,mid,a[now].l,val);
else Insert(mid+1,r,a[now].r,val);
}
这个姿势是不须要提前建空树的,省了2*n的空间;
比較巧妙的就是传地址之后复制结点。再把地址赋值,使新版本号的树独立出来;
所以仅仅须要四个參数就能够了,编程复杂度也非常低;
(我似乎讲的不太明确,yy一下代码就好了)
然后查询啥的搞搞推断也是logn级别,时间上不怎么卡就过了;
bzoj-2223同题。然而不仅数据范围小内存还大了一倍= =;
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 510000
using namespace std;
struct node
{
int l,r,sum;
}a[N*20];
int root[N],cnt;
void Build(int l,int r,int &no)
{
if(!no) no=++cnt;
if(l==r) return ;
int mid=l+r>>1;
Build(l,mid,a[no].l);
Build(mid+1,r,a[no].r);
}
void Insert(int l,int r,int &now,int val)
{
a[++cnt]=a[now];
now=cnt,a[now].sum++;
if(l==r) return ;
int mid=l+r>>1;
if(val<=mid) Insert(l,mid,a[now].l,val);
else Insert(mid+1,r,a[now].r,val);
}
int query(int l,int r,int nol,int nor,int val)
{
if(l==r) return l;
int mid=l+r>>1;
if(a[a[nor].l].sum-a[a[nol].l].sum>val)
return query(l,mid,a[nol].l,a[nor].l,val);
else if(a[a[nor].r].sum-a[a[nol].r].sum>val)
return query(mid+1,r,a[nol].r,a[nor].r,val);
else
return 0;
}
int main()
{
int n,m,i,j,k,x,l,r;
scanf("%d%d",&n,&m);
// Build(1,n,root[0]);
for(i=1;i<=n;i++)
{
scanf("%d",&x);
root[i]=root[i-1];
Insert(1,n,root[i],x);
}
for(i=1;i<=m;i++)
{
scanf("%d%d",&l,&r);
printf("%d\n",query(1,n,root[l-1],root[r],r-l+1>>1));
}
return 0;
}
bzoj-3524 Couriers的更多相关文章
- BZOJ 3524 Couriers | 主席树
BZOJ 3524 Couriers 题意 求一个区间内出现超过区间长度的一半的数,如果没有则输出0. 题解 我可能太菜了吧--这道题愣是没想出来-- 维护权值主席树,记录每个数都出现过多少次: 查询 ...
- 洛谷 3567/BZOJ 3524 Couriers
3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 2895 Solved: 1189[Submit][S ...
- 主席树||可持久化线段树||BZOJ 3524: [Poi2014]Couriers||BZOJ 2223: [Coci 2009]PATULJCI||Luogu P3567 [POI2014]KUR-Couriers
题目:[POI2014]KUR-Couriers 题解: 要求出现次数大于(R-L+1)/2的数,这样的数最多只有一个.我们对序列做主席树,每个节点记录出现的次数和(sum).(这里忽略版本差值问题) ...
- BZOJ 3524: [Poi2014]Couriers [主席树]
3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1892 Solved: 683[Submit][St ...
- BZOJ 3524: [Poi2014]Couriers
3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1905 Solved: 691[Submit][St ...
- BZOJ 3524 [Poi2014]Couriers(二分+蒙特卡罗)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3524 [题目大意] 给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个 ...
- BZOJ 3524 [Poi2014]Couriers(可持久化线段树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3524 [题目大意] 给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个 ...
- 【BZOJ 3524】【Poi2014】Couriers 可持久化线段树
为什么这个主席树叫可持久化线段树,我不知道,具体得问达神.我无限T,然后DaD3zZ一针见血地指出了我的N*50爆内存导致无限编译超时O)ZO)ZO)Z真是太神啦.以图为鉴: 达神题解传送门:http ...
- 【bzoj 3524】[Poi2014]Couriers
Description 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. ...
- 【刷题】BZOJ 3524 [Poi2014]Couriers
Description 给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0 ...
随机推荐
- oj测试点相关 (整理摘编)
Accepted 通过!(AC) Wrong Answer 答案错.(WA) Runtime Error ...
- Django分页器及自定义分页器
Django的分页器 view from django.shortcuts import render,HttpResponse # Create your views here. from app0 ...
- css 引入方式
css介绍 现在的互联网前端分三层: HTML:超文本标记语言.从语义的角度描述页面结构. CSS:层叠样式表.从审美的角度负责页面样式. JS:JavaScript .从交互的角度描述页面行为 CS ...
- D - Garden
Problem description Luba thinks about watering her garden. The garden can be represented as a segmen ...
- Spring Boot (22) Spring Security
除了使用拦截器.过滤器实现对没有权限访问的页面跳转到登陆页外,还可以通过框架实现:Spring Security. 使用Spring Security 完成登陆验证: 1.pom.xml添加依赖 &l ...
- Nmap linux端口扫描神器
#简介 Nmap亦称为Network Mapper(网络映射)是一个开源并且通用的用于Linux系统/网络管理员的工具.nmap用于探查网络.执行安全扫描.网络核查并且在远程机器上找出开放端口.它可以 ...
- 最简单的多线程死锁案例代码(Java语言)
package com.thread.test; public class DeadLock { private static Object firstMonitor = new Object(); ...
- java编程题(一)
[程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? //这是一个菲波拉契数列问题 p ...
- MFC 添加文件路径 遍历文件
.添加MFC选择文件路径,使用MessageBox显示信息. void CMyCalLawsDlg::OnBnClickedAddfolder() { wchar_t* p; wchar_t szPa ...
- python tips:dict的key顺序
python3.6+版本中,dict的键值保持插入有序. t = list(range(10)) b = t[:] d = dict(zip(t, b)) print(list(d.items())) ...