题解:ABCD - All Assign Point Add

题解:ABCD - All Assign Point Add

·题目

链接:Atcoder。

链接:洛谷。

·难度

算法难度:C。

思维难度:B。

调码难度:C。

综合评价:普及/提高-。

·算法

模拟

·思路

用两个数组a、c分别维护当前项比最初整体赋的值大多少、整体赋值是第几次,通过维护这两个数组即可求得答案。

·代价

O(n+q)。

·细节

具体操作:用t维护整体赋值的次数,x维护整体赋的值,每次操作1时t要加1,操作2更新a、c,操作3若对应的c等于t输出x加上对应的a,否则输出x。

·代码

#include
#define N 220000
using namespace std;
long long a[N]={},c[N]={},n=0,q=0,t=0,x=0;
int main(){
    scanf("%lld",&n);
    for(long long i=1;i<=n;i++){
        scanf("%lld",&a[i]);
    }
    scanf("%lld",&q);
    for(long long i=1;i<=q;i++){
        long long o=0;
        scanf("%lld",&o);
        if(o==1){
            scanf("%lld",&x);
            t++;
        }else{
            if(o==2){
                long long y=0,z=0;
                scanf("%lld%lld",&y,&z);
                if(c[y]!=t){
                    c[y]=t;
                    a[y]=z;
                }else{
                    a[y]+=z;
                }
            }else{
                long long m=0;
                scanf("%lld",&m);
                if(c[m]!=t){
                    printf("%lld\n",x);
                }else{
                    printf("%lld\n",x+a[m]);
                }
            }
        }
    }
    return 0;
}

·注意

注意操作2是累加,不是赋值。

你可能感兴趣的:(算法)