[四校联考P3] 区间颜色众数 (主席树)
主席树
Description
给定一个长度为 N 颜色序列A,有M个询问:每次询问一个区间里是否有一种颜色的数量超过了区间的一半,并指出是哪种颜色。
Input
- 输入文件第一行有两个整数:N和C
- 输入文件第二行有N个1到C之间的整数,表示颜色序列A
- 输入文件第三行一个整数M,表示询问个数;接下来M行每行两个整数A和B,表示询问的区间是[A, B]。
Output
输出M行。对于第i个询问,如果存在一个颜色超过区间长度的一半,那么输出 “yes x”,x表示颜色编号;否则输出一行 “no”。
Sample 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 6
6 9
7 10
对于30%的数据,M <= 10
对于另外30%的数据,C <= 10.
对于100%的数据:3 ≤ N ≤ 300 000, 1 ≤ C ≤ 10 000, 1 ≤ M ≤ 10 000,1 ≤ A ≤ B ≤ N.
Sample Output
no
yes 1
no
yes 1
no
yes 2
no
yes 3
这道题算是我学习主席树的契机了吧,虽然之前NOIP没考过主席树,但NOIP2015之前,树链剖分不也没考过吗。多学习点只是总是没错的。
题解
题目已经说的很明显了,这就是一道主席树的裸题。树中每个节点存颜色信息,第 i 棵树存前 i 个点的信息。查询时用 r 减去 l-1 就好了。
代码
#include <cstdio>
#include <iostream>
using namespace std;
const int maxc = 10000 + 5, maxn = 300000 + 5;
int n,c;
int rt[maxn],cnt;
struct node {
int sum,ls,rs;
}nod[maxn * 25];
void update(int l,int r,int &x,int y,int k){
nod[++cnt] = nod[y];nod[cnt].sum++;x = cnt;
if(l == r)return;
int mid = (l + r) >> 1;
if(k <= mid)update(l,mid,nod[x].ls,nod[y].ls,k);
else update(mid + 1,r,nod[x].rs,nod[y].rs,k);
}
int query(int l,int r,int x,int y,int k){
if(l == r)return l;
int mid = (l + r) >> 1;
if((nod[nod[y].ls].sum - nod[nod[x].ls].sum) * 2 > k)return query(l,mid,nod[x].ls,nod[y].ls,k);
if((nod[nod[y].rs].sum - nod[nod[x].rs].sum) * 2 > k)return query(mid+1,r,nod[x].rs,nod[y].rs,k);
return 0;
}
int main(){
scanf("%d%d",&n,&c);
for(int i = 1;i <= n;i++){
int x;scanf("%d",&x);
update(1,c,rt[i],rt[i-1],x);
}
int m;scanf("%d",&m);
for(int i = 1;i <= m;i++){
int x,y;scanf("%d%d",&x,&y);
int ans = query(1,c,rt[x-1],rt[y],y-x+1);
printf(ans == 0 ? "no\n" : "yes %d\n",ans);
}
return 0;
}
[四校联考P3] 区间颜色众数 (主席树)的更多相关文章
- [2017/5/28]FJ四校联考
来自FallDream的博客,未经允许,请勿转载,谢谢. 话说这一段时间算是过去了,好久好久之后终于又有联考了 没想到这次到我们学校出题,昨天才想起来,临时花一天赶了一套,我出了一个sbFFT,质量 ...
- [3.19FJ四校联考]
来自FallDream的博客.未经允许,请勿转载,谢谢. ---------------------------------------------------- A.积分,不会 以后补 B.给定一 ...
- 四校联考 tree3
我们考虑计算红色点与非红色点的对数. 我们用f[i][j]表示i的子树中有j个红色点的概率,将i所有子树合并. 接着我们对于每一个状态,枚举i是红色还是非红色算概率. 同时我们可以求出i和i子树内一个 ...
- 【四校联考】【比赛题解】FJ NOIP 四校联考 2017 Round 7
此次比赛为厦门一中出题.都是聚劳,不敢恭维. 莫名爆了个0,究其原因,竟然是快读炸了……很狗,很难受. 话不多说,来看看题: [T1] 题意: 样例: PS:1<=h[i]<=100000 ...
- szoj461【四校联考0430】挑战
传送门:(涉及版权忽略) [题解] 我们发现n的范围很小,提示我们可以折半,然后我们就会了O(T2^(n/2)*n)的做法,然而会T. 考虑如何优化.直接排序会多一个log(2^(n/2))也就是n, ...
- 三校联考 Day3
三校联考 Day3 大水题 题目描述:给出一个圆及圆上的若干个点,问两个点间的最远距离. solution 按极角排序,按顺序枚举,显然距离最远的点是单调的,线性时间可解出答案. 大包子的束缚 题目描 ...
- 【赛时总结】NOIP2018-三校联考1024
◇NOIP三校联考-1024◇ 发现以前的博客写得似乎都很水……基本上都没什么阅读量QwQ 决定改过自新╰( ̄ω ̄o) 就从这篇博客开始吧~ 现场考得无地自容,看到题解才发现一些东西……(我第三题还没 ...
- [2019多校联考(Round 6 T3)]脱单计划 (费用流)
[2019多校联考(Round 6 T3)]脱单计划 (费用流) 题面 你是一家相亲机构的策划总监,在一次相亲活动中,有 n 个小区的若干男士和 n个小区的若干女士报名了这次活动,你需要将这些参与者两 ...
- [多校联考2019(Round 5 T2)]蓝精灵的请求(二分图染色+背包)
[多校联考2019(Round 5)]蓝精灵的请求(二分图染色+背包) 题面 在山的那边海的那边住着 n 个蓝精灵,这 n 个蓝精灵之间有 m 对好友关系,现在蓝精灵们想要玩一个团队竞技游戏,需要分为 ...
随机推荐
- stdout( 标准输出流)和 stderr( 标准输入流) 重定向问题
我想把提示信息和错误信息列表都写入到同一个文件里, /* ** 设置流, 使输出与错误流都指向指定的文件 */ if( (output1 = freopen( PATH, "a", ...
- PHP中文函数顺序排列一数组且其序数不变
函数Abs() 描述: mixed abs (mixed number); Returns the absolute value of number. If the argument number i ...
- numpy使用
计算矩阵的一些用法: http://www.360doc.com/content/13/1104/17/9934052_326603249.shtml
- poj1006-Biorhythms(中国剩余定理)
一,题意:右上角中文.二,思路: 1,由题意得出方程组 2,利用中国剩余定理求解 3,求出最小正整数三,步骤: 1,由题意得出方程组 (n+d) % 23 = p ; (n+d) % 28 = e ; ...
- json对象与json字符串对象格式
var cStr = "{\"c\":\"{\\\"b\\\":\\\"000\\\",\\\"b2\\\&q ...
- 【iCore3 双核心板_FPGA】Quartus 如何生成jic文件
PDF下载: http://pan.baidu.com/s/1i5lQ0Rj iCore3 购买链接: https://item.taobao.com/item.htm?id=524229438677
- iOS审核秘籍】提审资源检查大法
iOS审核秘籍]提审资源检查大法 2015/11/27 阅读(752) 评论(1) 收藏(6) 加入人人都是产品经理[起点学院]产品经理实战训练营,BAT产品总监手把手带你学产品点此查看详情! 本篇主 ...
- an alternative to symmetric multiprocessing
COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION 17.5 CLUSTERSAn impor ...
- P1072 Hankson 的趣味题
#include<bits/stdc++.h> #define inf 1000000000 #define ll long long using namespace std; int r ...
- Slip.js(移动端跟随手指滑动组件,零依赖)
Slip.js可用于移动端滑动banner,移动端整屏滑动等效果,个人觉得用于移动端滑动banner比较好,不会和iScroll.js起冲突,因为它不依赖任何其它的js库. Html: <!do ...