Codeforces Round #442 (Div. 2) F. Ann and Books(莫队)
来源:互联网 发布:fastdfs nginx 400 编辑:程序博客网 时间:2024/06/09 18:29
题目链接:http://codeforces.com/problemset/problem/877/F
貌似每次查询区间内所有的子区间的问题一般都用莫队啊?
然后发现其实有用的值只有3*n个,所以可以全部离散化之后做到nsqrt(n)。
要特殊处理以L为头的区间的。剩下的题解说的挺清楚的了。
代码:
#include<bits/stdc++.h>using namespace std;typedef long long ll;const int MAXN=1e5+5;ll sum[MAXN],Ans[MAXN],ans;ll HASH[MAXN*3],LEFT[MAXN],RIGHT[MAXN],sv[MAXN*3];int pos[MAXN],t[MAXN],a[MAXN],tot;struct query{ int l,r,id;}Q[MAXN];bool cmp(const query a,const query b){ if(pos[a.l]==pos[b.l]) return a.r<b.r; return pos[a.l]<pos[b.l];}int getid(ll x){int ret=lower_bound(HASH+1,HASH+1+tot,x)-HASH;return ret;}int L=1,R=0;void DelLeft(){sv[sum[L]]--;ans-=sv[RIGHT[L]];L++;}void DelRight(){sv[sum[R]]--;ans-=sv[LEFT[R]];R--;}void AddLeft(){L--;ans+=sv[RIGHT[L]];sv[sum[L]]++;}void AddRight(){R++;ans+=sv[LEFT[R]];sv[sum[R]]++;}int main(){//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);int n,k,q;scanf("%d%d",&n,&k);int sz=ceil(sqrt(1.0*n));tot=0;for(int i=1;i<=n;i++){scanf("%d",&t[i]);}for(int i=1;i<=n;i++){scanf("%d",&a[i]);}for(int i=1;i<=n;i++){sum[i]=sum[i-1]+((t[i]==1?1:-1)*a[i]);pos[i]=(i-1)/sz;LEFT[i]=sum[i]-k;RIGHT[i]=sum[i]+k;HASH[++tot]=sum[i];HASH[++tot]=LEFT[i];HASH[++tot]=RIGHT[i];}HASH[++tot]=0;HASH[++tot]=k;HASH[++tot]=-k;sum[0]=0;LEFT[0]=-k;RIGHT[0]=k;sort(HASH+1,HASH+1+tot);tot=unique(HASH+1,HASH+1+tot)-HASH-1;for(int i=0;i<=n;i++){sum[i]=getid(sum[i]);LEFT[i]=getid(LEFT[i]);RIGHT[i]=getid(RIGHT[i]);}scanf("%d",&q);for(int i=1;i<=q;i++){scanf("%d%d",&Q[i].l,&Q[i].r);Q[i].id=i;}sort(Q+1,Q+1+q,cmp);ans=0;for(int i=1;i<=q;i++) { int id=Q[i].id; while(R<Q[i].r)AddRight(); while(L>Q[i].l)AddLeft(); while(R>Q[i].r)DelRight(); while(L<Q[i].l)DelLeft(); Ans[id]=ans+sv[RIGHT[L-1]]; }for(int i=1;i<=q;i++){printf("%lld\n",Ans[i]);}return 0;}
阅读全文
0 0
- Codeforces Round #442 (Div. 2) F. Ann and Books
- Codeforces Round #442 (Div. 2) F. Ann and Books(莫队)
- Codeforces Round #442 (Div. 2) F. Ann and Books 莫队,离散化
- Codeforces Round #442 (Div. 2) F. Ann and Books (莫队分块)
- Codeforces Round #442 (Div. 2) F. Ann and Books (莫队算法+离散化)
- [Codeforces 877F] Ann and Books
- B. Vanya and Books(Codeforces Round #308 (Div. 2))
- Codeforces Round #311 (Div. 2) E - Ann and Half-Palindrome(字典树+dp)
- Codeforces Round #308 (Div. 2) Vanya and Books
- Codeforces Round #308 (Div. 2) B. Vanya and Books
- codeforces 877F F. Ann and Books hash+莫队算法
- Codeforces Round #442 (Div. 2) 877 F
- Codeforces Round #311 (Div. 2) E. Ann and Half-Palindrome (DP+字典树)
- Codeforces Round #311 (Div. 2) E. Ann and Half-Palindrome 字典树
- Codeforces Round #442 (Div. 2) 题解(877A~F)
- DP Codeforces Round #322 (Div. 2) F. Zublicanes and Mumocrates
- Codeforces Round #379 (Div. 2) F. Anton and School
- Codeforces Round #322 (Div. 2) F. Zublicanes and Mumocrates(树形dp)
- Linux--机器性能分析
- IOS 截取屏幕截图方法
- Redis的数据类型及操作(一):string类型及操作
- Python模块
- 数据库学习1
- Codeforces Round #442 (Div. 2) F. Ann and Books(莫队)
- 安卓编程之安卓开发初体验
- [noip2013]花匠 题解
- 【p1880】石子合并
- CMD 创建一个空文件
- 实现矩阵从外围到内依次输出
- 下拉列表左右选择(js代码)
- 模板的声明和实现为何要放在头文件中?
- 【Unity】多边形雷达图