洛谷P8132 [ICPC 2020 WF] Landscape Generator

题面分析

要求实现两种操作,分别为区间加、区间差值加。

区间差值加(自己取的名字):将区间中每相邻两个数的差值加一个数。

关于主要内容

考虑做两次差分。

因为差分本身的意义就是后一个元素减前一个元素,因此做两次差分就可以实现区间差值加。

操作 \(R\) 区间加1,操作 \(R\) 区间减1。

操作 \(H\)\([l,mid]\)区间差值加1,\([mid,r]\)区间差值减1。

操作 \(H\)\([l,mid]\)区间差值减1,\([mid,r]\)区间差值加1。

关于具体的操作范围对于区间是奇数长度和偶数长度进行判断就行了。(手模几下就出来了)

Code

#include<bits/stdc++.h>
using namespace std;
#define int long long

int rd() //省略快读

const int N = 2e5 + 5;
int n;
int b[N];//差分数组

signed main()
{
    int n = rd(),q = rd();
    while(q--)
    {
        char c;
        cin >> c;
        int l = rd(),r = rd();
        if(c == 'R') b[l]++,b[l + 1]--,b[r + 1]--,b[r + 2]++;
        if(c == 'D') b[l]--,b[l + 1]++,b[r + 1]++,b[r + 2]--;
        if(c == 'H')
        {
            int mid = (l + r) >> 1;
            b[l]++,b[mid + 1]--;
            if((r - l + 1) % 2) b[mid + 1]--,b[r + 2]++;
            else b[mid + 2]--,b[r + 2]++;
        }
        if(c == 'V')
        {
            int mid = (l + r) >> 1;
            b[l]--,b[mid + 1]++;
            if((r - l + 1) % 2) b[mid + 1]++,b[r + 2]--;
            else b[mid + 2]++,b[r + 2]--;
        }
    }
    for(int i = 1;i <= n;i++) b[i] += b[i - 1];
    for(int i = 1;i <= n;i++) b[i] += b[i - 1];
    for(int i = 1;i <= n;i++) cout << b[i] << '\n';
    return 0;
}

样例解释中的关于奇偶的操作似乎错了

posted @ 2025-05-28 19:14  IC0CI  阅读(8)  评论(0)    收藏  举报