BZOJ2223 PATULJCI COCI2009_CONTSET3

背景:

输入:

输出:

大意:

白雪公主和N个小矮人住在森林里。每天早上,矮人们排成一队出去挖矿的路上,白雪公主就负责给他们拍照,并把这些照片传到社交网络上去。

白雪每次都会拍很多照片,她要从中选出一些完美的照片。小矮人们都戴着不同颜色的

帽子。如果照片上小矮人们有一半以上人戴着相同颜色的帽子,则这张照片就算是美丽的。

也就是说,如果照片上有K个人,如果有多于K/2的人带着相同颜色的帽子,则这张照片就是美丽的。

现在,写一个程序来检测相片集M是不是美丽的,并且判断出美丽照片上,哪种是主要的颜色。

思路:我们可以考虑一个随机算法,在区间[A,B] 中任意找到一个值,如果有照片是pretty的,那么找一次找到的可能性就是>12的。所以只要我们枚举到20次那么我们错误的概率就会远小于2?20就很不容易错了。那么我们可以想想怎么判断是否是pretty的。

首先,我们可以以颜色为第一关键字,小矮人的位置为第二关键字排个序(颜色可以升序,可以降序,主要是为了把颜色集中,小矮人的位置按照升序)。然后我们便可以用二分查找找到某个区间内的某种颜色的小矮人的数量了(用大于这个 (颜色,位置) 的第一个减去大于等于 大于等于的第一个,便是数量了)。

然后根据随机的思想,我们就可以完成这道题了。

附上代码:

#include<cstdio>
#include<algorithm>
#define PII pair<int, int>
const int S = 17;      //控制随机的次数
#define MAXN 300005
using namespace std;
int a[MAXN];
PII b[MAXN];
int n, m, q;
int main()
{
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i ++)
    {
        scanf("%d", &a[i]);
        b[i] = PII(a[i], i);
    }
    sort(b + 1, b + n + 1);
    int t1, t2;
    scanf("%d", &q);
    while(q --)
    {
        scanf("%d%d", &t1, &t2);
        int i, x, cnt;
        for(i = 1; i < S; i ++)
        {
            x = a[t1 + rand()%(t2 - t1 + 1)];
            cnt = upper_bound(b+1, b + n +1, PII(x, t2)) - lower_bound(b + 1, b + n + 1, PII(x, t1));     //找有几个x颜色的在这个区间内。
            if(cnt * 2 > (t2 - t1 + 1))
                break;
        }
        if(i == S)           //没找到
            puts("no");
        else printf("yes %d\n", x);
    }
    return 0;
}

版权声明:请随意转载O(∩_∩)O

时间: 2024-08-05 15:19:45

BZOJ2223 PATULJCI COCI2009_CONTSET3的相关文章

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

【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

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

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

bzoj3524 [Poi2014]Couriers/2223 [Coci 2009]PATULJCI

题目链接1 题目链接2 主席树模板题 两题有细节不同 1 #include<algorithm> 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cstdio> 6 #include<string> 7 #include<cmath> 8 #include<ctime> 9 #include<queue>

【BZOJ】【2223】【COCI 2009】PATULJCI

可持久化线段树 同BZOJ 3524,但是不要像我一样直接贴代码……TAT白白WA了一次,so sad 1 /************************************************************** 2 Problem: 2223 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6 Time:804 ms 7 Memory:73932 kb 8 *********************************

COCI2009 PATULJCI

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