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>
10 #include<stack>
11 #include<map>
12 #include<set>
13 #define rre(i,r,l) for(int i=(r);i>=(l);i--)
14 #define re(i,l,r) for(int i=(l);i<=(r);i++)
15 #define Clear(a,b) memset(a,b,sizeof(a))
16 #define inout(x) printf("%d",(x))
17 #define douin(x) scanf("%lf",&x)
18 #define strin(x) scanf("%s",(x))
19 #define LLin(x) scanf("%lld",&x)
20 #define op operator
21 #define CSC main
22 typedef unsigned long long ULL;
23 typedef const int cint;
24 typedef long long LL;
25 using namespace std;
26 void inin(int &ret)
27 {
28     ret=0;int f=0;char ch=getchar();
29     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=1;ch=getchar();}
30     while(ch>=‘0‘&&ch<=‘9‘)ret*=10,ret+=ch-‘0‘,ch=getchar();
31     ret=f?-ret:ret;
32 }
33 int root[500050],l[10000010],r[10000010],sum[10000010];
34 int n,m,ed;
35 void update(int ll,int rr,int x,int &y,int xx)
36 {
37     y=++ed,sum[y]=sum[x]+1;
38     if(ll==rr)return ;
39     l[y]=l[x],r[y]=r[x];
40     int mid=(ll+rr)>>1;
41     if(xx<=mid)update(ll,mid,l[x],l[y],xx);
42     else update(mid+1,rr,r[x],r[y],xx);
43 }
44 int query(int L,int R)
45 {
46     int ll=1,rr=n,mid,x=root[L-1],y=root[R],temp=(R-L+1)>>1;
47     while(ll<rr)
48     {
49         if(sum[y]-sum[x]<=temp)return 0;mid=(ll+rr)>>1;
50         if(sum[l[y]]-sum[l[x]]>temp)rr=mid,x=l[x],y=l[y];
51         else if(sum[r[y]]-sum[r[x]]>temp)ll=mid+1,x=r[x],y=r[y];
52         else return 0;
53     }
54     return ll;
55 }
56 int CSC()
57 {
58     inin(n),inin(m);
59     re(i,1,n)
60     {
61         int x;inin(x);
62         update(1,n,root[i-1],root[i],x);
63     }
64     re(i,1,m)
65     {
66         int ll,rr;inin(ll),inin(rr);
67         printf("%d\n",query(ll,rr));
68     }
69     return 0;
70 }

bzoj3524

 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>
10 #include<stack>
11 #include<map>
12 #include<set>
13 #define rre(i,r,l) for(int i=(r);i>=(l);i--)
14 #define re(i,l,r) for(int i=(l);i<=(r);i++)
15 #define Clear(a,b) memset(a,b,sizeof(a))
16 #define inout(x) printf("%d",(x))
17 #define douin(x) scanf("%lf",&x)
18 #define strin(x) scanf("%s",(x))
19 #define LLin(x) scanf("%lld",&x)
20 #define op operator
21 #define CSC main
22 typedef unsigned long long ULL;
23 typedef const int cint;
24 typedef long long LL;
25 using namespace std;
26 void inin(int &ret)
27 {
28     ret=0;int f=0;char ch=getchar();
29     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=1;ch=getchar();}
30     while(ch>=‘0‘&&ch<=‘9‘)ret*=10,ret+=ch-‘0‘,ch=getchar();
31     ret=f?-ret:ret;
32 }
33 int root[500050],l[10000010],r[10000010],sum[10000010];
34 int n,m,ed;
35 void update(int ll,int rr,int x,int &y,int xx)
36 {
37     y=++ed,sum[y]=sum[x]+1;
38     if(ll==rr)return ;
39     l[y]=l[x],r[y]=r[x];
40     int mid=(ll+rr)>>1;
41     if(xx<=mid)update(ll,mid,l[x],l[y],xx);
42     else update(mid+1,rr,r[x],r[y],xx);
43 }int lim;
44 int query(int L,int R)
45 {
46     if(L>R)swap(L,R);
47     int ll=1,rr=lim,mid,x=root[L-1],y=root[R],temp=(R-L+1)>>1;
48     while(ll!=rr)
49     {
50         if(sum[y]-sum[x]<=temp)return 0;mid=(ll+rr)>>1;
51         if(sum[l[y]]-sum[l[x]]>temp)rr=mid,x=l[x],y=l[y];
52         else if(sum[r[y]]-sum[r[x]]>temp)ll=mid+1,x=r[x],y=r[y];
53         else return 0;
54     }
55     return ll;
56 }
57 int CSC()
58 {
59     inin(n),inin(lim);
60     re(i,1,n)
61     {
62         int x;inin(x);
63         update(1,lim,root[i-1],root[i],x);
64     }inin(m);
65     re(i,1,m)
66     {
67         int ll,rr;inin(ll),inin(rr);
68         int ans=query(ll,rr);if(ans)cout<<"yes ";else cout<<"no\n";
69         if(ans)printf("%d\n",ans);
70     }
71     return 0;
72 }

bzoj2223

时间: 2024-12-22 07:48:07

bzoj3524 [Poi2014]Couriers/2223 [Coci 2009]PATULJCI的相关文章

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][BZOJ3524][Poi2014]Couriers 主席树

3524: [Poi2014]Couriers Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 2436  Solved: 960[Submit][Status][Discuss] Description 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. Input 第一行两个数n,m.第二行n个数,a[i].接下来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 ********************************************************

BZOJ3524 [Poi2014]Couriers

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3524 题目大意:给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. 题解:感觉这种题,随便搞啊,莫队什么的,主席树也可以啊,就当复习主席树咯 代码: 1 #include<iostream> 2 #include<algorithm> 3 #incl

【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

[Poi2014]Couriers

bzoj3524: [Poi2014]Couriers Description 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. Input 第一行两个数n,m.第二行n个数,a[i].接下来m行,每行两个数l,r,表示询问[l,r]这个区间. Output m行,每行对应一个答案. Sample Input 7 5 1 1 3 2 3 4 3 1 3 1 4 3 7

[bzoj3524][Poi2014]Couriers_主席树

Couriers bzoj-3524 Poi-2014 题目大意:给定n个数的序列,询问区间内是否存在一个在区间内至少出现了(区间长度>>1)次的数.如果有,输出该数,反之输出0. 注释:$1\le n,m\le 5\cdot 10^5$. 想法:主席树裸题. 主流做法就是弄一个Existence数组询问有没有这样的数,然后查询区间中位数即可. 但是可以在query的时候强行查询,因为没有输出0,直接输出即可. 最后,附上丑陋的代码... ... #include <iostream&g

3524: [Poi2014]Couriers -- 主席树

3524: [Poi2014]Couriers Time Limit: 20 Sec  Memory Limit: 256 MB Description 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. Input 第一行两个数n,m.第二行n个数,a[i].接下来m行,每行两个数l,r,表示询问[l,r]这个区间. Output m行,每行对应一个答案. Sample