A - WOW Factor
ans += 出现o的位置前的w数量 * o后面的w数量
// Problem: A - WOW Factor
// Contest: Virtual Judge - 22练习赛
// URL: https://vjudge.net/contest/578163#problem/A
// Memory Limit: 256 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include
#include
#include
#include
#include
#include
B - Mishka and the Last Exam
贪心的想a[i] + a[n - i + 1] == b[i]
通过b数组构造a(非降序)则希望前者尽量小,后者尽量大
对于b[1]可以确定头and尾
则令a[n] = b[1] a[1] = 0
后面的构造也是将b[i]拆分赋值给a[i] and a[n - i + 1]
∵非降序则a[i]至少为a[i - 1]而a[n - i + 1]至少小于等于a[n - i + 2]
可得
又∵
很愉快的TIL
先前考虑优先满足前者
∵题目保证至少可以构造一组a,即一定有解
那么我们索性再贪一点让a[n - i + 1] 赋值为a[n - i + 2]
那么 a[i] = b[i] - a[n - i + 1];
如果此时破坏了a的规则,则我们希望a[i]尽可能小,a[n - i + 1]尽可能大
// Problem: B - Mishka and the Last Exam
// Contest: Virtual Judge - 22练习赛
// URL: https://vjudge.net/contest/578163#problem/B
// Memory Limit: 256 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include
#include
#include
#include
#include
#include
C - Queen
∵叶子节点没有儿子节点,那么就不存在儿子节点尊重它(???题目的真理)
∴我们初始化默认每一个节点都不被子节点尊重
每轮输入其子节点编号p及c(1不尊重父节点,0反之)
其中每一个节点只存在一个父节点则显然 fa[i] = c即可
而p相对i为父节点 == > i是p的子节点
若c == 0 则p被子尊重son[p] = 0;
∵p可以有多个子节点 == >> 一次为0永久为0 && son[p]默认初始化1
则通过son[p] &= c即可
// Problem: C - Queen
// Contest: Virtual Judge - 22练习赛
// URL: https://vjudge.net/contest/578163#problem/C
// Memory Limit: 256 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include
#include
#include
#include
#include
#include
D - Zero Quantity Maximization
根据公式 任意x = a[i] * d + b[i]
// Problem: D - Zero Quantity Maximization
// Contest: Virtual Judge - 22练习赛
// URL: https://vjudge.net/contest/578163#problem/D
// Memory Limit: 256 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include
#include
#include
#include
#include
#include
E - Banh-mi
根据题意可以知道一个情况
每次吃xi ,其余 + xi,若xi == 0则sum最终为0(x1 = 0 | 1)
那么贪心的将,希望sum最大,我们希望 + xi最大,每次吃掉的xi就为最大
统计1的个数,若1的个数为0 == >> ans = 0
else
对于1的变化一定为 1 2 4 8 ……(每次吃最大,第一次一定吃1,则最大变为2,吃2,变为4……)
num1 个 1的贡献等于 pow(2,num1) - 1
对于num0 个0 前num1个操作使得此时的0变成pow(2,num1) - 1
num0个操作后面0的贡献为(pow(2,num1) - 1) * (pow(2,num0) - 1)
ans = pow(2,num1) - 1 + (pow(2,num1) - 1) * (pow(2,num0) - 1) = (pow(2,num1) - 1) * (pow(2,num0) )
我们用线段树维护区间[l,r]中间1的个数(写完发现前缀和即可,看到区间就想线段树了%……)
// Problem: E - Banh-mi
// Contest: Virtual Judge - 22练习赛
// URL: https://vjudge.net/contest/578163#problem/E
// Memory Limit: 256 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include
#include
#include
#include
#include
#include
F - The Number Of Good Substrings
首先暴力先行
枚举1到n的数字
将数字转换为二进制串
if(t.size() > n)break;后续不可能出现 == 的情况
else k = i - t.size();//前补0
只需要查找s中间t出现的次数累加即可
// Problem: F - The Number Of Good Substrings
// Contest: Virtual Judge - 22练习赛
// URL: https://vjudge.net/contest/578163#problem/F
// Memory Limit: 256 MB
// Time Limit: 4000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include
#include
#include
#include
#include
#include
然后 很愉快的TIL
不难想 二进制下出现0(前往后)数字num的变化 == num << 1 = num * 2
若出现1(再末尾)num += 1
从前往后枚举(0 -> n)
∵前置0对num没有任何作用
∴我们直接先跳到距离i最近的1的位置(用a[i]保存)
和先前讲解的一样若次数 num == j(尾) - i(头) + 1满足答案条件ans++
若 > break;
// Problem: F - The Number Of Good Substrings
// Contest: Virtual Judge - 22练习赛
// URL: https://vjudge.net/contest/578163#problem/F
// Memory Limit: 256 MB
// Time Limit: 4000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include
#include
#include
#include
#include
#include