bzoj 3781 小B的询问(莫队算法)
2016-04-01 09:38
218 查看
【题意】
若干个询问sigma{ cnt[i]^2 } cnt[i]表示i在[l,r]内的出现次数。
【思路】
莫队算法,裸题。
一个cnt数组即可维护插入与删除。
【代码】
若干个询问sigma{ cnt[i]^2 } cnt[i]表示i在[l,r]内的出现次数。
【思路】
莫队算法,裸题。
一个cnt数组即可维护插入与删除。
【代码】
#include<set> #include<cmath> #include<queue> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define trav(u,i) for(int i=front[u];i;i=e[i].nxt) #define FOR(a,b,c) for(int a=(b);a<=(c);a++) using namespace std; typedef long long ll; const int N = 5e5+10; ll read() { char c=getchar(); ll f=1,x=0; while(!isdigit(c)) { if(c=='-') f=-1; c=getchar(); } while(isdigit(c)) x=x*10+c-'0',c=getchar(); return x*f; } struct Node { int id,pos,l,r; bool operator < (const Node& rhs) const { return pos<rhs.pos || (pos==rhs.pos&&r<rhs.r); } } q ; int n,m,K,a ; ll ans ,cnt ,now; void upd(int x,int v) { now-=cnt[a[x]]*cnt[a[x]]; cnt[a[x]]+=v; now+=cnt[a[x]]*cnt[a[x]]; } int main() { // freopen("in.in","r",stdin); // freopen("out.out","w",stdout); n=read(),m=read(),K=read(); FOR(i,1,n) a[i]=read(); int B=sqrt(n); FOR(i,1,m) { q[i].l=read(), q[i].r=read(); q[i].id=i; q[i].pos=(q[i].l-1)/B+1; } sort(q+1,q+m+1); int l=1,r=0; FOR(i,1,m) { while(l<q[i].l) upd(l++,-1); while(l>q[i].l) upd(--l,1); while(r>q[i].r) upd(r--,-1); while(r<q[i].r) upd(++r,1); ans[q[i].id]=now; } FOR(i,1,m) printf("%lld\n",ans[i]); return 0; }
相关文章推荐
- Spotlight On Oracle略识
- .net 通过输入文本框进行下拉式菜单的联想搜索(资料3)
- OC细节——“标准初始化模板”
- lucene5.5根据现有分词器改造做同义词分词器
- HttpServlet
- java5 ReadWriteLock用法--读写锁实现
- SearchRequestBuilder常用方法说明
- SearchRequestBuilder常用方法说明
- 文件上传 - iframe上传
- XMLHTTP.readyState的五种状态
- iOS App设计模式开发中对建造者模式的运用实例
- CodeForces - 367C Sereja and the Arrangement of Numbers (图论&不懂)
- 2015年蓝桥杯C/C++组:串逐位和
- ios 内存管理与property copy strong weak assign
- bat重命名文件名
- this指针详解
- struts2中的constant配置详解
- HostMonitor监控主机状态
- 很有哲理的话
- 日常工作使用连接