Yaroslav and Divisors
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的更多相关文章
- codeforces 301D Yaroslav and Divisors(树状数组)
Yaroslav has an array p = p1, p2, ..., pn (1 ≤ pi ≤ n), consisting of n distinct integers. Also, he ...
- Codeforces301D. Yaroslav and Divisors
题意:2e5的全排列 每次询问一个区间有多少对数 满足一个数是另一个数的倍数 题解:考虑离线来做 看到有个说法说 在处理有两种约束的问题时 一般用数据结构边插入边询问的方式 这个题正是如此 我们用su ...
- Codeforces Round #182 (Div. 1)题解【ABCD】
Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...
- Codeforces Round #182 (Div. 1 + Div. 2)
A. Eugeny and Array \(r-l+1\)是奇数时,和显然无法为0. 奇数的情况需要判断-1和1的个数是否大于等于长度的一半. B. Eugeny and Play List 模拟. ...
- 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 ...
- 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 ...
- Divisors
计算小于n的数中,约数个数最多的数,若有多个最输出最小的一个数. http://hihocoder.com/problemset/problem/1187 对于100有 60 = 2 * 2 * 3 ...
- Xenia and Divisors
Xenia and Divisors time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- hihocoder1187 Divisors
传送门 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Given an integer n, for all integers not larger than n, f ...
随机推荐
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(40)-精准在线人数统计实现-【过滤器+Cache】
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(40)-精准在线人数统计实现-[过滤器+Cache] 系列目录 上次的探讨没有任何结果,我浏览了大量的文章 ...
- PHP本地环境搭配——WAMP不能启动, 一直处于红色图标或者橙色图标的解决办法
WAMP不能启动, 一直处于红色图标(正常启动为绿色吧) 考虑是端口的问题,我找到wamp文件夹中的wamp\bin\apache\apache2.2.22\conf路径下的httpd.conf文件, ...
- Linux内核中SPI/I2c子系统剖析
Linux内核中,SPI和I2C两个子系统的软件架构是一致的,且Linux内核的驱动模型都以bus,driver,device三种抽象对象为基本元素构建起来.下文的分析将主要用这三种抽象对象的创建过程 ...
- android 在布局中动态添加控件
第一步 final LayoutInflater inflater = LayoutInflater.from(this); 第二步:获取需要被添加控件的布局 final LinearLayout l ...
- android 40 Io编程
Io编程:内存卡和sd卡.字符串存入内存卡然后读出来. activity: package com.sxt.day06_06; import java.io.FileInputStream; impo ...
- COMPACT 行记录格式
CREATE TABLE `mytest` ( `t1` varchar() DEFAULT NULL, `t2` varchar() DEFAULT NULL, `t3` ) DEFAULT NUL ...
- post get
/// <summary> /// Get方法 /// </summary> /// <param name="serverUrl">url地址 ...
- 怎样使用svn开发项目
那么首先什么是svn呢?官方有很好的解释,我说一下个人简单的理解,svn就是开源的版本控制软件, 那么什么是版本呢?简单的说版本就是标记,比如你买了一本书,同样的书名,但是版本不一定一样, 因为里面可 ...
- Oracle 10G强大的SQL优化工具:SQL Tuning Advisor
p { margin-bottom: 0.25cm; direction: ltr; color: rgb(0, 0, 0); line-height: 120%; orphans: 2; widow ...
- [转]一个备份MySQL数据库的简单Shell脚本
本文翻译自 iSystemAdmin 的 <A Simple Shell Script to Backup MySQL Database> Shell脚本是我们写不同类型命令的一种脚本,这 ...