摘要:
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 阅读全文
摘要:
裸的异或高斯消元 cpp include include using namespace std; const int N=2005; int n,m,a[N][N],ans; char s[N]; void gaosi() { for(int i=1;i 阅读全文
摘要:
数论+爆搜 详见这位大佬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 阅读全文
摘要:
参考:http://hzwer.com/3099.html 神题神题 其实只要知道思路就有点都不难…… 先对每一行dp,设g[i][j]为这行前i个格子粉刷了k次最大粉刷正确数,随便n^3一下就行 设f[i][j]为前i行刷了k次的最大正确数,这个用g更新即可,像背包一样 cpp include i 阅读全文
摘要:
注意第一问不取模!!! 因为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中记录一下当前非平局有几场,如果超出要求或者剩下的场次全都非平局也达不 阅读全文
摘要:
状压dp,设f[i][j][0/1]为前i个时间段换了j间教室的期望体力消耗,转移很好想(但是写起来好长= =) cpp include include using namespace std; const int N=2005; int n,m,v,e,c[N],d[N]; double k[N] 阅读全文
摘要:
裴蜀定理:若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立。 所以最后能得到的最小燃料书就是gcd,所以直接对因数计数然后找最小的个数大于k的因数就是答案 阅读全文
摘要:
先写了个next_permutation结果T了,于是开始写状压 设f[s][i]为选取状态为s,选的数模d为i的方案数,去重的话直接除以每个数字的出现次数的阶乘即可 cpp include include include using namespace std; const int N=20; i 阅读全文
摘要:
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更新这 阅读全文
摘要:
贪心,一边读入一边更新mn,用mn更新答案,mn每次加s cpp include include using namespace std; int n,s,mn=1e9; long long ans; int main() { scanf("%d%d",&n,&s); for(int i=1,w,c 阅读全文
摘要:
每句两个顶点确定正方形,取max即可 阅读全文
摘要:
C: 枚举中间点,计算两边点差值,把个数乘起来即可 cpp include include include using namespace std; const int N=200005; long long n,k,ans; int main() { scanf("%lld%lld",&n,&k) 阅读全文
摘要:
二分答案,贪心判断,洛谷上要开long long cpp include include using namespace std; const int N=50005; int n,m,a[N],b[N]; int read() { int r=0,f=1; char p=getchar(); wh 阅读全文
摘要:
挺好的区间dp,状态设计很好玩 一开始按套路设f[i][j],g[i][j]为吃完(i,j)区间站在i/j的最小腐败值,后来发现这样并不能保证最优 实际上是设f[i][j],g[i][j]为从i开始吃j个,站在这段区间的左/右端点的 最小所有草增加的腐败值 ,因为这些腐败之最后也是要算进去的,所以直 阅读全文
摘要:
和bzoj同名题不一样! 起点和水点向花费一个荷花能到的第一个点连一条边权为1的有向边,然后跑计数spfa即可 阅读全文
摘要:
直接bfs,在过程中更新方案数即可 cpp include include include using namespace std; const int N=55,inf=1e9,dx[]={1,1, 1, 1,2,2, 2, 2},dy[]={2, 2,2, 2,1, 1,1, 1}; int n 阅读全文
摘要:
设f[i]为i为牡牛的方案数,f[0]=1,s为f的前缀和,f[i]=s[max(i k 1,0)] cpp include include using namespace std; const int N=100005,mod=5000011; int n,m,f[N],s[N]; int mai 阅读全文
摘要:
神仙构造,做不来做不来 详见:http://vfleaking.blog.163.com/blog/static/174807634201329104716122/ cpp include include include include using namespace std; const int 阅读全文
该文被密码保护。 阅读全文
摘要:
爆搜卡线过 并不知道正解是啥 cpp include include using namespace std; const int N=40; int n,ans,a[N][N],l[N],h[N],c[N]; void dfs(int x) { if(x==n+1) { ans++; return 阅读全文