BZOJ 3236: [Ahoi2013]作业|莫队算法|树状数组
2016-02-17 15:14
441 查看
这个题显然是需要二维的做法
先用莫队离线对询问排序后维护两个树状数组,记录两个询问的答案,对于第二个询问,可以再开一个数组,记录每个数出现的次数
先用莫队离线对询问排序后维护两个树状数组,记录两个询问的答案,对于第二个询问,可以再开一个数组,记录每个数出现的次数
#include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<queue> #include<vector> #include<set> #include<map> #include<iostream> #include<algorithm> #define lowbit(x) (x&(-x)) #define N 100010 using namespace std; int sc() { int i=0,f=1; char c=getchar(); while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar(); return i*f; } struct W{int l,r,a,b,p;}a[N*10]; int sum ,tr ,TR ,v ; int bl ,ans[N*10][2]; int n,m,block; bool cmp(W x,W y) { return bl[x.l]==bl[y.l]?x.r<y.r:bl[x.l]<bl[y.l]; } void change(int x,int f,int *tr) { for(;x<=n;x+=lowbit(x))tr[x]+=f; } int ask(int x,int *tr) { if(x<1)return 0; int ans=0; for(;x;x-=lowbit(x))ans+=tr[x]; return ans; } void add(int x) { change(x,1,tr); sum[x]++; if(sum[x]==1) change(x,1,TR); } void del(int x) { change(x,-1,tr); sum[x]--; if(sum[x]==0) change(x,-1,TR); } int main() { n=sc(),m=sc();block=sqrt(n); for(int i=1;i<=n;i++) { v[i]=sc(); bl[i]=(i-1)/block+1; } for(int i=1;i<=m;i++) a[i].l=sc(),a[i].r=sc(), a[i].a=sc(),a[i].b=sc(), a[i].p=i; sort(a+1,a+m+1,cmp); int L=a[1].l,R=a[1].l-1; for(int i=1;i<=m;i++) { while(L<a[i].l)del(v[L++]); while(L>a[i].l)add(v[--L]); while(R>a[i].r)del(v[R--]); while(R<a[i].r)add(v[++R]); ans[a[i].p][0]=ask(a[i].b,tr)-ask(a[i].a-1,tr); ans[a[i].p][1]=ask(a[i].b,TR)-ask(a[i].a-1,TR); } for(int i=1;i<=m;i++) printf("%d %d\n",ans[i][0],ans[i][1]); return 0; }
相关文章推荐
- 此版本的 SQL Server 不支持用户实例登录标志。该连接将关闭“的解决
- ps 命令
- (void __user *)arg 中__user的作用
- Android Studio混合ionicApp 的签名打包上架
- [置顶] 二叉搜索树的搜索、插入、后继、删除
- maven打包加时间戳
- 打开linux主机的端口快速释放
- Xcode报png图片格式错误
- Ubuntu下如何解压缩zip,tar,tar.gz,tar.bz2文件
- 【codevs1021】玛丽卡,以前屯着的最短路
- python 算法基础查找和二维数组转换
- loadScript,非阻塞 JavaScript 加载库
- Tomcat报错—Tomcat内存溢出及大小调整
- 高德地图API KEY出现INVALID_USER_SCODE的解决过程
- 配置gosublime
- 导航属性(外键)
- 解决:本地测试wordpress安装主题需要FTP问题
- Spring MVC和Struts2的比较
- 分治法(divide & conquer algorithm)的理解
- 灵活运用IOS类别(Category)和扩展(Extension)