codeforces86D 莫队算法
2016-05-18 09:46
218 查看
题目链接:http://codeforces.com/problemset/problem/86/D
题目大意:给你n个数,m次询问,Ks为区间内s的数目,求区间[L,R]之间所有Ks*Ks*s的和。1<=n,m<=200000.1<=s<=10^6
思路:直接用莫队算法,前面的博文讲过原理。这里再说一下增加和删除操作。因为要求Ks*Ks*s,所以每次增加一个需要在原有结果上加(Ks*Ks*x - (Ks-1)*(Ks-1)*x),删除的话也是要相应的减去。
莫队算法还是很好用的。
题目大意:给你n个数,m次询问,Ks为区间内s的数目,求区间[L,R]之间所有Ks*Ks*s的和。1<=n,m<=200000.1<=s<=10^6
思路:直接用莫队算法,前面的博文讲过原理。这里再说一下增加和删除操作。因为要求Ks*Ks*s,所以每次增加一个需要在原有结果上加(Ks*Ks*x - (Ks-1)*(Ks-1)*x),删除的话也是要相应的减去。
莫队算法还是很好用的。
#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <fstream> #include <algorithm> #include <cmath> #include <queue> #include <stack> #include <vector> #include <map> #include <set> #include <iomanip> using namespace std; //#pragma comment(linker, "/STACK:102400000,102400000") #define maxn 200050 #define MOD 1000000007 #define mem(a , b) memset(a , b , sizeof(a)) #define LL long long #define ULL unsigned long long #define FOR(i , n) for(int i = 1 ; i<= n ; i ++) typedef pair<int , int> pii; const long long INF= 0x3fffffff; int n , m; int a[maxn],pos[maxn],vis[maxn*10] ; LL ans[maxn],num; struct node { int l , r , id; }q[maxn]; bool cmp(node n1 , node n2) { if(pos[n1.l] == pos[n2.l]) return n1.r < n2.r; return pos[n1.l] < pos[n2.l]; } void add(LL x) { vis[x]++; num += x*(vis[x]*vis[x] - (vis[x]-1)*(vis[x]-1)); } void del(LL x) { vis[x]--; num -= x*((vis[x]+1)*(vis[x]+1) - (vis[x])*(vis[x])); } int main() { while(scanf("%d %d" , &n , &m) != EOF) { mem(vis , 0);mem(ans , 0); double dis = sqrt(1.0*n); for(int i = 1 ; i <= n ;i ++) { scanf("%d" , &a[i]); pos[i] = i/dis; } 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); num = 0; int l = 1 , r = 0; // cout << "YES" << endl; for(int i = 1 ; i <= m ; i ++) { while(r < q[i].r) add(a[++r]); while(r > q[i].r) del(a[r--]); while(l < q[i].l) del(a[l++]); while(l > q[i].l) add(a[--l]); ans[q[i].id] = num; } for(int i = 1 ; i <= m ; i ++) printf("%I64d\n" , ans[i]); } return 0; }
相关文章推荐
- Serlvet 处理http请求并保持长连接
- 采购人确认采购文件要把握五要点
- Android Bitmap用法
- EOF\BOF
- poj 1941 The Sierpinski Fractal(递归)
- CDN 备胎技巧
- 消息中间件的技术选型心得-RabbitMQ、ActiveMQ和ZeroMQ
- final的作用
- LeetCode 032 Longest Valid Parentheses
- MyEclipse快捷键大全
- PHP正则表达式入门教程(推荐)
- 让Veritas数据高可用容灾释放你的双手 推荐
- 在Linux或者Unix下打开,每一行都会出多出^M这样的字符
- 全选反选,订单修改删除操作
- java 常见几种发送http请求案例
- XML与 HTML
- 列表视图
- 多态
- 常用正则表达式大全!
- 扩展欧几里德---数论