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

时间: 2024-10-26 08:13:58

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

【BZOJ 3809】 3809: Gty的二逼妹子序列 (莫队+分块)

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

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

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

【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)

【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)

P4867 Gty的二逼妹子序列

题目描述 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]的权值的种类数. 输入输出格式 输入格式: 第一行包括两个整数n,m(1≤n≤100000,1≤m≤10000

【BZOJ】3809: Gty的二逼妹子序列

http://www.lydsy.com/JudgeOnline/problem.php?id=3809 题意:n个元素(1<=n<=100000)每个元素有一权值<=n.q个询问,1<=q<=1000000,每次询问区间[l, r]的权值在区间[a, b]的种类数.时限35s... #include <cstdio> #include <cstring> #include <cmath> #include <string> #

bzoj 3809 Gty的二逼妹子序列 —— 莫队+分块

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3809 据说一开始应该想到莫队+树状数组,然而我想的却是莫队+权值线段树... 如果用权值线段树,则修改和查询都是 O(logn),总复杂度 O(n√nlogn),艰难...(而且仔细一看空间有点卡?) 看了TJ,才发现权值也可以分块,则查询 O(√n) 但修改 O(1),就可以过咯~ 代码如下: #include<iostream> #include<cstdio> #inc

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 /**************************************************