nbut1457 Sona 【莫队算法+离散化】
2016-04-20 14:14
411 查看
map离散化会超时
答案会爆int,long long 输出控制为%I64d
答案会爆int,long long 输出控制为%I64d
#include<algorithm> #include<iostream> #include<string.h> #include<stdio.h> #include<math.h> #include<map> using namespace std; typedef long long ll; const int N=100000+10; struct node { int l,r,id; }Q ; int pos ,n,m,L,R,a ,b ,has ; int cmp(node a,node b) { if(pos[a.l]==pos[b.l]) return a.r<b.r; return pos[a.l]<pos[b.l]; } ll out ,ans,mp ; void add(int x) { int t=a[x]; ans=ans-(ll)mp[t]*mp[t]*mp[t]; mp[t]++; ans=ans+(ll)mp[t]*mp[t]*mp[t]; } void del(int x) { int t=a[x]; ans=ans-mp[t]*mp[t]*mp[t]; mp[t]--; ans=ans+mp[t]*mp[t]*mp[t]; } int main() { while(~scanf("%d",&n)) { int sz=(int)sqrt(1.0*n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); pos[i]=i/sz; b[i]=a[i]; } sort(b+1,b+n+1); int t=1; has[t]=b[1]; for(int i=2;i<=n;i++) { if(b[i]==b[i-1]) continue; t++; has[t]=b[i]; } for(int i=1;i<=n;i++) { a[i]=lower_bound(has+1,has+t+1,a[i])-has+1; } scanf("%d",&m); for(int i=1;i<=m;i++) { scanf("%d%d",&Q[i].l,&Q[i].r); Q[i].id=i; } sort(Q+1,Q+1+m,cmp); memset(mp,0,sizeof(mp)); L=1; R=0; ans=0; for(int i=1;i<=m;i++) { while(L<Q[i].l) { del(L); L++; } while(L>Q[i].l) { L--; add(L); } while(R<Q[i].r) { R++; add(R); } while(R>Q[i].r) { del(R); R--; } out[Q[i].id]=ans; } for(int i=1;i<=m;i++) printf("%I64d\n",out[i]); } return 0; }
相关文章推荐
- linux驱动中实现上层select接口
- c++知识总结
- GEEK学习笔记— —程序员面试宝典笔记(二)
- Pm命令用法
- NAT穿透的详解及分析(NAT类型举例解释及穿透技术)
- 【NOIP2015模拟11.3】备用钥匙
- Retrofit-基本使用
- Android初学习 - Service 中的 onStart 和 onStartCommand
- 如何下载DB2的license ?
- unity 实现流光效果
- Linux中变量#,#,@,0,0,1,2,2,*,$$,$?的含义
- unity 实现流光效果
- 假如UI提供的是矢量图
- Android上层访问HAL层(呼吸灯测试代码)
- iOS之UI组件整理
- string_01
- dpi 、 dip 、分辨率、屏幕尺寸、px、density 关系以及换算
- nginx配置解释及优化
- C++编程中的函数指针初步解析
- CodeForces - 664A Complicated GCD (技巧)水