洛谷 P1483 序列变换

本文介绍了一个关于序列变换的操作问题及其解决方法。通过模拟的方式而非使用复杂的数据结构来更新序列并输出特定位置的数值。适用于40%的数据规模小于等于100的情况。

题目描述

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

操作1:输入格式“1 x y”,表示把所有akx都加上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条。

思路:一开始一看以为是一个线段树,后来才发现,是一个模拟就可以过去的题目。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 1000010
using namespace std;
int n,m;
long long num[MAXN],bns[MAXN];
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)    scanf("%lld",&num[i]);
    for(int i=1;i<=m;i++){
        int pos;int x,y;
        scanf("%d%d",&pos,&x);
        if(pos==1){
            scanf("%d",&y);
            bns[x]+=1ll*y;
        }
        else if(pos==2){
            long long ans=num[x];
            for(int j=1;j*j<=x;j++)
                if(x%j==0){
                    if(j*j!=x)    ans+=bns[j]+bns[x/j];
                    else    ans+=bns[j];
                }
            cout<<ans<<endl;
        }
    }
}

 

转载于:https://www.cnblogs.com/cangT-Tlan/p/8228274.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值