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); } }
祝AC
以上是关于BZOJ 3809Gty的二逼妹子序列 解题报告+data marker的主要内容,如果未能解决你的问题,请参考以下文章