首页 > 其他分享 >题解:AT_joi2021ho_b 雪玉 (Snowball)

题解:AT_joi2021ho_b 雪玉 (Snowball)

时间:2024-10-14 19:11:14浏览次数:7  
标签:题解 pos long mid Snowball ans 区间 joi2021ho 雪球

Problem Link

[JOI 2021 Final] 雪玉

题目描述

翻译很简洁,不作赘述。

Solution

对于相邻的两个雪球 \(a_i\) 和 \(a_{i+1}\),两者夹着的区间中的雪要么是被 \(a_i\) 或 \(a_{i+1}\) 卷起,要么不可能被清理掉。

那么思路非常简单了,对于每个区间,只有 \(2\) 种情况:

  • 区间左侧雪球的最右点小于区间右侧雪球的最左点:两侧雪球各自加上自己卷起大小即可。

  • 区间左侧雪球的最右点大于等于区间右侧雪球的最左点:二分计算各自卷起雪的多少即可。

其他疑问见代码。

Code

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

typedef long long ll;
#define Maxn 200005
#define fo(i, l, r) for (int i = l; i <= r; ++i)
#define getchar()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[1<<21], *p1 = buf, *p2 = buf;
inline int read(int x=0, bool f=0, char c=getchar()) {for(;!isdigit(c);c=getchar()) f^=!(c^45);for(;isdigit(c);c=getchar()) x=(x<<1)+(x<<3)+(c^48);return f?-x:x;}
inline ll lread(ll x=0, bool f=0, char c=getchar()) {for(;!isdigit(c);c=getchar()) f^=!(c^45);for(;isdigit(c);c=getchar()) x=(x<<1)+(x<<3)+(c^48);return f?-x:x;}

int n, m;
ll a[Maxn], l[Maxn], r[Maxn], ans[Maxn], sum;

int main()
{
    n = read(), m = read();
    fo(i, 1, n) a[i] = lread();
    fo(i, 1, m)
    {
        ll x = lread();
        sum += x;
        l[i] = max(l[i-1], -sum), r[i] = max(r[i-1], sum);
    }
    ans[1] += l[m], ans[n] += r[m];
    fo(i, 1, n-1)
    {
        if(l[m] + r[m] <= a[i+1]-a[i]) ans[i] += r[m], ans[i+1] += l[m]; // 两侧雪球没交集。
        else // 有交集。
        {
            int left = 1, right = m, pos = m;
            while(left <= right)
            {
                int mid = (left + right) >> 1;
                if(l[mid] + r[mid] > a[i+1]-a[i]) pos = mid, right = mid-1;
                else left = mid+1;
            }
            // 各自加上卷起的雪。
            if(l[pos-1] == l[pos]) ans[i+1] += l[pos], ans[i] += a[i+1]-a[i]-l[pos];
            else ans[i] += r[pos], ans[i+1] += a[i+1]-a[i]-r[pos];
        }
    }
    fo(i, 1, n) printf("%lld\n", ans[i]);
    return 0;
}

Tips

记得开 long long

标签:题解,pos,long,mid,Snowball,ans,区间,joi2021ho,雪球
From: https://www.cnblogs.com/naughty-naught/p/18464804

相关文章

  • 题解:P2315 [HNOI2005] 数三角形
    ProblemLink[HNOI2005]数三角形题意输入一个大三角形的各个边存在情况,输出里面有多少个正三角形。Solution简单暴力即可,用\(4\)个数组维护每条边能延伸的最大长度,然后逐个判断三角形是否可行即可。如图,l_upper维护左端点向上(即$\ell_{BA}$),l_lower维护左端点向下(即......
  • 题解:AT_arc120_c [ARC120C] Swaps 2
    ProblemLink[ARC120C]Swaps2\(-1\)的情况判错卡了\(10\)几分钟,麻了。题面翻译给出\(2\)个序列\(a\)和\(b\),定义一次操作为:选定一个下标\(i\),先将\(a_i\)以及\(a_{i+1}\)交换,然后让\(a_i\)加一,最后让\(a_{i+1}\)减一。求最少操作次数使得\(a\)序列等......
  • 题解:[HNOI2009] 双递增序列
    ProblemLink[HNOI2009]双递增序列题目描述给定一个长度为\(n\)的序列(\(n\)为偶数),求是否可以把序列分成\(2\)个长度为\(\frac{n}{2}\)的递增序列。Solution首先想到定义\(f_i\)为一个序列以\(a_i\)结尾时另一个序列末尾最小值。但这样定义状态信息是不够的,考虑......
  • qoj6562 First Last 题解
    妙妙题。首先不同字母数最多为\(3\)。我们把每一个字母看成一个点。对于每一个字符串,首个字母朝末尾字母连一条有向边。那么问题变为了给定一张有向图,从某个点出发,每次走一条边,且边不能重复,不能走的人输。问哪方有必胜策略。先不考虑时间复杂度,那么这个可以直接爆搜。但是肯定......
  • 题解:P11063 【MX-X4-T3】「Jason-1」数对变换
    ProblemLink【MX-X4-T3】「Jason-1」数对变换题外话场上把贪心注重在一个奇怪地方了,导致交的时候已经有\(9\)个人\(\textcolor{green}{AC}\)了(哭)。题意简述对于数对\((x,y)\),你可以执行以下两种变换:类型1:取\(1\lek\lex\),令\((x,y)\gets(\lfloor\frac{x}{k}......
  • 题解:P10370 「LAOI-4」Mex Tower (Hard ver.)
    ProblemLink「LAOI-4」MexTower(Hardver.)题意给定一个长度为$n$的序列$a$,求序列的$\operatorname{Mex}$值是否大于等于其他所有长度为$n$的自然数序列的$\operatorname{Mex}$值。Solution不难发现,两个数或一个序列的$\operatorname{Mex}$一定是......
  • 题解:擬二等辺三角形
    ProblemLink擬二等辺三角形题面翻译定义一个三角形为“伪等腰三角形”需满足以下三个条件:三边长度都为自然数。三边长度各不相同。有其中两条边的长度之差为\(1\)。现在给你一个数\(n\),求周长小于等于\(n\)的“伪等腰三角形”个数,答案对\(1000000007\)取模......
  • 题解:AT_abc370_c [ABC370C] Word Ladder
    题目传送门luogu观看简要题意给两个序列\(S\)和\(T\),输出的第一个数是它能改变的总个数,后面跟着的第\(i\)个是改变\(i\)个数之后,字典序最小的结果。思路当\(S\)与\(T\)相等的话,那就无法改变了,直接输出\(0\)。对于总数只要\(T_i\neS_i\)那它就可以改,所以只......
  • 题解:P1660 数位平方和
    ProblemLinkStep1:“定义\(S(n)\)表示\(n\)个的各个数位的\(k\)次方的和。”数位的\(k\)次方,我们可以通过快速幂求出,为了节省时间,我们可以定义一个\(a\)数组,来表示\(0\sim9\)区间中各数字\(k\)次方的值。然后我们通过定义一个\(s\)数组来存储\(0\sim4\times......
  • 题解:P7356 「PMOI-1」游戏
    ProblemLink「PMOI-1」游戏题意给你一个胜利规则为黑白白白的棋类游戏,你执白,黑先行且第一步必下\((0,0)\),双方皆可放弃落子且落子坐标必须为自然数,请在4步内获胜。思路在自己与自己对下几局之后,有几个显然的发现:黑棋会尽量阻止你4步获胜。在你不会再下一步就获......