CF Round 1090 (Div.4) YIN
【尹显齐 25 物理学院】征战(也许最后一场)。怒砍AC5,后面一个多小时直接被寝室同学吵爆了,差10分钟做出G。E题没用pypy而是用的python,直接遗憾离场。最终

做局代码:
n = 200000
mask = (1<<17) - 1
fill = int((1<<15)*1.3+1)
arr = [mask+2]*2
x = 6
for i in range(1,fill):
arr.append(x)
x = x * 5 + 1
x = x & mask
arr.sort()
brr = set(arr)
crr = []
cur = 0
for i in range(0,131293):
if i not in brr:
crr.append(i)
cur += 1
arr.extend([131293]*(n-len(arr)-cur))
arr.extend(crr)
print(1)
print(n,131294)
print(*arr)接下来我将给出
2218D. The 67th OEIS Problem
我们要让相邻两个数的最大公因数均不同,容易想到让第
def sieve(n):
is_prime = [1]*(n+1)
is_prime[0] = is_prime[1] = 0
for i in range(2,int(n**0.5)+1):
if is_prime[i]:
for j in range(i*i,n+1,i):
is_prime[j] = 0
primes = [i for i in range(2,n+1) if is_prime[i]]
return primes
p = sieve(2*10**5)
for _ in range(int(input())):
n = int(input())
arr = [2]
for i in range(n-1):
arr.append(p[i+1]*p[i])
print(*arr)2218E. The 67th XOR Problem
由于 xor 运算满足交换律和结合率,所以最后的结果一定是形如
这里的乘方指的是异或乘方,即:
我们考察一下在第
for _ in range(int(input())):
n = int(input())
arr = list(map(int,input().split()))
ans = 0
for i in range(n):
for j in range(i):
ans = max(ans,arr[i]^arr[j])
print(ans)2218F. The 67th Tree Problem
首先我们明白一点:一个偶节点不可能作为叶子,所以它下面一定有节点连接,考虑它的所有子节点这些子节点对应的子树的大小之和为奇数,所以一定有一个子树的大小是奇数,也就是说一定有一个子节点是奇节点。所以我们得到定理:
如果一个节点是偶节点,那么它一定有至少一个子节点,并且至少一个子节点是奇节点。
对于整棵树,我们可以得到:
偶节点数量不大于奇节点数量。即
这就是我们判断能否形成树的条件。接下来,我们给出树的构造:先用链状结构连接前
为了证明这个构造的合理性,我们进行奇偶性填充。首先从
注意到上述方式在
for _ in range(int(input())):
x,y = map(int,input().split())
n = x+y
if y >= x:
if x == 0:
if y%2:
print("YES")
for i in range(n-1):
print(1,i+2)
else:
print("NO")
else:
print("YES")
for i in range(1,2*x):
print(i,i+1)
for i in range(2*x+1,x+y+1):
print(x*2,i)
else:
print("NO")2218G. The 67th Iteration of "Counting is Fun"
我们首先可以用前缀和快速预处理在
from collections import Counter
for _ in range(int(input())):
n,m = map(int,input().split())
arr = input().split()
if n == 1:
print(1)
continue
c = Counter(arr)# 依旧字符串
dic = {}
dic[-1] = 0
for i in range(m):
dic[i] = dic[i-1] + c[str(i)]
fnl = 1
found = 1
arr = list(map(int,arr))
for i in range(n):
nei = []
for j in [-1,1]:
if 0 <= i+j < n:
nei.append(arr[i+j])
if 0<arr[i] <= min(nei):
found = 0
break
elif arr[i] == min(nei) + 1:
fnl *= dic[min(nei)]
fnl %= 676767677
elif arr[i]:
fnl *= dic[arr[i]-1] - dic[arr[i]-2]
fnl %= 676767677
if found == 0:
print(found)
else:
print(fnl)2201B. Recollect Numbers
通过观察样例可以发现使得对于某个
此时需要
对于两个相同的数,至多花四步就能消除它们:发现第一个数,发现第二个数(该回合第二步,否则会和第一个数一起被直接消除),消除第一个数和第二个数。所以
容易得出对于某个
此时需要
所以,当
回合数恰为
for _ in range(int(input())):
n,k = map(int,input().split())
if n <= k <= 2*n-1:
print("YES")
d = k-n
if k == n:
ans = []
for i in range(1,n+1):
ans.append(i)
ans.append(i)
else:
ans = [1,2]
for i in range(1,d):
ans.append(2+i)
ans.append(i)
ans.append(d)
ans.append(d+1)
for i in range(n-d-1):
ans.append(d+2+i)
ans.append(d+2+i)
print(*ans)
else:
print("NO")好的,开胃小菜结束了,来点爆的。
2210D. A Simple RBS Problem
题目名字很简单,实际内容并非如此。
我们可以想象将嵌套的括号转化成树来分析问题。一对括号代表一个节点,该对括号和它里面包含的所有括号形成子树。问题就转化为:随意地交换某两个节点的一些子节点的子树(不重合),能否从树
我们先进行初步分析,我们发现叶子节点的个数不变。这很明显,因为如果一个节点原本有子节点,那么无论如何交换它的子节点也不能把它的子节点变消失,对于原本没有子节点的节点,也不能凭空创造子节点。
接下来,我们要规避链式结构的影响,因为对于从根引出的链式结构,你无法进行任何交换(做不到不重合),所以我们发现链式结构的长度也不能变,具体地说,就是第一个有多于一个子节点的节点的深度不能变。
处理以上两点,我们只用建立每个点的出度表就能轻松完成。
接下来证明,这两个特殊条件是充分的。我们要将任意满足上述两条件的树转化为完全相同的一个特殊的树。我们考虑能否将任意的第一个有多于一个子节点的节点
def edges(s):
global n
match = {}
stack = []
# 预处理配对括号的位置
for i,ch in enumerate(s):
if ch == '(':
stack.append(i)
elif ch == ')':
left = stack.pop()
match[left] = i
match[i] = left
# 计算出度
outs = []
for i in range(n+2):
if s[i] == '(':#左括号对应一个节点
count = 0
j = i + 1
while j < match[i]:
if s[j] == '(':
count += 1
j = match[j] + 1
else:
j += 1
outs.append(count)
return outs
for _ in range(int(input())):
n = int(input())
s1 = "("+input()+")"
s2 = "("+input()+")"
ans1,ans2 = edges(s1),edges(s2)
judge = 1
# 单独判断链式情况
for i in range(n//2):
if ans1[i] > 1 and ans2[i] > 1:
break
elif ans1[i] == 1 and ans2[i] == 1:
continue
else:
judge = 0
break
print("YES" if ans1.count(0) == ans2.count(0) and judge else 'NO')