链接:https://www.nowcoder.com/acm/contest/111/F
这天,可爱的小托米得到了n堆积木,且第i堆积木初始时有ai块积木.
小托米很快就喜欢上了玩积木.
他会作出三种操作:
1.把第v堆的积木数量更改为x.
2.在每堆积木的上面都加上y个积木.
3.数第q堆积木的积木个数.
来源:牛客网
Problem Description:
小托米真的很可爱呀(>_<)这天,可爱的小托米得到了n堆积木,且第i堆积木初始时有ai块积木.
小托米很快就喜欢上了玩积木.
他会作出三种操作:
1.把第v堆的积木数量更改为x.
2.在每堆积木的上面都加上y个积木.
3.数第q堆积木的积木个数.
由于这天可爱的小托米实在是太困了,所以他请你帮他完成这些操作.
Input:
第一行两个整数n,m.
第二行n个整数,第i个整数代表ai的值.
接下来m行,每行代表一个操作:
第一个整数t代表操作的类型
若t=1,则接下来两个整数v,x,代表操作1.
若t=2,则接下来一个整数y,代表操作2.
若t=3,则接下来一个整数q,代表操作3.
Output:
对于每个操作3,输出其对应的答案.
Sample Input:
10 11
1 2 3 4 5 6 7 8 9 10
3 2
3 9
2 10
3 1
3 10
1 1 10
2 10
2 10
3 1
3 10
3 9
Sample Output:
2
9
11
20
30
40
39
思路:这道题中操作2如果你用for(i=0;i<n;i++){ a [ i ]+=y;}这种方法的话会超时,因此要进行优化,即用flag做标记,计算出flag(flag用来统计一共要加多少y),然后经过一系列操作之后要输出a[ i ],就让初始值的a[ i ]+flag,就是最后a[ i ]的最终值,要注意的就是操作1,它不是让a[ v-1 ]=x,而是a[ v-1 ]=x-flag,具体操作可以看下面的代码。
My DaiMa:
#include<stdio.h>
#include<iostream>
using namespace std;
typedef long long ll;
ll a[100003];
int main()
{
ll n,m,t,q,y,x,v;
while(~scanf("%lld%lld",&n,&m))
{
int flag=0;
for(int i=0;i<n;i++)
scanf("%lld",&a[i]);
while(m--)
{
scanf("%lld",&t);
if(t==3)
{
scanf("%lld",&q);
printf("%lld\n",a[q-1]+flag);//用初始的值加上flag就是a[q-1]最终的值
}
else if(t==1)
{
scanf("%lld%lld",&v,&x);
a[v-1]=x-flag;//如果不明白这里的话,可以带2个数进去试试
}
else if(t==2)
{
scanf("%lld",&y);
flag+=y;
}
}
}
return 0;
}