bzoj3809

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3809

题目大意:

    Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题。

    对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数。

    为了方便,我们规定妹子们的美丽度全都在[1,n]中。

    给定一个长度为n(1<=n<=100000)的正整数序列s(1<=si<=n),对于m(1<=m<=1000000)次询问“l,r,a,b”,每次输出sl...sr中,权值∈[a,b]的权值的种类数。

题解:莫队+树状数组

代码:

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<algorithm>
 6 #define maxn 100000
 7 using namespace std;
 8 int n,m;
 9 int pos[maxn],val[maxn],c[maxn],bo[maxn],ans[maxn*10];
10 struct data{
11     int l,r,a,b,id;
12 }a[maxn*10];
13 int read()
14 {
15     int x=0; char ch; bool bo=0;
16     while (ch=getchar(),ch<‘0‘||ch>‘9‘) if (ch==‘-‘) bo=1;
17     while (x=x*10+ch-‘0‘,ch=getchar(),ch>=‘0‘&&ch<=‘9‘) ;
18     if (bo) return -x; return x;
19 }
20 int lowbit(int x){ return x&-x;
21 }
22 void add(int x,int v)
23 {
24     for (int i=x; i<=n; i+=lowbit(i)) c[i]+=v;
25 }
26 int query(int x)
27 {
28     int res=0;
29     for (int i=x; i; i-=lowbit(i)) res+=c[i];
30     return res;
31 }
32 bool cmp(data a,data b)
33 {
34     if (pos[a.l]==pos[b.l])
35         if (pos[a.l]&1) return a.r<b.r;
36         else return a.r>b.r;
37     return pos[a.l]<pos[b.l];
38 }
39 void init()
40 {
41     n=read(),m=read();
42     for (int i=1; i<=n; i++) val[i]=read();
43     for (int i=1; i<=m; i++)
44     {
45         a[i].l=read(),a[i].r=read(),a[i].a=read(),a[i].b=read(); a[i].id=i;
46     }
47     int kk=int (sqrt(n));
48     for (int i=1; i<=n; i++) pos[i]=(i-1)/kk+1;
49     sort(a+1,a+1+m,cmp);
50 }
51 void updata(int k,int vval)
52 {
53     if (vval==-1)
54     {
55         if (bo[val[k]]==1)    add(val[k],-1);
56         bo[val[k]]--;
57     }
58     else
59     {
60         if (!bo[val[k]]) add(val[k],1);
61         bo[val[k]]++;
62     }
63 }
64 void work()
65 {
66     int r=0,l=1;
67     for (int i=1; i<=m; i++)
68     {
69         for (; r<a[i].r; r++) updata(r+1,1);
70         for (; r>a[i].r; r--) updata(r,-1);
71         for (; l<a[i].l; l++) updata(l,-1);
72         for (; l>a[i].l; l--) updata(l-1,1);
73         ans[a[i].id]=query(a[i].b)-query(a[i].a-1);
74     }
75     for (int i=1;i<=m; i++)
76         printf("%d\n",ans[i]);
77 }
78 int main()
79 {
80     init();
81     work();
82 }

注:还是我太渣,都垫底了,据说还可以分块+莫队,会快的飞起。

时间: 2024-12-13 03:46:14

bzoj3809的相关文章

BZOJ-3809 Gty的二逼妹子序列

无修改的查询题,分块莫队+树状数组搞之.可这样貌似会Tle…… 于是不用树状数组,改成对权值进行分块,使查询的复杂度变成O(n^0.5),修改则是O(1).(原树状数组的复杂度:查询O(lgn),修改O(lgn)) #include <cstdlib> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <fstream>

BZOJ3809 Gty的二逼妹子序列

终于做到了BZ上最新的题2333 这题一看就是...莫队,然后查询的时候树状数组. 结果T了,诶诶诶诶%>_<%,怎么可以这样! 另寻他法:hzwer的分块 恩恩,就是把颜色分成n块,然后单词修改O(1),单词查询O(n / sz + 2 * sz) sz = sqrt(n / 2)的时候最好(理论上),实际上sz = sqrt(n)一点都不慢....要不要下次试试sz = log(n) 1 /**************************************************

【BZOJ3809】Gty的二逼妹子序列

3809: Gty的二逼妹子序列 Time Limit: 80 Sec  Memory Limit: 28 MBSubmit: 1627  Solved: 481[Submit][Status][Discuss] Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题. 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数. 为了方便,我们规定妹子们的美丽度全都在[1,n]中. 给定一个长度为n(1<=n<=100000)

【莫队算法】【权值分块】bzoj3809 Gty的二逼妹子序列

如题. #include<cstdio> #include<algorithm> #include<cmath> using namespace std; int Num,CH[12],f,c; inline void R(int &x){ c=0;f=1; for(;c<'0'||c>'9';c=getchar())if(c=='-')f=-1; for(x=0;c>='0'&&c<='9';c=getchar())(x

【BZOJ-3809】Gty的二逼妹子序列 分块 + 莫队算法

3809: Gty的二逼妹子序列 Time Limit: 80 Sec  Memory Limit: 28 MBSubmit: 1072  Solved: 292[Submit][Status][Discuss] Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题. 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数. 为了方便,我们规定妹子们的美丽度全都在[1,n]中. 给定一个长度为n(1<=n<=100000)

[BZOJ 3236] [Ahoi2013] 作业 &amp;&amp; [BZOJ 3809] 【莫队 | 分块】

题目链接: BZOJ - 3236   BZOJ - 3809 算法一:莫队 首先,单纯的莫队算法是很好想的,就是用普通的第一关键字为 l 所在块,第二关键字为 r 的莫队. 这样每次端点移动添加或删除一个数字,用树状数组维护所求的信息就是很容易的.由于这里有 logn复杂度,所以复杂度还是挺高的. 于是 BZOJ-3236 的时限 100s,我的代码跑了 98s,险过...... However..BZOJ-3809 的出题人(SLYZ的神犇)就没有这么善良了!直接内存限制 28MB 就直接把

[转载]hzwer的bzoj题单

counter: 664BZOJ1601 BZOJ1003 BZOJ1002 BZOJ1192 BZOJ1303 BZOJ1270 BZOJ3039 BZOJ1191 BZOJ1059 BZOJ1202 BZOJ1051 BZOJ1001 BZOJ1588 BZOJ1208 BZOJ1491 BZOJ1084 BZOJ1295 BZOJ3109 BZOJ1085 BZOJ1041 BZOJ1087 BZOJ3038 BZOJ1821 BZOJ1076 BZOJ2321 BZOJ1934 BZOJ