随笔分类 - all—好题
摘要:离线,按照l排序 注意到在区间里出现两次的颜色才有贡献,所以记录一个ne[i]表示i后第一个和i同色的花,维护一个l,每次处理询问的时候l单调右移,树状数组维护,在ne[ne[i]]位置++,在ne[i]位置 (因为这里已经++过了),这样区间查询的时候如果右端点超过ne[ne[i]]就能对答案有贡
阅读全文
摘要:https://blog.sengxian.com/solutions/bzoj 1444 orz 一直是我想错了,建出AC自动机之后,实际上这个定义是设f[i]为经过i节点的 期望次数 ,因为单词末尾节点走到意味着游戏结束,所以经过单词末尾节点的概率就是经过单词末尾节点的期望次数。为什么是期望呢,
阅读全文
摘要:好像是高斯消元解互相推(?)的dp的例子 首先考虑dp,设f[i][j]为一人在i一人在j的概率,点i答案显然就是f[i][i]; 然后根据题意,得到转移是 $$ f[i][j]=f[i][j] p_i p_j+\sum_{edge(x,i)\in E}f[x][j] p_j \frac{1 p[x
阅读全文
摘要:nim游戏的先手必胜条件是所有堆的火柴个数异或和为0,也就是找一个剩下火柴堆数没有异或和为0的子集的方案,且这个方案保证剩下的火柴个数总和最大 然后我就不会了,其实我到现在也不知道拟阵是个什么玩意…… 详见:https://blog.csdn.net/wyfcyx_forever/article/d
阅读全文
摘要:数论+爆搜 详见这位大佬https://blog.csdn.net/eolv99/article/details/39644419 cpp include include include using namespace std; const int N=100000; int s,p[N+5],to
阅读全文
摘要:注意第一问不取模!!! 因为a+b=a|b+a&b,a^b=a|b a&b,所以a+b=a^b+2 (a&b) x^3x==2x可根据异或的性质以转成x^2x==3x,根据上面的推导,得到 x^2x=x+2x 2 (x&2x)==3x; 3x 2 (x&2x)==3x; x&2x==0; x&(x
阅读全文
摘要:大力剪枝,最后洛谷上还开了o2才过…… 大概这样剪枝: 1.搜索中,一个队当前得分超过要求或者一个队剩下的比赛场数全赢也达不到要求则return; 2.注意到如果平局,最总分的贡献是2,否则是3,所以可以计算出非平局的常数,dfs中记录一下当前非平局有几场,如果超出要求或者剩下的场次全都非平局也达不
阅读全文
摘要:一开始状态设计错了…… 设f[i][s]为当前与根节点联通状况为s,最深深度为i 转移的话枚举当前没有和根联通的点集,预处理出把这些点加进联通块的代价(枚举s中的点和当前点的连边乘以i即可),然后用没联通点的集合b去更新f[i+1][s|b]即可 位运算处理用类似lowbit的东西 cpp incl
阅读全文
摘要:d[u]为u被几个节点保护,d1[u]为最早到u的时间,d2[u]为u的最早可进入时间(保护点都被打下来了的时候),然后最终最早进入时间就是max(d1[u],d2[u]),把这个作为权值放进小根堆,每次用这个max+e[i].va和d1取min更新d1,然后用max和当前d==0的点取max更新这
阅读全文
摘要:挺好的区间dp,状态设计很好玩 一开始按套路设f[i][j],g[i][j]为吃完(i,j)区间站在i/j的最小腐败值,后来发现这样并不能保证最优 实际上是设f[i][j],g[i][j]为从i开始吃j个,站在这段区间的左/右端点的 最小所有草增加的腐败值 ,因为这些腐败之最后也是要算进去的,所以直
阅读全文
摘要:和bzoj同名题不一样! 起点和水点向花费一个荷花能到的第一个点连一条边权为1的有向边,然后跑计数spfa即可
阅读全文
摘要:同1801 注意到一行只能放012个炮,我们只需要知道列的状态,不用状压行 所以设f[i][j][k]表示前i行有j列有1个炮,有k列有2个炮的方案数 然后分情况讨论转移就行了
阅读全文
摘要:感觉我的智商可能不够写题解,就直接截了hzwer的blog 地址http://hzwer.com/2656.html cpp include include include using namespace std; const int N=1000005; int n,a[N],c[N],p; lo
阅读全文
摘要:两遍dfs一遍向下,一边向上,分别记录子树内人数a,当前点到所有点的距离b,最大值c和次大值d,最大值子树p 然后答案是2b c cpp include include using namespace std; const int N=1000005; int n,m,h[N],cnt,p[N];
阅读全文
摘要:~~没有复杂结构甚至不长但是写起来就很想死的代码类型~~ 原理非常简单,就是用先用单调队列处理出mn1[i][j]表示i行的j到j+k 1列的最小值,mx1[i][j]表示i行的j到j+k 1列的最大值 然后就变成求单列最大最小值,用上面同样的方法处理出对于列的mn2mx2即可 cpp includ
阅读全文
摘要:设f[i][j]表示数列到i为止最后一项第j位为1的最大子序列长度,每次从i 1中1 include using namespace std; int n,f[35],ans; int read() { int r=0,f=1; char p=getchar(); while(p '9'||p='0
阅读全文
摘要:第一想法是按照结束时间贪心,但是这样有反例 所以先按照t贪心,能选则选,把选的楼的持续时间放进大根堆里,当当前的楼不能选的时候如果当前的持续时间比大根堆里最大的要小,就用这个替换最大,这样总数不变但是时间缩短了 cpp include include include include using na
阅读全文

浙公网安备 33010602011771号