魔法の猫

题意:すべての人の助けのおかげで先週、TTは、最終的にはかわいい猫を得ました。しかし、どのようなTTは期待していなかったことは、これは魔法の猫であるということです。
ある日、魔法の猫は彼に問題を与えることによって、TTの能力を調査することを決めました。それは、世界地図から選ぶN都市で、[i]はi番目の市が所有する資産価値を表しています。
そして、魔法の猫は、いくつかの操作を実行します。各ターンは、区間[L、R]内の都市を選択し、CCによってそれらの資産価値を増大させることです。そして最後に、QQの操作をした後、各都市の資産価値を与えるために必要とされます。
あなたはTTが答えを見つけるのを助けることができる?
大概就是N个点、每次给个[L、R]、这个区间中所有元素加一个V; qは次操作之后、输出所有的元素。

输入:
-都市や操作の数最初の行は二つの整数N、Q(1≤n、q≤2⋅105)を含みます。
二行目は、配列AAの要素を含んでいる:整数がA1、A2を、...、(-106≤ai≤106)
そしてQラインは、次の各ラインは、演算を表します。i番目の行は、i番目の操作のための3つの整数L、R及びC(1≤l≤r≤n、-105≤c≤105)を含みます。

输出:
印刷nは整数A1、A2、...、1行に1つずつ、そしてAIは、i番目の都市の最終資産価値に等しくなければなりません。

例:

ここに画像を挿入説明

問題解決のアイデア:差動ライン、マルチセグメントツリーインテュイット、ノートここではLONG​​LONGを使用し、それ以外の場合は白にint型。

コード:

#include<cstdio>
#include<iostream>
using namespace std;
int a[200005],b[200005];
int main()
{
    int n,q,x;
    scanf("%d%d",&n,&q);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        if(i==0)b[i]=a[i];
        else b[i]=a[i]-a[i-1];
    }
    while(q--)
    {
        int l,r,v;
        scanf("%d%d%d",&l,&r,&v);
        b[l-1]+=v;//差分
        b[r]-=v;
    }
    long long total=0;//用longlong
    for(int i=0;i<n;i++)
    {
        total+=b[i];
        if(i)printf(" ");
        printf("%lld",total);
    }
}
公開された15元の記事 ウォンの賞賛0 ビュー222

おすすめ

転載: blog.csdn.net/qq_43653717/article/details/104972842