1 条题解

  • 0
    @ 2025-8-24 22:57:21

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar wrh316
    Zeit und Raum trennen dich und mich.Informatik verbindet dich und mich. || 一只可爱王法~

    搬运于2025-08-24 22:57:21,当前版本为作者最后更新于2024-05-03 15:28:05,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题目包含重要性质:如果 oi2oi \gets 2,那么 ri<iri<i。也就是说调用关系不会构成环。

    考虑维护每个机器的调用次数 tt,初始的时候 tt 为一,表示第 cici 台机器需要调用一次。此时除了编号最大的机器的调用次数是确定的,其余机器都可能不是正确的调用次数。

    我们从大到小扫描每一台机器,并且将他对前面机器的影响下传。假设当前为第 ii 台机器,由于机器的操作只有两种,如果是 11 操作,说明其会执行 titiaxia _ {xi} 加上 yiyi 的操作,也就是相当于 axiaxi+ti×yia _ {xi}←a _ {xi}+ti×yi。如果是 22 操作,相当于将 [li,ri][li,ri] 范围内的 tt 加一。这一步显然不可以暴力,但是发现是一个区间加,可以采用打差分标记。由于扫描线是从右往左,所以在 riri 处打上加一,li1li-1 处打上减一标记,然后利用一个变量 sumsum 从右往左累和到i处即可得到 titi。累和的过程跟随扫描线一同进行,这样复杂度仅为 O(n)O(n)

    采用打差分标记代码:

    t[c]++;
    t[c - 1]--;
    

    从大到小扫描每一台机器代码:

    for (int i = m; i >= 1; i--) {
    	ans = (ans + t[i]) % mod;
    	if (type[i] == 1) a[x[i]] = (a[x[i]] + y[i] * ans) % mod;
    	else {
    		t[y[i]] = (t[y[i]] + ans) % mod;
    		t[x[i] - 1] = (t[x[i] - 1] + mod - ans) % mod;
    	}
    }
    
    • 1

    [AHOI2024 初中组 / 科大国创杯初中组 2024] 操作

    信息

    ID
    10056
    时间
    1000ms
    内存
    512MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者