HDU 6273 Master of GCD(差分)

比赛题目:
http://acm.hdu.edu.cn/downloads/CCPC2018-Hangzhou-ProblemSet.pdf

                             Problem J. Master of GCD

 

这道题利用差分的思想,对一个区间[l, r]每个元素加上x,可以变为对arr[l] + x,arr[r+1] - x。然后所有区间操作完之后用循环从第二个开始每个值等于自己与前面的值的和。

这里的时间复杂度是O(n),如果用暴力的话就是O(n2),肯定是过不去的。

#include 
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define P pair 
const int MAXN = 1e5 + 7;
const ll mod = 998244353;
ll qpow(ll a, ll n)
{
    ll re = 1;
    while(n)
    {
        if(n&1)
            re = (re * a)%mod;
        n >>= 1;
        a = (a * a)%mod;
    }
    return re;
}

int a[MAXN], b[MAXN];

int main()
{
    ios::sync_with_stdio(0);
    int t, n, m;
    cin>>t;
    while(t--)
    {
        memset(a, 0, sizeof a);
        memset(b, 0, sizeof b);
        cin>>n>>m;
        int l, r, x;
        while(m--)
        {
            cin>>l>>r>>x;
            if(x == 2)
            {
                a[l]++;
                a[r+1]--;
            }
            else
            {
                b[l]++;
                b[r+1]--;
            }
        }
        ll min1 = a[1], min2 = b[1];
        for(int i = 2; i <= n; i++)
        {
            a[i] += a[i-1];
            b[i] += b[i-1];
            if(a[i]

 

你可能感兴趣的:(杭电OJ,思维)