Bzoj3236:[Ahoi2013]作业:莫队算法+树状数组
2016-03-23 21:25
405 查看
题目链接:3236:[Ahoi2013]作业
这题……
很水的一道莫队,只要用一个树状数组维护数值出现的前缀和就行就行
然而……
可怜的我真是T得蛋疼了QAQ
先是写了一发裸莫队,T
卧槽T了?
快速读入!!!
卧槽又T了?
快速输出!!!
可怜这还是我人生第一次快速输出QAQ
卧槽还T?
拖标程!!!
静态查看,无果……
卧槽优化初始区间!
卧槽槽槽又又又TTT了了了?
想到以前预处理lowbit(i)有效果走起┏ (゜ω゜)=☞
然而自测极限数据6.23S->6.20S什么鬼QAQ
鬼畜的标程怎么这么快!!!
然而亲测标程极限数据……
7.304S你特么是在逗我!!!!!
被OJ抛弃的孩子QAQ
等等标程真的能过吗!!!
测测测
卧槽90S过了……
(ಥ_ಥ)
有毒有毒……
代码放在这里了,有神犇闲得无聊告诉我怎么让他不T吧……
这题……
很水的一道莫队,只要用一个树状数组维护数值出现的前缀和就行就行
然而……
可怜的我真是T得蛋疼了QAQ
先是写了一发裸莫队,T
卧槽T了?
快速读入!!!
卧槽又T了?
快速输出!!!
可怜这还是我人生第一次快速输出QAQ
卧槽还T?
拖标程!!!
静态查看,无果……
卧槽优化初始区间!
卧槽槽槽又又又TTT了了了?
想到以前预处理lowbit(i)有效果走起┏ (゜ω゜)=☞
然而自测极限数据6.23S->6.20S什么鬼QAQ
鬼畜的标程怎么这么快!!!
然而亲测标程极限数据……
7.304S你特么是在逗我!!!!!
被OJ抛弃的孩子QAQ
等等标程真的能过吗!!!
测测测
卧槽90S过了……
(ಥ_ಥ)
有毒有毒……
代码放在这里了,有神犇闲得无聊告诉我怎么让他不T吧……
#include<cmath> #include<ctime> #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define lowbit(x) x&-x using namespace std; const int maxn=101000; const int maxm=1000100; int n,m,b[maxn],cnt[maxm],ans1[maxm],p[maxn]; struct ques{int l,r,a,b,id;}q[maxm]; int s1[maxm],s2[maxm],ans2[maxm],low[maxn]; inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } inline void qwrite(int num){ char ch[10]={0}; while(ch[++ch[0]]=num%10+'0',num/=10,num); while(putchar(ch[ch[0]]),--ch[0],ch[0]); } bool cmp(const ques &a,const ques &b){ return (p[a.l]<p[b.l]||(p[a.l]==p[b.l]&&a.r<b.r)); } void update1(int x,int v){ for (int i=x;i<=n;i+=lowbit(i)) s1[i]+=v; } void update2(int x,int v){ for (int i=x;i<=n;i+=lowbit(i)) s2[i]+=v; } int query1(int x){ if (x<1) return 0; int ret=0; for (int i=x;i;i-=lowbit(i)) ret+=s1[i]; return ret; } int query2(int x){ if (x<1) return 0; int ret=0; for (int i=x;i;i-=lowbit(i)) ret+=s2[i]; return ret; } void getdel(int x){ update1(x,-1); cnt[x]--; if (!cnt[x]) update2(x,-1); } void getadd(int x){ update1(x,1); cnt[x]++; if (cnt[x]==1) update2(x,1); } int main(){ n=read(); m=read(); int blo=(int)sqrt(n); for (int i=1;i<=n;++i) b[i]=read(),p[i]=(i-1)/blo+1; for (int i=1;i<=m;++i){ q[i].l=read(); q[i].r=read(); q[i].a=read(); q[i].b=read(); q[i].id=i; } sort(q+1,q+m+1,cmp); int l=q[1].l,r=q[1].l-1; for (int i=1;i<=m;++i){ while (l<q[i].l) getdel(b[l++]); while (r>q[i].r) getdel(b[r--]); while (l>q[i].l) getadd(b[--l]); while (r<q[i].r) getadd(b[++r]); ans1[q[i].id]=query1(q[i].b)-query1(q[i].a-1); ans2[q[i].id]=query2(q[i].b)-query2(q[i].a-1); } for (int i=1;i<=m;++i) qwrite(ans1[i]),putchar(' '),qwrite(ans2[i]),printf("\n"); }
相关文章推荐
- WHOIS类的修改版
- Codeforces Coder-Strike 2014 - Finals (online edition, Div. 1)
- BZOJ3275 Number (最小割)
- HDU 1166 敌兵布阵
- POJ 2352 Stars
- Begins and tests
- USACO2013 Nov. Gold T3,一道集合DP
- 数学-素数筛及其拓展
- 最大流模板
- 计算几何模板
- 各种树模板(splay,线段树,可持久化线段树...)
- 上下界网络流初探
- 二分图匹配模板
- PAT 1057 Stack (30)
- neu 1438 树状数组求逆序数
- CCC 2015 总结&回顾
- poj 2352
- 树状数组
- hdu 4630 No Pain No Game 树状数组
- 树状数组区间求和的三种模型