数位dp 记忆化搜索    2018-11-12 15:09:02    180    0    0
Solution 数位dp 枚举数的和,这样我们就可以记忆化了! 只有我不知道系列:存入记忆化数组时,要存无限制的,有限制的不存...存了就慢好多??? 懵.jpg Code #include <cstdio>#include <cstring>#define ll long longll l,r,dp[22][200][200];int len,a[22],mod;ll dfs(int pos,int now,int sum,int lim){ //该第pos位 当前数模mod(自定义)是now,数字和是sum //lim是否是
欧拉回路 学习笔记    2018-11-12 14:08:29    178    0    0
码一下欧拉回路代码 Qw #include <cstdio>#define N 100010int ty,m,n,num=0,top=0,out[N],in[N],vis[N<<1],sta[N<<1],h[N];struct node{int to,next;}mp[N<<2];inline char gc(){ static char *S,*T,buf[1<<16]; if(T==S){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;
splay    2018-11-12 14:08:25    181    0    0
Solution splay" role="presentation" style="position: relative;">splaysplaysplay 维护... 一、二操作直接做即可。 三操作,我们在 L" role="presentation" style="position: relative;">LLL 处插入一个 0" role="presentation" style="position: relative;">000 ,R" role="presentation" style="position: relative;">RRR 和 R+1"
欧拉回路    2018-11-12 14:08:21    182    0    0
Solution 对于长度为 k" role="presentation" style="position: relative;">kkk 的01串,显然结果最长的是 2k" role="presentation" style="position: relative;">2k2k2^k 即想求一条欧拉回路。 我们对于 k&#x2212;1" role="presentation" style="position: relative;">k−1k−1k-1 位的01串,暴力向后连 0 或 1,找到字典序最小即可。 Code #include &l
数学 矩阵快速幂    2018-11-12 14:08:17    181    0    0
Solution 我们想求 (b+d2)n" role="presentation" style="position: relative;">(b+d√2)n(b+d2)n(\frac{b+\sqrt{d}}{2})^n ,但这个不好算啊... 因此我们再加上一个 (b&#x2212;d2)n" role="presentation" style="position: relative;">(b−d√2)n(b−d2)n(\frac{b-\sqrt{d}}{2})^n 我们令 A=(b+d2)" role="presentation" style="positio
状压dp 爆搜    2018-11-12 14:08:14    174    0    0
Solution 首先个数最多只有 3628800" role="presentation" style="position: relative;">362880036288003628800 种,爆搜就可以。 s长度不超过 10 ,因此状压dp 也可以。 还是爆搜好写啊... Code \\状压dp#include <cstdio>#include <cstring>int T,d,len,ans,dp[1025][1001],a[11],flag[11];char s[11];inline void solve(){ scanf(
数位dp    2018-11-02 12:07:44    279    0    1
数位dp.... 不会写啊... 写的..太复杂了... Code #include <cstdio>#include <cstring>#define ll long longll L,R,f[15][15][5][5][5][5];int num[15];ll dfs(int a,int b,int f1,int f2,int f3,int f4){ /* 第 a 位选了 b f1=0 4没出现过;f1=1 4出现过 f2=0 8没出现过;f2=1 8出现过 f3=0 三位条件已满足;f3=1 已连了1位;
费用流    2018-11-02 12:06:24    283    0    0
Solution 计算每个数可以得到质数的乘积,记作 cnt[i]" role="presentation" style="position: relative;">cnt[i]cnt[i]cnt[i]。 如果两个数的 cnt" role="presentation" style="position: relative;">cntcntcnt 相减正好得 1,且能整除,即两点有连边。 因此这是个二分图。 然后跑费用流就可以了。 Code #include <cstdio>#include <cstring>#include <
状压dp    2018-11-02 11:45:39    267    0    0
Solution 状压dp f[i][j][k]" role="presentation" style="position: relative;">f[i][j][k]f[i][j][k]f[i][j][k] 表示前 i 个人都做完时,最后一个人是 i ,前一个人是 j ,i后面 7 个的状态是 k。 j 要用相对位置,不然数组开不下。 细节题... Code #include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define N 1
拓扑排序    2018-11-02 11:39:28    271    0    0
Problem 有一些条件 &lt;a,b&gt;" role="presentation" style="position: relative;"><a,b><a,b> ,a" role="presentation" style="position: relative;">aaa 必须在 b" role="presentation" style="position: relative;">bbb 前面。 求使得 1 2 3...位置最小的。 Solution 显然,直接拓扑是不对的,这样会得到字典序最小,而不是题目要求。
文档导航