首页 > 其他分享 >CF1937D Pinball 题解

CF1937D Pinball 题解

时间:2024-03-01 12:33:48浏览次数:24  
标签:CF1937D 题解 位置 小球 Pinball range input left more

题目链接:https://codeforces.com/contest/1937/problem/D

题意简述
一个长为n的格子,用 '<'或'>'组成的字符串表示,在位置i放一个小球,当前所在位置是'<'则下一秒左移一步,否则下一秒右移一步。小球移动后,之前位置的符号反转,'<'变成'>','>'变成'<',直到小球离开整个格子。
求在0至n-1共n个位置放置小球后离开格子需要的时间,每个位置放入小球互相独立,即都是放入初始状态的格子中。

题解

  1. 首先我们要明确小球是必定可以离开整个格子的,无论小球往左还是往右走,直到遇到一个方向相反的字符,小球调转方向,此时符号反转,即小球遇到的符号最终都是向格子外,直到小球离开;

  2. 我们考虑单独放一个小球到位置i,小球会从什么方向离开,如果当前的符号是'<',则小球先向左走,直到遇到一个反向的符号'>',此时小球转向,向右走,遇到之前的'<',再弹回来;模拟这个过程,除了s[i]外(从s[i]移到到s[i - 1]后,s[i]已经变成了'>'),如果左边有m个'>',则右边也需要m个'<'把小球弹回来,小球最终才是往左边离开;

  3. 我们考虑单独放一个小球到位置i,当前的符号是'<',左边有m个'>',右边有m个'<'(多于k个没有意义),最终小球离开时,需要多少秒。
    首先,小球从i一直向左直到离开,如果没有阻碍,时间是i + 1;
    如果有一对'>'和'<',记他们的位置为j和k,到j时,会转向,直到k再转向回到j,然后继续向左,此时多走的距离为(k - j) * 2;
    所以单独考虑位置i,答案就是左右m对'>'和'<'的距离差的和*2;

  4. 从特殊到一般,我们考虑答案从i到i + 1的转移;
    首先前提是小球放到位置i最终是向左离开的,需要的时间是i + 1 + more,more表示小球中间来回弹需要的时间;
    此时小球放置到了原始的i + 1,如果s[i + 1] = '>',则右边需要多一个'<'弹回来,才等于在s[i]向左的时间;
    这边我们需要一个等式,有四个变量\(a < b < c < d\),则\((c - b) + (d - a) = (c - a) + (d - b)\);
    我们从s[i]转移到s[i + 1],more需要增加的就是下一个'<'的位置j减当前位置i的距离2;
    如果s[i + 1]是'<'呢,假设前面已经有k个'>'相匹配了,由于小球从i + 1的位置开始,则匹配的'<'少了一个,需要右边再补一个'<',小球才会从左边离开,more需要增加的距离也是下一个'<'位置减i的距离
    2:
    \((d - b) + (e - a) = (c - b) + (d - a) + (e - c)\)

至此,我们可以\(O(n)\)的计算所有小球会向左边离开的位置的答案,至于小球向右边离开的答案,反向再来一次就行,我觉得应该可以一次遍历同时计算完成左右两种情况,这里等一位巨佬出手。

Python代码

点击查看代码
import sys

# region fastio
input = lambda: sys.stdin.readline().rstrip()
sint = lambda: int(input())
mint = lambda: map(int, input().split())
ints = lambda: list(map(int, input().split()))
# endregion fastio

def solve() -> None:
    n = sint()
    s = input()
    ans = [-1] * n
    left, right = [], []
    for i in range(n):
        if s[i] == '>':
            right.append(i)
        else:
            left.append(i)
    left.reverse()
    more = 0
    for i in range(n):
        if not left:
            break
        more += (left.pop() - i) * 2
        ans[i] = i + 1 + more
    more = 0
    for i in range(n - 1, -1, -1):
        if not right:
            break
        more += (i - right.pop()) * 2
        ans[i] = n - i + more
    print(*ans)

for _ in range(int(input())):
    solve()

标签:CF1937D,题解,位置,小球,Pinball,range,input,left,more
From: https://www.cnblogs.com/mikeac/p/18046626

相关文章

  • [CF1804F] Approximate Diameter 题解
    题目链接题目分析显然图结构不太好维护,容易想到维护树结构。维护生成树看起来就不太靠谱,容易想到维护最短路树。keyobservation:我们固定一个端点(不妨为\(1\)),求出这个点到每个点的最短路长度的最大值\(x\)。则一定有\(\lceil{d\over2}\rceil\lex\led\)。证明:显然\(x\l......
  • CF1827C Palindrome Partition 题解
    CF1827CPalindromePartition题解题面题目传送门。称一个字符串是好的,当且仅当它是一个长度为偶数的回文串或由若干长度为偶数的回文串拼接而成。给定一个长度为\(n\)的字符串\(s\),求有多少\(s\)的子串是好的。$1\len\le5\cdot10^5$,\(s\)仅包含小写字母。......
  • P6185 序列 题解
    如果发现自己莫名其妙错了,可能是代码UB,还开O2!!!!!!!!!!!传送门首先,对于每个操作2,将\(u_i,v_i\)连边。连边之后每个连通块内部可以在总和不变的情况下任意改变。用并查集将每个连通块缩点,然后对于每个操作1,将\(u_i,v_i\)连边。得到的图又会分成若干个连通块。判断整个图是否可行,只......
  • [ABC238F] Two Exams 题解
    [ABC238F]TwoExams题解思路解析这题很麻烦,因为有两个维度。所以可以想到先按照第一维排序,这样就不需要考虑第二维的问题。其次再发现数据范围小,可以想到能用dp做,接下来就考虑如何dp。首先我们要知道我们遍历到了第几个公民,同时还要知道还剩下几个代表名额,同时我们还需要思......
  • P8085 [COCI2011-2012#4] KRIPTOGRAM 题解
    P8085[COCI2011-2012#4]KRIPTOGRAM题解本文原发布于2024-02-07洛谷题库P8085[COCI2011-2012#4]KRIPTOGRAM题解区,现于2024-2-29转载至博客园思路解析这道题目的主要难点在于如何判断明文中形如\(\texttt{abcb}\)的子串可以和密文\(\texttt{bcac}\)匹配,因为如果......
  • 个人题解:江苏省选 2019 第二轮
    精准预测我们首先发现每个人每个时刻只有生死,所以我们可以建一个2-sat模型。每个人对应\(T+1\)个节点,表示这个人在每个时刻的生死。那么,题目的条件可以直接在这个模型上面建图,还要注意第\(t\)秒死亡可推出第\(t+1\)秒死亡和第\(t+1\)秒存活能推出第\(t\)秒存活的两......
  • 后端项目打包相关问题解决
    在对项目进行打包后,我运行jar包发现出现下面错误:nomainmanifestattribute,in"app.jar" 在“app.jar”中没有主清单属性说明jar包里面的META-INF/MANIFEST.MF文件中没有Main-Class这个属性于是我解压jar包,到META-INF/MANIFEST.MF文件中手动添加了Main-Class: com.xxx.xx......
  • 2024年2月29号题解
    P1014[NOIP1999普及组]Cantor表解题思路和之前的蛇蝎矩阵很像,因此可以先构建一个蛇蝎矩阵因为是z形所以在每个奇数次矩阵的对角线进行交换就可以了,这样就得到了我们需要的矩阵代码实现#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#inclu......
  • 题解 CF1709 XOR
    *2400*dsuontree一道很好的题目思路很巧妙传送门题目大意给出一棵树,\(n\)个节点,每个节点有权值\(v\),定义一次操作为修改任意一个节点的值为任意正整数,要求最后的树不存在任意简单路径使得路径异或和为\(0\)Solution一个很常用的套路,先钦定根节点为\(1\)定义\(w......
  • CF1265E Beautiful Mirrors 题解
    CF1265EBeautifulMirrors题解题目大意题目传送门你有\(n\)个点,当你在第\(i\)个点时,有\(p_i\)的概率到达点\(i+1\),有\(1-p_i\)的概率回到点1。当到达点\(n+1\)时,游戏结束。且期望进行的游戏次数。\(1\len\le2\times10^5\)。题目分析设\(f_i\)表示到达点\(......