BZOJ 3809Gty的二逼妹子序列 解题报告+data marker

Posted Der Barde, Nietzsche

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ 3809Gty的二逼妹子序列 解题报告+data marker相关的知识,希望对你有一定的参考价值。

                              --BZOJ

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



 

考虑对l,r跑莫队,对一组维护美丽度出现次数的桶修改,

然后把桶序列用分块维护查询

 

然后是吐槽:

内存28M,哦,这个题居然卡内存。。。。。

卡内存!!!

然后我就为本校的权限号贡献了三次MLE......

 

代码:

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<algorithm>
 4 using std::sort;
 5 struct ss{
 6     int l,r,a,b,num;
 7 }x[1000010];
 8 int n,m,cut;
 9 int tong[100005];
10 int id[100005];
11 int mark[400];
12 int a[100005];
13 int ans[1000010];
14 bool cmp(ss a,ss b){
15     if(id[a.l]==id[b.l])
16         return a.r<b.r;
17     return id[a.l]<id[b.l];
18 }
19 inline void in(int &ans)
20 {
21     ans=0;bool p=false;char ch=getchar();
22     while((ch>\'9\' || ch<\'0\')&&ch!=\'-\') ch=getchar();
23     if(ch==\'-\') p=true,ch=getchar();
24     while(ch<=\'9\'&&ch>=\'0\') ans=ans*10+ch-\'0\',ch=getchar();
25     if(p) ans=-ans;
26 }
27 void modui();
28 int fin_brick(int l,int r);
29 int main()
30 {
31     int i,j,k;
32     in(n),in(m);
33     cut=(int)sqrt(n);
34     if(cut*cut<n)cut++;
35     for(i=1;i<=n;i++)
36         in(a[i]);
37     for(i=1;i<=m;i++)
38         in(x[i].l),in(x[i].r),in(x[i].a),in(x[i].b),x[i].num=i;
39     for(i=1;i<=n;i++)
40         id[i]=i/cut;
41     sort(x+1,x+m+1,cmp);
42     modui();
43     for(i=1;i<=m;i++)
44         printf("%d\\n",ans[i]);
45     return 0;
46 }
47 void modui(){
48     int l_p=x[1].l,r_p=x[1].l-1,i;
49     for(i=1;i<=m;i++){
50         while(r_p<x[i].r){
51             r_p++;
52             if(!tong[a[r_p]])
53                 mark[a[r_p]/cut]++;
54             tong[a[r_p]]++;
55         }
56         while(r_p>x[i].r){
57             tong[a[r_p]]--;
58             if(!tong[a[r_p]])
59                 mark[a[r_p]/cut]--;
60             r_p--;
61         }
62         while(l_p>x[i].l){
63             l_p--;
64             if(!tong[a[l_p]])
65                 mark[a[l_p]/cut]++;
66             tong[a[l_p]]++;
67         }
68         while(l_p<x[i].l){
69             tong[a[l_p]]--;
70             if(!tong[a[l_p]])
71                 mark[a[l_p]/cut]--;
72             l_p++;
73         }
74         ans[x[i].num]=fin_brick(x[i].a,x[i].b);
75     }
76 }
77 int fin_brick(int l,int r){
78     int b_l=l/cut,b_r=r/cut,ll=l%cut,rr=r%cut;
79     int i,j,ans=0;
80     if(b_l==b_r){
81         for(i=l;i<=r;i++)
82             if(tong[i])
83                 ans++;
84         return ans;
85     }
86     for(i=ll,j=l;i<=cut-1;i++,j++)
87         if(tong[j])
88             ans++;
89     for(i=rr,j=r;i>=0;i--,j--)
90         if(tong[j])
91             ans++;
92     b_l++;b_r--;
93     for(i=b_l;i<=b_r;i++)
94         ans+=mark[i];
95     return ans;
96 }
#include<cstdio>
#include<cstdlib>
#include<ctime>
using namespace std;
int main()
{
    srand(time(0));
    int n=100000,m=1000000;
    int i;
    printf("%d %d\\n",n,m);
    for(i=1;i<=n;i++)
        printf("%d ",rand()%n+1);
    printf("\\n");
    for(i=1;i<=m;i++){
        int l=rand()%n+1,a=rand()%n+1;
        int r=l+rand()%(n-l+1),b=a+rand()%(n-a+1);
        printf("%d %d %d %d\\n",l,r,a,b);
    }
}
data_maker

祝AC

以上是关于BZOJ 3809Gty的二逼妹子序列 解题报告+data marker的主要内容,如果未能解决你的问题,请参考以下文章

Bzoj 3809: Gty的二逼妹子序列 莫队,分块

BZOJ 3809 Gty的二逼妹子序列

bzoj3809 Gty的二逼妹子序列

[bzoj 3809]Gty的二逼妹子序列

BZOJ 3809 Gty的二逼妹子序列 | 莫队 + 分块

bzoj3809:Gty的二逼妹子序列