BZOJ2223:[Coci2009]PATULJCI——题解

http://www.lydsy.com/JudgeOnline/problem.php?id=2223

Description

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

Sample Output

no
yes 1
no
yes 1
no
yes 2
no
yes 3

HINT

Notice:输入第二个整数是序列中权值的范围Lim,即1<=ai(1<=i<=n)<=Lim。

1<=Lim<=10000

————————————————————————————

求区间众数(或者可以说求区间内重复次数大于k的数?)

显然主席树可以胜任,我们只需要在query操作修改一下,变成查找区间使得该区间的数的个数必须大于k,那么就很简单了。

这题的范围比较小,所以不需要离散化。

#include<cstdio>
#include<queue>
#include<cctype>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
const int N=300001;
inline int read(){
    int X=0,w=0;char ch=0;
    while(!isdigit(ch)){w|=ch==‘-‘;ch=getchar();}
    while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    return w?-X:X;
}
struct tree{
    int l;
    int r;
    int sum;
}tr[N*50];
int rt[N],n,m,lim,q,pool;
inline void insert(int &y,int &x,int l,int r,int p){
    tr[x=++pool]=tr[y];
    tr[x].sum++;
    if(l==r)return;
    int mid=(l+r)>>1;
    if(p<=mid)insert(tr[y].l,tr[x].l,l,mid,p);
    else insert(tr[y].r,tr[x].r,mid+1,r,p);
    return;
}
inline int query(int nl,int nr,int l,int r,int k){
    if(l==r)return l;
    int d1=tr[tr[nr].l].sum-tr[tr[nl].l].sum;
    int d2=tr[tr[nr].r].sum-tr[tr[nl].r].sum;
    int mid=(l+r)>>1;
    if(d1>k)return query(tr[nl].l,tr[nr].l,l,mid,k);
    if(d2>k)return query(tr[nl].r,tr[nr].r,mid+1,r,k);
    return 0;
}
int main(){
    n=read();
    lim=read();
    for(int i=1;i<=n;i++)insert(rt[i-1],rt[i],1,lim,read());
    q=read();
    for(int i=1;i<=q;i++){
    int l=read(),r=read();
    int ans=query(rt[l-1],rt[r],1,lim,(r-l+1)>>1);
    if(ans)printf("yes %d\n",ans);
    else puts("no");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/luyouqi233/p/8157615.html

时间: 2024-10-13 16:28:43

BZOJ2223:[Coci2009]PATULJCI——题解的相关文章

【BZOJ-2223】PATULJCI 可持久化线段树

2223: [Coci 2009]PATULJCI Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 728  Solved: 292[Submit][Status][Discuss] Description Input Output 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 Sample Input noyes 1noyes 1noyes 2noyes 3 Sample

COCI2009 PATULJCI

给出N个人的颜色,有c种不同的颜色.给出查询次数M查找区间[L,R],对于每次查询操作,问在区间[L,R]是否有有一种颜色的出现的次数>(L+R)/2,如果有,输出yes及颜色的种类,否则输出no. 暴搜大概能过3个点.我的最先思路是对于每种颜色都求一个前缀和,然后每次的查询操作时间复杂度就是O(1),但是光是为了记录颜色的颜色和就已经超时了,而且还要暴内存,于是我们不得不寻求更简便的方法. 每种颜色我们可以按大小排序,大小相同的按出现位置排序,并记录下每一个颜色的出现的位置,保存在一个数组里边

bzoj2223 [Coci 2009]PATULJCI (模板)(主席树)

2223: [Coci 2009]PATULJCI Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1245  Solved: 530[Submit][Status][Discuss] Description HINT 输入第二个整数是序列中权值的范围Lim,即1<=ai(1<=i<=n)<=Lim,1<=Lim<=10000. 主席树模板dearu: 蒟蒻只能码板子了啊(摊): ↓代码 1 #include<ios

BZOJ2223 PATULJCI COCI2009_CONTSET3

背景: 输入: 输出: 大意: 白雪公主和N个小矮人住在森林里.每天早上,矮人们排成一队出去挖矿的路上,白雪公主就负责给他们拍照,并把这些照片传到社交网络上去. 白雪每次都会拍很多照片,她要从中选出一些完美的照片.小矮人们都戴着不同颜色的 帽子.如果照片上小矮人们有一半以上人戴着相同颜色的帽子,则这张照片就算是美丽的. 也就是说,如果照片上有K个人,如果有多于K/2的人带着相同颜色的帽子,则这张照片就是美丽的. 现在,写一个程序来检测相片集M是不是美丽的,并且判断出美丽照片上,哪种是主要的颜色.

BZOJ2223 [Coci 2009]PATULJCI

求区间内个数大于rank的一个数 主席树求一下就好啦! 1 /************************************************************** 2 Problem: 2223 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:704 ms 7 Memory:54712 kb 8 ********************************************************

【BZOJ2223/3524】[Coci 2009]PATULJCI

Description Input Output 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 Sample Input no yes 1 no yes 1 no yes 2 no yes 3 Sample Output HINT Notice:输入第二个整数是序列中权值的范围Lim,即1<=ai(1<=i<=n)<=Lim. 依旧主席树模板,无需离散化. 1<=Lim<=10000 Source

【莫队算法】【权值分块】bzoj2223 [Coci 2009]PATULJCI

不带修改主席树裸题<=>莫队+权值分块裸题. 复杂度O(m*sqrt(n)). P.S.题目描述坑爹,第二个数是权值的范围. #include<cstdio> #include<algorithm> #include<cmath> using namespace std; #define N 300001 #define M 10001 int f,c; inline void R(int &x){ c=0;f=1; for(;c<'0'||c

洛谷 P1079 Vigen&#232;re 密码 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1079 题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为 南军所广泛使用. 在密码学中,我们称需要加密的信息为明文,用 M 表示:称加密后的信息为密文,用 C 表示:而密钥是一种

8.8联考题解

今天的T1让我怀疑我是不是在做奥赛题--这考的是什么知识点啊这个,会不会用绝对值函数? Evensgn 的债务 时间限制: 1 Sec  内存限制: 128 MB 题目描述 Evensgn 有一群好朋友,他们经常互相借钱.假如说有三个好朋友A,B,C.A 欠 B 20 元,B 欠 C 20 元,总债务规模为 20+20=40 元.Evensgn 是个追求简约的人,他觉得这样的债务太繁杂了.他认为,上面的债务可以完全等价为 A 欠C20 元,B 既不欠别人,别人也不欠他.这样总债务规模就压缩到了