noip2019集训测试赛(二十一)Problem B: 红蓝树 Description 有一棵N个点,顶点标号为1到N的树.N−1条边中的第i条边连接顶点ai和bi.每条边在初始时被染成蓝色.高桥君将进行N−1次操作,来把这棵蓝色的树变成红色的树.* 选一条仅包含蓝色边的简单路径,并删除这些边中的一条.* 然后在路径的两个端点中间连一条红色的边.他的目标是,对于每一个i,都有一条红色的边连接ci和di.现在请你判断是否可能达成他的目标. Input 题目数据按一下格式从标准输入输出输入: NN…
Problem A: Colorful Balls Description Snuke放了N个一排彩色的球.从左起第i个球的颜色是ci重量是wi她可以通过执行两种操作对这些球重新排序操作1:选择两个相同颜色的球,假如他们的重量和小于等于X,交换两个球的位置操作2:选择两个不同颜色的球,假如他们的重量和小于等于Y,交换两个球的位置求我们总共可以得到多少种 不同的颜色序列?对答案取109+7的模 Input N X Yc1 w1. . .cN wN Output 输出答案. Sample Input…
题面 Description 给定一个字符串 ss .现在问你有多少个本质不同的 ss 的子串 t=t1t2⋯tm(m>0)t=t1t2⋯tm(m>0) 使得将 tt 循环左移一位后变成的 t′=t2⋯tmt1t′=t2⋯tmt1 也是 ss 的一个子串. Input 输入仅有一行,一个字符串 s(1≤lens≤300000)s(1≤lens≤300000) .字符串 ss 仅包含小写字母. Output 输出一个整数表示答案. Sample Input (样例输入1) abaac (样例输入…
Solution 智障暴力题, 每个点维护一下子树信息, 树剖就好了. 我居然还傻了写了一发毛毛虫... #include <cstdio> #include <cctype> #include <vector> #include <algorithm> #include <cstring> #define vector std::vector #define max std::max #define min std::min #define s…
Problem A: 贪吃蛇 描述 Input Output Sample Input [样例输入1] 4 5 ##... ..1#@ 432#. ...#. [样例输出1] 4 [样例输入2] 4 4 #78# .612 .543 ..@. [样例输出2] 6 [样例输入3] 3 2 3@ 2# 1# [样例输出3] -1 这道题就是一个简单的广搜,储存蛇头位置,步数和蛇的身体的各个部分的位置.注意,要关照一下蛇不能越过自己的身体. 代码: #include<bits/stdc++.h> u…
题目大意 给你一棵树, 每个点有一个点权. 有两种操作: link / cut 修改某个点的点权 每次操作后, 你要输出以下答案: 在整棵树中任意选两个点, 这两个点的LCA的期望权值. Solution 我们考虑每个点作为LCA的概率: \[ P(u为LCA) = \frac{sz[u]^2 - \sum_{v为u的子节点} sz[v]^2}{n^2} \] 所以我们的答案为 \[ \begin{aligned} E &= \frac{\sum_{每个节点u} (sz[u]^2 - \sum_…
Solution 首先审清题意, 这里要求的是子串而不是子序列... 我们考虑用1表示p, -1表示j. 用sum[i]表示字符串前\(i\)的前缀和. 则我们考虑一个字符串\([L, R]\)有什么要求: \(\forall x \in [L, R]\)满足\(sum[x] \ge sum[L - 1]\). 我们分别从前往后和从后往前求出以每个位置为开头的最长合法子串, 然后扔进树状数组里面查询即可. 至于怎么求以每个位置为开头最长合法子串, 我们考虑用一个单调栈来维护: 从前往后扫每个位置…
Solution 这道题有两个关键点: 如何找到以原串某一个位置为结尾的某个子序列的最晚出现位置 如何找到原串中某个位置之前的所有数字的最晚出现位置中的最大值 第一个关键点: 我们注意到每个数字在\(M\)和\(L\)中最多只会出现一次. 以\(M\)为例, 我们从前往后逐位在原串中匹配, 数组f[i]表示\(M\)的前\(i\)位在原串中当前位置之前的最晚出现位置. 假设当前数字\(x\)在\(M\)中出现位置为\(p\), 则 \[ f[p] = \begin{cases} f[p] = i…
Solution 场上的想法(显然是错的)是这样的: 我们假设棋子是一个一个地放置的, 考虑在放置棋子的过程中可能出现哪些状态. 我们令有序整数对\((i, j)\)表示总共控制了\(i\)行\(j\)列的情况, 我naive地认为一个状态要么不出现, 要么只出现一次. 于是用\(f[i][j]\)来表示出现的概率, 直接进行DP. 然后我用随机函数对拍, 发现是WA的... 考虑问题出现在了哪里: 一个状态实际上是可以出现多次的. 比如说我们考虑分别控制了两行两列的状态: 两行两列产生4个交点…
题目大意 你们自己感受一下原题的画风... 我怀疑出题人当年就是语文爆零的 下面复述一下出题人的意思: 操作1: 给你一个点集, 要你在trie上找到所有这样的点, 满足点集中存在某个点所表示的字符串是这个点所表示字符串的后缀. 把这些点的权值加一: 操作2: 给你一个点集, 要你在trie上找到所有这样的点, 满足这个点所表示的字符串是点集中某个点的后缀; 求所有这些点的权值之和. 做法很显然, 我们先建立出后缀树, 在后缀树上树剖, 剖出的序列用线段树维护即可. 注意树剖得到的序列中, 一个…