洛谷P3567[POI2014]KUR-Couriers(主席树+二分)
题意:给一个数列,每次询问一个区间内有没有一个数出现次数超过一半
题解:
最近比赛太多,都没时间切水题了,刚好日推了道主席树裸题,就写了一下
然后
WA80
WA80
WA0
WA90
WA80
??????
结果重新审题发现没有数据范围????
哦,原来是500000,我是真的菜
因为必须要一个数出现超过一半
所以这个数肯定会在左子树和右子树中总个数和较大的那个里。
显然这样二分找到树底复杂度是logn的
如果此时树底这个点的数值大于一半,那么就输出这个解,否则puts("0")
以及:不用离散化!!!
代码如下:
#include<bits/stdc++.h>
#define lson tr[now].l
#define rson tr[now].r
using namespace std; struct tree
{
int l,r,sum,val;
}tr[]; int rt[],a[],n,m,cnt;
map<int,int> mm; inline int push_up(int now)
{
tr[now].sum=tr[lson].sum+tr[rson].sum;
} int insert(int &now,int fa,int l,int r,int pos)
{
if(!now) now=++cnt;
if(l==r)
{
tr[now].sum=tr[fa].sum+;
tr[now].val=l;
return ;
}
register int mid=(l+r)>>;
if(pos<=mid)
{
insert(tr[now].l,tr[fa].l,l,mid,pos);
tr[now].r=tr[fa].r;
}
else
{
tr[now].l=tr[fa].l;
insert(tr[now].r,tr[fa].r,mid+,r,pos);
}
push_up(now);
} inline int query(int a,int b,int l,int r,int tar)
{
if(l==r)
{
if(tr[a].sum-tr[b].sum>=tar) return l;
else return ;
}
register int mid=(l+r)>>;
register int ls=tr[tr[a].l].sum-tr[tr[b].l].sum;
register int rs=tr[tr[a].r].sum-tr[tr[b].r].sum;
if(ls>rs) return query(tr[a].l,tr[b].l,l,mid,tar);
else return query(tr[a].r,tr[b].r,mid+,r,tar);
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)
{
scanf("%d",&a[i]);
insert(rt[i],rt[i-],,,a[i]);
}
int from,to;
while(m--)
{
scanf("%d%d",&from,&to);
register int mid=(to-from+)/+;
printf("%d\n",b[query(rt[to],rt[from-],,,mid)]);
}
}
洛谷P3567[POI2014]KUR-Couriers(主席树+二分)的更多相关文章
- 2018.09.14 洛谷P3567 [POI2014]KUR-Couriers(主席树)
传送门 简单主席树啊. 但听说有随机算法可以秒掉%%%(本蒟蒻并不会) 直接维护值域内所有数的出现次数之和. 当这个值不大于区间总长度的一半时显然不存在合法的数. 这样在主席树上二分查值就行了. 代码 ...
- 洛谷P3567 [POI2014]KUR-Couriers 主席树
挺裸的,没啥可讲的. 不带修改的主席树裸题 Code: #include<cstdio> #include<algorithm> using namespace std; co ...
- 洛谷P2617 Dynamic Ranking(主席树,树套树,树状数组)
洛谷题目传送门 YCB巨佬对此题有详细的讲解.%YCB%请点这里 思路分析 不能套用静态主席树的方法了.因为的\(N\)个线段树相互纠缠,一旦改了一个点,整个主席树统统都要改一遍...... 话说我真 ...
- 洛谷P4587 神秘数 [FJOI2016] 主席树
正解:主席树 解题报告: 先放下传送门QAQ 首先可以先思考如果只有一组询问,怎么解决 可以这么想,最开始一个数也麻油的时候能表示的最大的数是0嘛 然后先排个序,按顺序每次新加入一个数x,设加入这个数 ...
- 2018.07.07 洛谷 P3939 数颜色(主席树)
P3939 数颜色 题目背景 大样例下发链接:http://pan.baidu.com/s/1c0LbQ2 密码:jigg 题目描述 小 C 的兔子不是雪白的,而是五彩缤纷的.每只兔子都有一种颜色,不 ...
- 洛谷P3168 [CQOI2015]任务查询系统 [主席树,差分]
题目传送门 任务查询系统 题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任 ...
- 洛谷P4559 [JSOI2018]列队(主席树)
题面 传送门 题解 首先考虑一个贪心,我们把所有的人按\(a_i\)排个序,那么排序后的第一个人到\(k\),第二个人到\(k+1\),...,第\(i\)个人到\(k+i-1\),易证这样一定是最优 ...
- [洛谷P3567][POI2014]KUR-Couriers
题目大意:给一个数列,每次询问一个区间内有没有一个数出现次数超过一半.有,输出这个数,否则输出$0$ 题解:主席树,查询区间第$\bigg\lfloor\dfrac{len+1}{2}\bigg\rf ...
- 洛谷P3293 [SCOI2016]美味(主席树)
传送门 据说这题做法叫做可持久化trie树?(然而我并不会) 首先考虑一下贪心,从高位到低位枚举,如果能选1肯定比选0优 假设已经处理到了$b$的第$i$位,为1(为0的话同理就不说了) 那么只有当$ ...
随机推荐
- tensorflow学习资料
tensorflow学习资料 http://www.soku.com/search_video/q_tensorflow?f=1&kb=04112020yv41000__&_rp=1a ...
- go slice和数组的区别
1.使用方式 数组和slice长的很像,操作方式也都差不多,并且slice包含了数组的基本的操作方式,如下标.range循环,还有一些如len()则是多种类型共用,所以根据操作根本搞不清数组和切片的区 ...
- MongoDB 数据查询
数据查询 基本查询 方法find():查询 db.集合名称.find({条件文档}) 方法findOne():查询,只返回第一个 db.集合名称.findOne({条件文档}) 方法pretty(): ...
- HTML的属性和css基础
1.name属性: name属性,用于指定标签元素的名称,<a>标签内必须提供href或name属性:<a name ="value"> 2.id属性: 1 ...
- cf-Round542-Div2-B(贪心)
题目链接:http://codeforces.com/contest/1130/problem/B 思路: 贪心题.定义结构体数组a,a[i].x[0],a[i].x[1]分别表示i出现的第一个下标和 ...
- C#中货币类型和数值类型、字符串类型的转化
1.定义textbox的数据 private void Form1_Load(object sender, EventArgs e) { this.textBox1.Text = String.For ...
- ROS两种workspace :overlay rosbuild_ws->catkin_ws->ROS库,
概念 ROS里面有一系列概念,作为初学者,最先接触的概念无非是node, package和workspace. node node是ROS里面最小的执行单位,你可以把node看成是一个main函数,当 ...
- DOMNodeInserted监听div内容改变
$('.cw-icon .ci-count').on('DOMNodeInserted',function(){ $(".settleup-content .cont_loading&quo ...
- svn.SvnX
1. 使用SvnX的入门 http://www.divvun.no/doc/tools/docu-svn-user-svnx.html 2. SvnX的代码 https://code.google.c ...
- 剑指offer面试题3二维数组中的查找
题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 需要与面试官确认的是,这 ...