摘要:
正难则反。动态加边比较难以维护,考虑倒着维护 先把全部边都添加的状态维护好,之后倒着删边。 对于每一次,如果有一个人他没有k个好友,那么他就永远不可能旅游,因此将他删除后,并且用一个队列来做因为他删除而导致的一系列后果。 那么还在的人是都可以去旅游的,因为他们都有k个好友 因此我们每次删一条边就把两 阅读全文
摘要:
A题 模拟 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int mod1=1e9+7; const int mod2=1e9+9; int base=11; struct X{ int x,y; i 阅读全文
摘要:
将图的所有状态都存下来,一步一步bfs遍历,但是需要去重,由于重载运算符过于复杂,因此考虑用双哈希去重 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int mod1=1e9+7; const int 阅读全文
摘要:
观察到所有成环的之间的距离都是1,因此可以想到使用tarjan缩点后建立园方树 这样答案就是两点间距离/2 #include<bits/stdc++.h> using namespace std; typedef pair<int,int> pll; const int N=1e6+10; int 阅读全文
摘要:
对于这些运算,我们考虑一个问题。对于叶子取反,因为每次只对一个叶子节点操作,一般来说,他的父亲节点会反转,只有存在以下情况不会反转 1.or运算且有一个儿子是1,那么另一个儿子无论怎么操作都是1 2.and运算,如果一个儿子是0,那么另一个儿子无论怎么操作都是不变化。 #include<bits/s 阅读全文
摘要:
做的时候想到拆点,但是没想到维护关系的方法。 这题我们考虑一个字符串分成原串和相反串,用i和i+n表示,我们要做的是维护所有串的相对关系,也就是选了某些串就要选其他串 考虑任意两个字符串i,j之间的关系,如果他们不反转和一个反转都是满足要求的,那么就不用约束关系 如果不反转和反装都不能满足要求,那么 阅读全文
摘要:
A 映射一下 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=4e5+10; const int inf=1e9; int a[N]; 阅读全文
摘要:
本题如果去掉怪物选项就是双关键字最短路。 问题是现在多了一个怪物选项,因为这个怪物选项被杀死后他不会复生,因此我们不能重复计算这个值的答案。 所以对于每条过来的路,前面一个点遇到的怪物的后面的点就不用计算了,也就是去重。 根据这个思路,我们可以得到我们想要干的是当枚举到当前点,我们希望计算出他的co 阅读全文
摘要:
根据斐波那契的性质得出,区间存在结合律,因此我们对于原先给定的先建出线段树,对每个点维护一个矩阵表示当前的斐波那契答案。 对于opt1,就是区间修改,也就是加上一个转移矩阵,传递这个矩阵,与普通的线段树操作一样的 对于opt2.也就是区间查询,查询区间内的和,因此我们只需要维护一个sum矩阵和laz 阅读全文
摘要:
本题的k很小,我们发现最多不超过10的点会产生贡献 题目中要求没有奇数环,这让我们想到了二分图染色。 因此答案肯定是所有偶数环的最优解。 因此我们对图上的点随机赋值一种颜色,走所有的偶数环 在重复一定的数量,这样走到正解的概率就很大了 #include<bits/stdc++.h> using na 阅读全文