摘要:
PS:换了一种方式 希望大家喜欢 2333 /** code by: zstu wxk time: 2019/03/01 Problem Link: http://codeforces.com/contest/1130/problem/E solve: 如果构造的数列是 0 0 0 0 0 0 0 阅读全文
摘要:
题目传送门 题解: 我门可以用枚举26个字符的情况,然后取大。 现在我们先讨论a的情况: 那么当 a 的个数为0的时候, a 的个数只有在1种情况下才会被更新: 新加入的串中有连续的a, 我们取中间最大的。 然后当 a 的个数不为1的时候, a的个数更新方式有2种: 1. 新加入的串全为a, 那么就 阅读全文
摘要:
题目传送门 先把 = 的人用并查集合并在一起。 然后 < > 的建边, 跑一遍 toposort 之后就好了。 入度为0点的值肯定为1, 然后就是因为这个是按照时间线走过来的,所以一个点的最小值,就是在入队的那一刻确定的, 即入度为0的时候,值就是现在的值+1。 注意就是不要同一个点入队多次。 代码 阅读全文
摘要:
题目传送门 显然可以发现: 我们sort之后,把奇数位的先按顺序拿出来,然后再把偶数位的按照反顺序拿出来,这样就可以保证答案最小。 代码: /* code by: zstu wxk time: 2019/02/24 */ #include<bits/stdc++.h> using namespace 阅读全文
摘要:
题目传送门 题解: 先观察蚂蚁相撞, 可以发现, 如果我们将相撞的2个蚂蚁互换位置的话,蚂蚁相当于没有碰撞体积,直接穿过去了。所以我们可以直接计算出最终哪些位置上会有蚂蚁。 接下来就需要知道蚂蚁们的最终是走到哪个位置上。 需要先明白的是, 蚂蚁的相对位置是不会发生变化的,他的左边和右边的蚂蚁是不会发 阅读全文
摘要:
题目传送门 题解总结起来其实很简单。 把所有的边双联通分量缩成一个点,然后建立好新边, 然后再从起点搜到终点就好了。 代码: /* code by: zstu wxk time: 2019/02/23 */ #include<bits/stdc++.h> using namespace std; # 阅读全文
摘要:
题目传送门 题解: 可以将所有线段按照左端点优先小,其次右端点优先大进行排序。 然后对于第 i 条线段来说, 那么第 i+1 n 的线段左端点都一定在第i条线段的右边, 接下来就需要知道 i+1 n 中的这些线段有多少条的右端点是在第 i 条线段的右端点的左边。 可以通过一个树状数组来维护一个右端点 阅读全文
摘要:
题目传送门 题解: 如果正着连边,可以发现最困难的点是ti不好处理。 所以我们连反边,然后将ti转换成前面有n-ti+1架飞机起飞了作为限制条件。 对于第一问,直接toposort 然后反着输出求出的结果。 对于第二问,我们则枚举每个架飞机,然后在toposort的时候不把这个点入队,直到队列为空的 阅读全文
摘要:
题目传送门 操作就是询问某个点的值, 然后就是对一条路径上的值全部修改。 最基本的树刨题目了。 树刨的思想: 1. 对于每个点找到他的重儿子。 void dfs1(int o, int u){ sz[u] = 1; for(int i = head[u]; ~i; i = nt[i]){ int v 阅读全文
摘要:
题目传送门 题解: 先用题目给定的dfs方式得到dfs序,记录下出入的dfs序。 很明显可以得知的是,以u为根的子树的dfs序在 in[u] - out[u] 的范围之内。 将每个询问先全部存到对应的节点上。 然后我们以1为root,先求出每个叶子节点到1的距离。 对1的询问查询更新完答案之后。 ( 阅读全文