CodeForces301D 【BIT】
来源:互联网 发布:微杂志免费制作软件 编辑:程序博客网 时间:2024/05/16 16:03
转自:http://www.cnblogs.com/oyking/archive/2013/08/14/3256922.html
题意:
给你n个数,求区间有多少对除数和被除数的对数
思路:
线段树 区间和/ 树状数组 前缀和
2e5的数的除数最多才81个
对于一个数的贡献,也就是1 - Current_Position的贡献。
Sum[pos]: 1到POS的对数。
对于区间[L,R],如果简单考虑 Sum[1, R] - Sum[1, L] 的话,对于[1,L-1]在[L,R]的有效值很难处理
有种方法:
对区间排序,一个把左端点按升序排序,一个右端点按升序排序,
树状数组维护当前位置1-POS的对数;
单点修改:对一个值,维护以他的倍数的位置。
每次遇到左端点,先减去Sum[1, R] - Sum[1, L]( [1,L-1]在[L,R]的有效值)。(此时不存在[L,R]的有效对数,这个如果想到就简单了吧)
每次遇到右端点,加上 Sum[1, R] - Sum[1, L] (之前该减的已经减了)。
就是 区间端点 排序/从小到大处理
#include <bits/stdc++.h>using namespace std;typedef long long LL;typedef pair<LL,LL>PII;const int N=2e5+10;int temp[N],n;struct asd{ int Left,Right; int id;};asd node1[N],node2[N];int pos[N];int ans[N];bool cmp1(asd x,asd y){ if(x.Left == y.Left) return x.Right < y.Right; return x.Left < y.Left;}bool cmp2(asd x,asd y){ if(x.Right == y.Right) return x.Left < y.Left; return x.Right < y.Right;}int C[N<<1];int lowbit(int x) { return x & (-x);}void add(int x, int d) { while(x <= n) { C[x] += d; x += lowbit(x); }}int Sum(int x) { int s = 0; while(x > 0) { s += C[x]; x -= lowbit(x); } return s;}void update(int x){ for(int i=x;i<=n;i+=x) add(pos[i],1);}int main(){ int m; scanf("%d%d",&n,&m); memset(C,0,sizeof(C)); for(int i=1;i<=n;i++){ scanf("%d",&temp[i]); pos[temp[i]] = i; } for(int i=1;i<=m;i++){ scanf("%d%d",&node1[i].Left,&node1[i].Right); node2[i].Left = node1[i].Left; node2[i].Right = node1[i].Right; node2[i].id = node1[i].id = i; } sort(node1+1,node1+m+1,cmp1); sort(node2+1,node2+m+1,cmp2); int j,k; j = k =1; memset(ans,0,sizeof(ans)); for(int i=1;i<=n;i++){ while(j <= m && node1[j].Left == i){ ans[node1[j].id] -= (Sum(node1[j].Right) - Sum(node1[j].Left - 1)); j++; } update(temp[i]); while(k <= m && node2[k].Right == i){ ans[node2[k].id] += (Sum(node2[k].Right) - Sum(node2[k].Left - 1)); k++; } } for(int i=1;i<=m;i++) printf("%d\n",ans[i]); return 0;}
阅读全文
0 0
- CodeForces301D 【BIT】
- bit
- Bit++
- bit
- BIT
- Bit++
- 12bit,24bit,32bit颜色
- APCCAL bit
- 64 bit
- Bit数组
- Bit 操作
- bit操作
- Bit Operations
- bit operation
- byte bit
- Lowest Bit
- Lowest Bit
- Bit-map
- php数组函数总结
- 计算字符串最后一个单词的长度
- 一种快速划分千分位的方法
- 四年工作总结
- 简单的HTML网页框架
- CodeForces301D 【BIT】
- 文章标题 汇编 : 判断素数
- OA审批1.0版本工作总结
- [Codeforces 727C] Guess The Array 交互题
- 57 linux内核的i2c设备驱动模型
- 栈、堆和静态区
- php 设计模式 (原型模)
- 杭电2782
- Android中自定义VideoView视频播放器