摘要:
无题解,纯记录比赛 本来以为是线下,后来改成了线上,变成了学校机房一日游~~ 因为和ec冲突了,所以走了一波强队,感觉比赛会简单一点(据说好多队伍直接西安打浙江省赛,妙啊) 中午买了面包就等开始比赛了 正赛: 开局等我打好前面的预备代码,队长表示已经会A了 过了A后,三个人分开看题。 M是一道思维题 阅读全文
摘要:
A题 我写的是找是否存在两个1之间有0,并且要特判单一个1的情况 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=2e5+10; con 阅读全文
摘要:
首先破环成链,因为图中是一个环,所以转化成有n种可能性的链。 输入如果右端点小,就+m 一个显然的贪心是,既然选择当前点,那么下一个点的左端点越靠近当前点的右端越好 这个成立的原因是,没有两个线段存在包含关系,因此左端点越右,右端点越右,这样覆盖的会尽可能的远。 之后就可以用倍增优化进行跳跃,直到覆 阅读全文
摘要:
A题 线段树+欧拉降幂 题目要求的状态只有30种,所以对于每次操作,我们可以枚举所有的情况,计算他的转移方向,我们用lazy标记表示这个数操作完后的状态,打个懒标记 然后对于询问的时候,只要询问每个数的个数即可。对于快速幂的情况,普通快速幂因为太慢,所以考虑使用欧拉降幂来加速 #include<bi 阅读全文
摘要:
A题 贪心从10开始 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=1e6+10; const int mod=1e9+7; int 阅读全文
摘要:
第一次遇到有9题的div2。。。 A题 排序后,伸展两边 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=2e5+10; const i 阅读全文
摘要:
这题需要一点思维转化,感觉还是挺有意思的。 我们仔细观察选点的要求,发现,根要小于左右子树,左子树选的要大于右子树 因此,将他按根-右-左遍历之后,求一遍最长上升子序列就是答案 #include<bits/stdc++.h> using namespace std; typedef long lon 阅读全文
摘要:
这道题可以使用启发式合并和延迟的策略来做 首先我们发现第一个操作就是将两个集合合并,要在合理的复杂度之内做到此事,启发式合并是个好办法 其次,因为我们需要查询的是最大值,因此用堆来维护也比较方便,但是现在有个问题,因为一些权值会被改变 而堆不能指定元素删除,因此如果要维护这些值,暴力的做法是把这个值 阅读全文
摘要:
这道题看到操作4就能想到使用可持久化数据结构 对于这一题的初始想法,是把二维映射到一维,前两个操作是单点修改,第三个是区间01反转 感觉应该是可做的,但是不太好写。 一种好写的做法是,维护行,对于每行维护一个bitset,这样三种操作就都很容易做了 #include<bits/stdc++.h> u 阅读全文
摘要:
分层图+最短路算法 对于题目当中的条件进行转化,相当于允许一条边代价为0,一条边代价为两倍,且必须要两种情况都使用。 因此考虑建立分层图,这样的话,分成四层,就能够先0后2倍,先两倍后0,两种情况都能表达了 此外,由于由于存在一条边即作为最小值也作为最大值,我们要连一条直接从1到第四层的边 #inc 阅读全文