BZOJ 2223: [Coci 2009]PATULJCI 主席树
题目描述:动态求出现次数大于等于区间一半长度的数字.
题解: 对序列维护一个主席树即可.
#include<bits/stdc++.h>
#define maxn 300001
#define mid ((l+r)>>1)
using namespace std;
inline void setIO(string s)
{
string in=s+".in";
freopen(in.c_str(),"r",stdin);
}
int cnt, cc=0;
int ls[maxn*20],rs[maxn*20],sumv[maxn*20],root[maxn];
void build(int l,int r,int &o)
{
o=++cnt;
if(l==r) return;
if(mid>=l) build(l,mid,ls[o]);
if(r>mid) build(mid+1,r,rs[o]);
}
int update(int l,int r,int k,int x)
{
int oo=++cnt;
sumv[oo]=sumv[x]+1;
ls[oo]=ls[x], rs[oo]=rs[x];
if(l==r) return oo;
if(k<=mid) ls[oo]=update(l,mid,k,ls[x]);
else rs[oo]=update(mid+1,r,k, rs[x]);
return oo;
}
int query(int u,int v,int l,int r)
{
if(l==r)
{
if(sumv[v]-sumv[u] > cc) return l;
return -1;
}
int tmp=sumv[ls[v]]-sumv[ls[u]];
if(tmp > cc) return query(ls[u], ls[v], l, mid);
else return query(rs[u], rs[v], mid + 1, r);
}
int main()
{
// setIO("input");
int n,m,i,a,Q,l,r;
scanf("%d%d",&n,&m);
build(1,m,root[0]);
for(i=1;i<=n;++i)
{
scanf("%d",&a);
root[i]=update(1,m,a,root[i-1]);
}
scanf("%d",&Q);
while(Q--)
{
scanf("%d%d",&l,&r);
cc=(r-l+1)>>1;
a = query(root[l-1], root[r], 1, m);
if(a==-1) printf("no\n");
else printf("yes %d\n", a);
}
return 0;
}
BZOJ 2223: [Coci 2009]PATULJCI 主席树的更多相关文章
- BZOJ 2223 [Coci 2009]PATULJCI | 主席树练习 (好像是个权限题啊)
题目: 给个序列,问[l,r]区间内是否存在x>(r-l+1)>>1 题解: 好像大家都觉得这个题比较简单,没人写题解啊 先说BZOJ样例的格式应该是,第二个数是序列中数的范围(就是 ...
- bzoj 2223 [Coci 2009]PATULJCI
[Coci 2009]PATULJCI Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1286 Solved: 553[Submit][Status ...
- 主席树||可持久化线段树||BZOJ 3524: [Poi2014]Couriers||BZOJ 2223: [Coci 2009]PATULJCI||Luogu P3567 [POI2014]KUR-Couriers
题目:[POI2014]KUR-Couriers 题解: 要求出现次数大于(R-L+1)/2的数,这样的数最多只有一个.我们对序列做主席树,每个节点记录出现的次数和(sum).(这里忽略版本差值问题) ...
- 【bzoj2223】[Coci 2009]PATULJCI 主席树
题目描述 样例输入 10 3 1 2 1 2 1 2 3 2 3 3 8 1 2 1 3 1 4 1 5 2 5 2 6 6 9 7 10 样例输出 no yes 1 no yes 1 no yes ...
- [bzoj3524==bzoj2223][Poi2014]Couriers/[Coci 2009]PATULJCI——主席树+权值线段树
题目大意 给定一个大小为n,每个数的大小均在[1,c]之间的数列,你需要回答m个询问,其中第i个询问形如\((l_i, r_i)\),你需要回答是否存在一个数使得它在区间\([l_i,r_i]\)中出 ...
- BZOJ2223[Coci 2009]PATULJCI——主席树
题目描述 输入 先输入一个数n,然后一个数表示这n个数中最大的是多少,接下来一行n个数.然后一个数m,最后m行询问每次两个数l,r. 输出 no或者yes+这个数 样例输入 10 3 1 2 1 2 ...
- BZOJ_2223_[Coci 2009]PATULJCI_主席树
BZOJ_2223_[Coci 2009]PATULJCI_主席树 Description Input 10 3 1 2 1 2 1 2 3 2 3 3 8 1 2 1 3 1 4 1 5 2 5 2 ...
- bzoj3524 [Poi2014]Couriers/2223 [Coci 2009]PATULJCI
题目链接1 题目链接2 主席树模板题 两题有细节不同 #include<algorithm> #include<iostream> #include<cstdlib> ...
- [BZOJ 2989]数列(二进制分组+主席树)
[BZOJ 2989]数列(二进制分组+主席树) 题面 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[ ...
随机推荐
- storm与hadoop的对照
hadoop 是实现了 mapreduce 的思想,将数据切片计算来处理大量的离线数据. hadoop处理的数据必须是已经存放在 hdfs 上或者类似 hbase 的数据库中.所以 hadoop ...
- MySQL-插入数据(INSERT)
Insert语句可将一行或多行插入到表中. INSERT语法: INSERT INTO table(column1,column2...) VALUES (value1,value2,...); 首先 ...
- 嵌入式开发之函数解析---ip地址2进制转字符inet_ntoa 调用中只生效一次
inet_addr() 简述:将一个点间隔地址转换成一个in_addr. #include <winsock.h> unsigned long PASCAL FAR inet_addr ...
- [办公应用]如何设置IE打印时的默认页边距,并设置纸张为横向(会计票据打印)
最近一个做会计的同事询问,如何将IE打印时的默认页边距更改,并且每次都要是横向的纸张. 这是因为她已经测试好纸张的大小,并据此调整好了页边距.可惜的是下一次打印时,又要重新调整一遍. 经过研究,方法如 ...
- JOIN a table with a subquery
统计数据产品消耗量与产量 注意join 方向 join中子查询 How to use subquery in JOIN operation in MySQL http://www.geeksengin ...
- 定时删除clientmqueue
* * */1 * * cd /var/spool; cp -r clientmqueue /home/data/xl_project/var_spool_clientmqueue_$(date + ...
- bzoj 1670: [Usaco2006 Oct]Building the Moat护城河的挖掘【凸包】
凸包模板 #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> ...
- Springboot 三种拦截Rest API的方法-过滤器、拦截器、切片
过滤器方式实现拦截(Filter) 通过继承Servlet的Filter类来实现拦截: @Component public class TimeFilter implements Filter { @ ...
- C#自动内存分配
一.在程序运行时由CLR管理内存分配(Memory Allocation),程序启动时,操作系统会为每一个线程申请一个独立的栈内存,用于存储方法的局部变量.参数和返回值等:CLR会为进程申请一个连续的 ...
- mysql left join 出现的结果会重复
left join 基本用法 MySQL left join 语句格式 A LEFT JOIN B ON 条件表达式 left join 是以A表为基础,A表即左表,B表即右表. 左表(A)的记录会全 ...