AtCoder abc 136

编程入门 行业动态 更新时间:2024-10-28 15:28:25

<a href=https://www.elefans.com/category/jswz/34/1769555.html style=AtCoder abc 136"/>

AtCoder abc 136

C
从后向前贪心
D
寻找规律
推一下可以发现连续的RR…RLL…L可以作为一个独立的循环节
最后这个循环节内的数字集中在RL的交界处
再处理一下奇偶性就好

# -*- coding: utf-8 -*-
# @time     : 2023/6/2 13:30
# @author   : yhdu@tongwoo
# @desc     :
# @file     : atcoder.py
# @software : PyCharm
import bisect
import copy
import sys
from sortedcontainers import SortedList
from collections import defaultdict, Counter, deque
from functools import lru_cache, cmp_to_key
import heapq
import math
sys.setrecursionlimit(100010)def main():items = sys.version.split()if items[0] == '3.10.6':fp = open("in.txt")else:fp = sys.stdins = fp.readline().strip()n = len(s)rl, ll = [], []i = 0while i < n:bi = iwhile i < n and s[i] == 'R':i += 1rl.append(i - bi)bi = iwhile i < n and s[i] == 'L':i += 1ll.append(i - bi)m = len(rl)ans = []for i in range(m):s = ll[i] + rl[i]temp = [0] * sif s & 1 == 0:temp[rl[i]] = temp[rl[i] - 1] = s // 2else:if rl[i] > ll[i]:temp[rl[i] - 1] = s // 2 + 1temp[rl[i]] = s // 2else:temp[rl[i] - 1] = s // 2temp[rl[i]] = s // 2 + 1times = max(ll[i], rl[i]) - 1if times & 1:temp[rl[i] - 1], temp[rl[i]] = temp[rl[i]], temp[rl[i] - 1]ans += tempprint(*ans)if __name__ == "__main__":main()

E
这种一个加一一个减一的操作,应该马上想到其和是不变的
然后遍历可以被总和整除的自然数
对于每个因数,先进行模运算,然后排序,将左边的减1,右边的加1,找到一个分界点。

# -*- coding: utf-8 -*-
# @time     : 2023/6/2 13:30
# @author   : yhdu@tongwoo
# @desc     :
# @file     : atcoder.py
# @software : PyCharm
import bisect
import copy
import sys
from sortedcontainers import SortedList
from collections import defaultdict, Counter, deque
from functools import lru_cache, cmp_to_key
import heapq
import math
sys.setrecursionlimit(100010)def check(arr, k, p):t = [x % p for x in arr]t.sort()n = len(arr)pre = 0st = sum(t)for i in range(n):pre += t[i]if pre > k:return Falseif pre == (n - 1 - i) * p - (st - pre):return Truereturn Falsedef main():items = sys.version.split()if items[0] == '3.10.6':fp = open("in.txt")else:fp = sys.stdinn, k = map(int, fp.readline().split())a = list(map(int, fp.readline().split()))sa = sum(a)p = 1ans = 0while p * p <= sa:if sa % p == 0:p0, p1 = p, sa // pif check(a, k, p0):ans = p0if check(a, k, p1):ans = p1breakp += 1print(ans)if __name__ == "__main__":main()

更多推荐

AtCoder abc 136

本文发布于:2023-12-03 23:47:56,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1659119.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:AtCoder   abc

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!