Codeforces Round #182 (Div. 1) D:http://codeforces.com/contest/301/problem/D

题意:给一个1-n,n个数的序列,然后查询一个区间[l,r],问这个区间内有多少对:一个数是另外一个数的约数。

题解:这样的题目做的太少,自己也知道要用离线的数据结构,但是始终想不来,看了别人的代码也是半天没有看懂,最后还是请教了别人,才稍微明白一点。首先,对于[l,r]之间的数对来说,可以把1--r的数对减去1--l-1的数对,这是肯定的,但是这样还是多算了一部分,因为1--l-1之间的数和l--r之间的数也可以构成数对,所以必须把这部分减去。怎么减去呢,这里才是关键。首先,对于一次查询,把l和r分开来操作。我们可以枚举i,i从1到n,当枚举到i的时候,i之前的所有的数的倍数更新了,也就是说i之前的数对l--r之间的数已经形成,并且此时对l--r之间影响只有1--l-1之间的数,如果,我们把这部分数对减去的话,那么之前说的关键问题就解决了。减去之后就可以更新第i个数的倍数了,然后当i是查询的右端点的时候,这时候普就可以直接查询右端点,然后查询左端点然后做差累加上去,就可以得到最终的答案了。统计和更新直接用树状数组来维护就可以了。这道题,自己不会打,看了别人的代码,然后自己敲了一遍,确实是一道好题,值得好好品味。自己这方面的思维还没有培养起来呢,以后要多练练。

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int N=2e5+;
int n,m;
int a[N],ct[N];
int pos[N],l[N],r[N],ans[N];
vector<int>ll[N],rr[N];
void init(){
memset(a,,sizeof(a));
memset(ct,,sizeof(ct));
memset(pos,,sizeof(pos));
}
int lowbit(int x){
return x&(-x);
}
void add(int x){
while(x<=n){
ct[x]++;
x+=lowbit(x);
}
}
int getsum(int x){
int ans=;
while(x>){
ans+=ct[x];
x-=lowbit(x);
}
return ans;
}
int main(){
while(~scanf("%d%d",&n,&m)){
init();
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
pos[a[i]]=i;
}
for(int i=;i<=m;i++){
scanf("%d%d",&l[i],&r[i]);
ll[l[i]].push_back(i);
rr[r[i]].push_back(i);
}
for(int i=;i<=n;i++){
for(int j=;j<ll[i].size();j++){
ans[ll[i][j]]-=getsum(r[ll[i][j]])-getsum(i-);
}
for(int j=;j*a[i]<=n;j++){
add(pos[j*a[i]]);
}
for(int j=;j<rr[i].size();j++){
ans[rr[i][j]]+=getsum(i)-getsum(l[rr[i][j]]-);
}
}
for(int i=;i<=m;i++){
printf("%d\n",ans[i]);
}
}
}

Yaroslav and Divisors的更多相关文章

  1. codeforces 301D Yaroslav and Divisors(树状数组)

    Yaroslav has an array p = p1, p2, ..., pn (1 ≤ pi ≤ n), consisting of n distinct integers. Also, he ...

  2. Codeforces301D. Yaroslav and Divisors

    题意:2e5的全排列 每次询问一个区间有多少对数 满足一个数是另一个数的倍数 题解:考虑离线来做 看到有个说法说 在处理有两种约束的问题时 一般用数据结构边插入边询问的方式 这个题正是如此 我们用su ...

  3. Codeforces Round #182 (Div. 1)题解【ABCD】

    Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...

  4. Codeforces Round #182 (Div. 1 + Div. 2)

    A. Eugeny and Array \(r-l+1\)是奇数时,和显然无法为0. 奇数的情况需要判断-1和1的个数是否大于等于长度的一半. B. Eugeny and Play List 模拟. ...

  5. codeforces 27E Number With The Given Amount Of Divisors

    E. Number With The Given Amount Of Divisors time limit per test 2 seconds memory limit per test 256 ...

  6. HDU - The number of divisors(约数) about Humble Numbers

    Description A number whose only prime factors are 2,3,5 or 7 is called a humble number. The sequence ...

  7. Divisors

    计算小于n的数中,约数个数最多的数,若有多个最输出最小的一个数. http://hihocoder.com/problemset/problem/1187 对于100有 60 = 2 * 2 * 3 ...

  8. Xenia and Divisors

    Xenia and Divisors time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  9. hihocoder1187 Divisors

    传送门 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Given an integer n, for all integers not larger than n, f ...

随机推荐

  1. struts 2学习笔记—浅谈struts的线程安全

    Sruts 2工作流程: Struts 1中所有的Action都只有一个实例,该Action实例会被反复使用.通过上面Struts 2 的工作流程的红色字体部分我们可以清楚看到Struts 2中每个A ...

  2. zoj 3657 策略题 easy

    http://acm.zju.edu.cn/onlinejudge/showProblem.do? problemId=4880 由于是要去牡丹江.是浙大出题,所以找了份浙大的题,第一道水题做的就不顺 ...

  3. 兼容性记录-class属性

    getAttribute获得class属性时,IE6,IE7的传參是className,IE7+和现代游览器都是class 全部游览器DOMElement均有的className属性,其在IE各版本号 ...

  4. Struts 有哪些经常使用标签库

    Struts 有哪些经常使用标签库 1.html标签库 2.bean标签库 3.logic标签库

  5. cubietruck+ vncserver+source+wlan0 分类: cubieboard 2014-11-08 17:25 159人阅读 评论(0) 收藏

    正常ubuntu下直接搜索remote desktop 进行配置,好用而且友好.. modprobe bcmdhd lsmod ifconfig wlan0 up vi /etc/network/in ...

  6. 实用技巧:简单而有用的nohup命令介绍(转)

    简单而有用的nohup命令在UNIX/LINUX中,普通进程用&符号放到后台运行,如果启动该程序的控制台logout,则该进程随即终止. 要实现守护进程,一种方法是按守护进程的规则去编程(本站 ...

  7. Java Socket 学习笔记

    TCP协议的Socket编程 Socket:英文中的意思是插座.两个Java应用程序可以通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个Socket.Java中所有关于网络编程的类都 ...

  8. jquery-动态设置ul li a链接目标

    概述: 先上我的布局图: ul中的每一个li里面包含着一个'a'超链接,可以猜想到,我想没点击ul->li里面每个a,链接到不同的页面,在这里,我用iframe完成. html主要代码为: &l ...

  9. JavaScript HTML DOM - 改变 HTML

    JavaScript HTML DOM - 改变 HTML HTML DOM 允许 JavaScript 改变 HTML 元素的内容. 改变 HTML 输出流 JavaScript 能够创建动态的 H ...

  10. [转]mysql导入导出数据中文乱码解决方法小结

    本文章总结了mysql导入导出数据中文乱码解决方法,出现中文乱码一般情况是导入导入时编码的设置问题,我们只要把编码调整一致即可解决此方法,下面是搜索到的一些方法总结,方便需要的朋友. linux系统中 ...