题目描述

给定一个由n个整数构成的序列,你需要对它进行如下操作:

操作1:输入格式“1 x y”,表示把所有a[kx](k为正整数,kx<=n)都加上y。

操作2:输入格式“2 j”,表示输出a[j]。

输入输出格式

输入格式:

第一行,两个数n,m,表示有n个数,m条操作。

第二行,n个数a[1],a[2],…,a[n]。

接下来m行,为m条操作。

输出格式:

输出若干行,每行对应一次操作2。

输入输出样例

输入样例#1:

5 4
6 9 9 8 1
2 4
1 2 5
1 3 1
2 4
输出样例#1:

8
13

说明

对于40%的数据,n<=100

对于100%的数据,n<=1000000,m<=100000,|a[i]|<=1000000,|y|<=1000000,x<=n,j<=n,操作2不超过10000条。

Solution:

本题不需要什么特别厉害的数据结构。我们直接进行模拟,对于1操作,统计一下那些数的倍数被修改,当2操作查询时直接开根枚举因子并修改,唯一要注意的是当i*i==x时只要加1次,其它的话两个因子都要累加。可以算一波复杂度:O(m√n),因为最多查询10000次,而数最大为1000000,所以最坏情况也就107

代码:

#include<bits/stdc++.h>
#define il inline
#define ll long long
using namespace std;
const int N=;
il int gi()
{
int a=;char x=getchar();bool f=;
while((x<''||x>'')&&x!='-')x=getchar();
if(x=='-')x=getchar(),f=;
while(x>=''&&x<='')a=a*+x-,x=getchar();
return f?-a:a;
}
ll a[N],n,m,tot[N];
int main()
{
n=gi(),m=gi();
for(int i=;i<=n;i++)a[i]=gi();
int k,x,y;
while(m--){
scanf("%lld",&k);
if(k==){x=gi();
ll ans=;
for(int i=;i*i<=x;i++)
if(x%i==){i*i==x?ans+=tot[i]:ans+=tot[i]+tot[x/i];}
printf("%lld\n",a[x]+ans);
}
else {
x=gi();y=gi();tot[x]+=y;
}
}
return ;
}

P1483 序列变换的更多相关文章

  1. 洛谷 P1483 序列变换

    https://www.luogu.org/problemnew/show/P1483 数据范围不是太大. 一个数组记录给k,记录每个数加了多少. 对于查询每个数的大小,那么就枚举每个数的因子,加上这 ...

  2. 2015年百度之星初赛(1) --- C 序列变换

    序列变换 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  3. 序列变换(hdu5248)

    序列变换 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  4. 序列变换(Lis变形)

    序列变换 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  5. hdu 5256 序列变换 (LIS变形)

    序列变换 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  6. 51Nod 欢乐手速场1 B 序列变换[容斥原理 莫比乌斯函数]

    序列变换 alpq654321 (命题人)   基准时间限制:1 秒 空间限制:131072 KB 分值: 40 lyk有两序列a和b. lyk想知道存在多少对x,y,满足以下两个条件. 1:gcd( ...

  7. LIS 2015百度之星初赛2 HDOJ 5256 序列变换

    题目传送门 题意:中文题面 分析:LIS(非严格):首先我想到了LIS,然而总觉得有点不对:每个数先减去它的下标,防止下面的情况发生:(转载)加入序列是1,2,2,2,3,这样求上升子序列是3,也就是 ...

  8. 二分搜索 2015百度之星初赛1 HDOJ 5248 序列变换

    题目传送门 /* 二分搜索:在0-1e6的范围找到最小的max (ai - bi),也就是使得p + 1 <= a[i] + c or a[i] - c 比赛时以为是贪心,榨干智商也想不出来:( ...

  9. luogu P3411 序列变换

    链接 P3411 序列变换 如果要最小化答案,那么就最大化不移动的数. 那么不移动的子序列一定是最后答案的一段连续区间,而移动的数我们是一定有办法把他们还原的. 设\(f_{i}\)表示\(i\)点的 ...

随机推荐

  1. Lvm linux磁盘分区管理(多个分区合并成一个)

    备份# rsync -avP -e ssh /data qqmap@10.173.139.100:/data1/qqmap/backup/10.234.22.143卸载# umount /data / ...

  2. LeetCode: 59. Spiral Matrix II(Medium)

    1. 原题链接 https://leetcode.com/problems/spiral-matrix-ii/description/ 2. 题目要求 给定一个正整数n,求出从1到n平方的螺旋矩阵.例 ...

  3. onenet基础通信套件加B300移植

    1. 遇到的第一个问题,说是少了文件,但是明明有这个文件的啊? scons: warning: Ignoring missing SConscript 'build_scons\arm\Hi2115\ ...

  4. iOS WKWebView添加进度条02

    之前写了一个是关于webview添加进度条的,现在补一个WKWebView进度条. //添加一个全局属性 @property(nonatomic,strong)CALayer *progresslay ...

  5. java 前后端 日期转换

    1.前传后 @DateTimeFormat(pattern="yyyy-MM-dd") private Date payTime; 2.后传前 @JsonFormat(patter ...

  6. Selenium自动化测试基础

    如有任何学习问题,可以添加作者微信:lockingfree 目录 Selenium自动化测试基础 Selenium自动化测试第一天(上) Selenium自动化测试第一天(下) Selenium自动化 ...

  7. JS获取HTML DOM元素的8种方法

    什么是HTML DOM 文档对象模型(Document Object Model),是W3C组织推荐的处理可扩展置标语言的标准编程接口.简单理解就是HTML DOM 是关于如何获取.修改.添加或删除 ...

  8. JavaScript实现无刷新评论及在IE下的剪切板访问(学习)

    1.无刷新评论 tips: appendChild:将新元素作为父元素的最后一个子元素进行添加. insertBefore:在一个指定的子节点之前插入一个节点 实现: <!DOCTYPE htm ...

  9. python 终极篇 ---- 中间件

    中间件------------------------>>>>>>>>>>>>> 中间件是一个用来处理django的响应与 ...

  10. js for循环实例

    1.求1-100的寄数和? //2.奇数求和 var ppt=0 for(var i=1;i<=100;i+=2){ ppt+=i } 2.求1-100的偶数和 var num=0 for(va ...