首页 > 代码库 > BZOJ 3809Gty的二逼妹子序列 解题报告+data marker

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