列表

详情


NC220348. D动态序列

描述

给出n(1 <= n <= 100000)个整数 ai(1 <= ai <= 1000000000)的序列,有q(1 <= q <= 100000)个询问,设序列长度为len,序号从1开始,每个询问有如下操作:

1 b:序列中所有数乘以整数b(1 <= b <= 1000000000

2 b:序列中所有数增加整数b(1 <= b <= 1000000000

3 b:在序列头部添加一个整数b(1 <= b <= 1000000000

4 b:在序列尾部添加一个整数b(1 <= b <= 1000000000

5 p:输出序列的第p(1 <= p <= len)个数,并将结果对1000000007取模

题目保证所有操作都是合法的!

输入描述

第1行两个整数n、q,第2行n个整数,代表初始序列,第3行及之后,每一行都有一个询问,总共有q行,询问格式参见题目描述和样例

输出描述

对于询问5,输出对应位置的数

示例1

输入:

5 5
1 2 3 4 5
1 2
2 1
3 1
4 2
5 3

输出:

5

说明:

样例解释:

刚开始的序列:1 2 3 4 5

执行完操作1:2 4 6 8 10

执行完操作2:3 5 7 9 11

执行完操作3:1 3 5 7 9 11

执行完操作4:1 3 5 7 9 11 2

执行操作5:当前序列第3个数是5,所以输出5

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 156ms, 内存消耗: 3220K, 提交时间: 2021-03-28 21:40:03

#include<iostream>

using namespace std;

const int mod=1000000007,N=100005;
int A[3*N],l=100000,r,n,q,c,o,mul=1,add=0;

int qmi(int a,int b)
{
	if(b==0) return 1%mod;
	return 1ll*(b&1?a:1)*qmi(1ll*a*a%mod,b>>1)%mod;
}

int main()
{
	cin>>n>>q;r=l+n-1;
	for(int i=l;i<=r;++i) cin>>A[i];
	while(q--){
		cin>>c>>o;
		if(c==1) mul=1ll*mul*o%mod,add=1ll*add*o%mod;
		else if(c==2) add=(0ll+add+o)%mod;
		else if(c==3) A[--l]=(1ll*(o-add)*qmi(mul,mod-2)%mod+mod)%mod;
		else if(c==4) A[++r]=(1ll*(o-add)*qmi(mul,mod-2)%mod+mod)%mod;
		else cout<<(1ll*mul*A[l+o-1]%mod+add)%mod<<endl;
	}
	return 0;
}

上一题