摘要:/* 给定一组偏序关系,问最少第几步能确定次序 如果出现环,问第几步出现环 因为要求第几步确定次序或者第几步出现环,所以每次读入一个偏序关系就进行一次拓扑排序 */ #include <iostream> #include <cstring> #include <cstdio> #include <
阅读全文
摘要:/* 三维拓扑排序 将每个长方体分解成六个面,xyz三维进行操作 每一维上的的所有长方体的面都应该服从拓扑关系,即能够完成拓扑排序=如果两个长方体的关系时相交,那么其对应的三对面只要交叉即可 如 a1 b1 a2 b2反之对应的那对面不可以交叉 如a1 a2 b1 b2 同时长方体自身的对应两个面也具有拓扑关系 */ #include using namespace std; #define ...
阅读全文
摘要:/*给定两个点之间的三种关系 = 如果是=就将两点放到同一个集合里进行缩点 离线处理所有关系,先用并查集将等于关系缩成一个点 */ #include using namespace std; #define maxn 20005 struct Query{int u,v;char ch;}q[maxn]; struct Edge{int to,nxt;}edge[maxn>n>>m){ ...
阅读全文
摘要:由这两题可知拓扑排序是通过“小于”关系加边建图的 hdu2647
阅读全文
摘要:/*0.012s*/ #include #include using namespace std; int num[100], n; int gcd(int a, int b) { return b ? gcd(b, a % b) : a; } int cal() { int i, j, maxn = 0; for (i = 0; i < n - 1; +...
阅读全文
摘要:这两题都是求解同余方程,并要求出最小正整数解的 对于给定的Ax=B(mod C) 要求x的最小正整数解 首先这个式子可转化为 Ax+Cy=B,那么先用exgcd求出Ax+Cy=gcd(A,C)的解x 然后这个式子的一个特解就是 (B/gcd(A,C))* x 要注意如果gcd(A,C)无法整除B,那
阅读全文
摘要:其实思维难度不是很大,但是各种处理很麻烦,公式推导到最后就是一个bsgs算法解方程
阅读全文
摘要:参考博客 https://blog.csdn.net/clover_hxy/article/details/50683832关于欧拉定理推论的证明 https://www.cnblogs.com/aseer/p/9675610.html/* 给定A,B,C,C是质数,求出A^x=B(mod C)的解 解:A^x = A^(x % phi[C]) = B(mod C) (欧拉定理推论) x %...
阅读全文
摘要:是当y的组合数较小时,暴力枚举所有组合,然后用中国剩余定理求每种组合的解,对解进行排序即可 注意初始解可能是负数,所以如果凑不够S个,就对所有解加上M,2M。。。。 当y的组合数较大时,选择一个k/x最小的序列,枚举N=x*t+y,外层枚举t,内层枚举y,然后验证N是否是可行解 为什么要选k/x最小
阅读全文
摘要:https://blog.csdn.net/niiick/article/details/80229217 拓展中国剩余定理 注意拓展欧几里得只能解出a,b,x,y,gcd(a,b)的一组特解 模板1 模板2:拓展定理
阅读全文
摘要:/* 给定n,对于所有的对(i,j),if[x*t]+=x*phi[t] 筛出phi表 */ #include using namespace std; #define maxn 4000005 //#define ll long long bool check[maxn+10]; int phi[maxn+10],prime[maxn+10],tot; void init(){ m...
阅读全文
摘要:/* 判断一个数是否是素数,只要判断这个数有没有在[2,sqrt(n)]区间的因子 同样,对于大数短区间的筛选,同样可以用这种判断方式, 先筛出sqrt(n)范围内的素数,然后用这些素数去筛出区间内的因子 */ #include using namespace std; #define maxn 1000000 #define ll long long int v[maxn],prime[m...
阅读全文
摘要:#include using namespace std; #define maxn 300 #define ll long long ll a,b; char s[400]; inline ll calc(int i){ return s[i]-'0'; } int main(){ int T; cin>>T; for(int tt=1;tt>s>>b; ...
阅读全文
摘要:#include using namespace std; #define maxn 1000005 #define ll long long int v[maxn],prime[maxn],m; void init(int n){ memset(v,0,sizeof v); memset(prime,0,sizeof prime); m=0; for(int ...
阅读全文
摘要:/* 打不了那么大的表,所以只记录分块的信息即可 */ #include using namespace std; #define maxn 1000005 double arr[maxn]; void init(){ arr[0]=0; double tmp=0; for(int i=1;i>T; while(T--){ cin>>n; ...
阅读全文
摘要:也是用线性筛,但是v用int会爆,所以这个线性筛用的是另外一种写法
阅读全文
摘要:/* 前三位 len=log10n^k(乘积的长度) len=klog10n n^k=x*10^(len-1) x=n^k/10^(len-1) log10x = k*log10n - (len-1) x=pow(10,k*log10n - (len-1)) 后三位 快速幂解决 */ #include using namespace std; #define ll long long l...
阅读全文
摘要:/*sigma(n)的每一项都可以看成是个pi的[0,ei]等比数列求和公式,那么sigma(n)就是n所有正约数的和要求找到sigma(x)为奇数的个数1<=x<=n */ 看题解的。。
阅读全文
摘要:一定要先打表素数,然后进行分解,直接分解是会t的
阅读全文
摘要:/* 给定n个数ai,要求欧拉函数值大于ai的最小的数bi 求sum{bi} */ #include using namespace std; #define maxn 1000005 int n,a[maxn]; int phi[maxn],m,v[maxn],prime[maxn]; void init(int n){ memset(v,0,sizeof v); m=0;...
阅读全文
摘要:/* bwwwbwwbw wwbwwwbwb 不管从哪里断开翻转。翻转后的串再整体翻转一定是2s的子串 */ #include using namespace std; int len; char s[1000000]; int main(){ cin>>s+1; int len=strlen(s+1); if(len==1){ puts("1"); re...
阅读全文
摘要:/* 给定一个二行n列的格子,在里面填黑白色,要求通过黑白色将格子分为k块 请问有多少种填色方式 dp[j][k][0,1,2,3] 填到第j列,有k块,第j列的颜色, */ #include using namespace std; #define ll long long #define mod 998244353 //0全白,1黑白,2白黑,3黑黑 ll dp[1050][105...
阅读全文
摘要:/* 给定一个数组,要求和小于t的段落总数 求前缀和 dp[i]表示以第i个数为结尾的小于t的段落总数,sum[i]-sum[l] using namespace std; #define ll long long #define maxn 200005 ll tmp[maxn],n,a[maxn],t,sum[maxn],ans; ll bits[maxn]; void add(int ...
阅读全文
摘要:最近一段时间算是学了一些状态压缩的题目,在这里做个小结吧 首先是炮兵布阵类题目,这类题目一开始给定一个矩形,要求在上面放置炮兵,如果在一格放了炮兵那么周围的某些格子就不能放炮兵,求最大能放置炮兵的数量 poj1185炮兵布阵 hdu2176 炮兵布阵修改版 poj3254 炮兵布阵弱化版 poj15
阅读全文
摘要:自己的做法是枚举i,j作为顶点的矩形,然后再更新状态S,但是这种做法是错误的 正解是先把所有矩形对求出来,然后枚举状态S,每个处理每个状态时再枚举已经求出的矩形对,用旧状态更新新状态
阅读全文
摘要:#include #include using namespace std; #define maxn 300005 #define ll long long struct qnode{ ll v,c,id; qnode(){} qnode(ll v,ll c,ll id):v(v),c(c),id(id){} bool operatorr.c; } };...
阅读全文
摘要:#include using namespace std; #define maxn 200005 char s[maxn]; int tmp,n,x,y,sum[2][maxn]; mapmp; int judge(int mid){//能否在mid长度内修改完 for(int l=1;l+mid-1>n>>s+1>>x>>y; tmp=abs(x)+abs(y); ...
阅读全文
摘要:/* 两两求出字符串之间最大可以匹配的值 由已知状态推导出位置状态 状态s表示已经加入到集合中的字符串,0表示串i不存在,1存在 由于字符串的加入顺序会影响结果,所以增加一维来表示 dp[S][i]表示状态集合为S,且i是新加入S的字符串的最大值 */ #include #include #include using namespace std; char a[15][15]; int dp...
阅读全文
摘要:还不太会做这类题,总之感觉有点难啊。 用深搜代替打表求出一行所有的可行状态,注意要进行剪枝 这是自己理解的代码,但是tle了
阅读全文
摘要:这题用直接枚举是超时的,必须要用搜索来搜索出所有可能的状态,然后再进行枚举 这是较慢的做法
阅读全文
摘要:最简单的那类区间dp,昨天晚上心态不对,不知道在打什么。。
阅读全文
摘要:解法参考博客https://blog.csdn.net/u013480600/article/details/19569291 一种做法是先打出所有的状态,即满足上下配对的所有可能方案,然后再逐行进行枚举计数 dp[i][s]=sum{dp[i-1][t]},t是所有和s配对的状态 打状态时要注意如
阅读全文
摘要:/* dp[i][j]表示到第i行的状态j有多少放置方式 */ #include #include #include #include using namespace std; #define mod 100000000 int dp[15][10000],mp[15][15],cur[15],ans,n,m; vectorv; inline int legal(int x){ if...
阅读全文
摘要:/* 给定n头牛,m个谷仓,每头牛只能在一些特定的谷仓,一个谷仓只能有一头牛 问可行的安排方式 dp[i][j]表示前i头牛组成状态j的方案数,状态0表示无牛,1表示有牛 使用滚动数组即可 枚举到第i头牛时,状态j必须有i-1头牛,然后由这个状态推导出第i头牛的状态,再清0 */ #include #include using namespace std; int n,m,k,mp[25][...
阅读全文
摘要:/* dp[S]表示状态S下的最大收益,0表示没有了,1表示还在 */ #include using namespace std; int dp[1>n && n){ for(int i=1;i>mp[i][j]; memset(dp,0,sizeof dp); int ans=0; for(int S=(1=1...
阅读全文
摘要:/* 有点像扫描线 思路:从左到右枚举每个点,枚举到点i时,把所有以i为起点的区间的影响删去 再加上以i-1为结尾的区间的影响 */ #include using namespace std; #define maxn 200005 #define lson l,m,rt>1; build(lson); build(rson); pushup(rt); } void ...
阅读全文
摘要:状态压缩的好题,直接求会爆内存,先把所有可能的状态求出来存在stk里,然后f[i][k][t]表示i行状态为t,i-1状态为k,由i-1状态来推出i状态即可 注意要打好边际条件的状态,并且某个可行状态必须由前一个可行状态推出
阅读全文
摘要:自己搞的算法超时了。。但是思路没什么问题:用线段树维护每个点到叶子节点的距离即可 这是cf上的代码
阅读全文
摘要://参考博客 https://www.cnblogs.com/jsawz/p/6723221.html#include using namespace std; #define maxn 420000 struct Query{int to,nxt,lca;}q[maxn]; struct Edge{int to,nxt;}edge[maxn>n>>m>>p; for(int i=1;i...
阅读全文
摘要:/* Ci'=Ci+1 + Ci-1 -Ci Ci+1 - Ci' = Ci - Ci-1 Ci' - Ci-1 = Ci+1 - Ci; 即求一次Ci’等价于交换Ci和Ci-1 与 Ci+1和Ci的差值 那么只要差值排序后的数组是相同的即可 */ #include using namespace std; #define maxn 100005 vectorv1,v2; int a[maxn...
阅读全文
摘要:一般异或问题都可以转换成字典树的问题,,我一开始的想法有点小问题,改一下就好了 下面的代码是逆向建树的,数据量大就不行 如果是把集合中存在的元素进行建树,就不会出现字典树大小无法确定的问题,但是每次查询要改一下,即如果第i位是1,那就往字典树的0子树找,反之往1子树找,并且如果先找的子树已经满了,即
阅读全文
摘要:/*可以推测从叶子结点传送到叶子节点才能使传送次数最少,如果是偶数个叶子结点,那么传送leaf/2次就是答案,如果是奇数个叶子结点,则还有单独一条链需要覆盖dp[u]表示覆盖完u为根的子树需要走的边数,显然在满足传送次数最少的条件下,dp[u]是可以递推的 设以u为根节点,v是u的儿子,如果v就是叶
阅读全文
摘要:由于不是求最大的可拦截的HP值,而是要将最小值最大化,那么就需要分配每个子树用的钱数以达到最小值最大化 第一步解决如何分配钱使得结点u的子树中用了j元钱后可以拦截的HP最大,这就是变形的分组(依赖)背包,即枚举m元钱,在子树v用t元钱,在v之前的子树用j-t元钱 用Max[v][j]数组记录u的前v
阅读全文
摘要:之前看错题目了,以为父亲的选择时按最大收益来的。结果并不是 /*注意题目中说只要某个时间父亲可以取得红包,他就取硬币数最多同时耗时最小的那个就是不管后续如何,不一定满足最大收益 dp[i][j]表示时间i被干扰j次所得的最小收益dp[i][j]=dp[a+1][j]+b; <a,b>是时间i可取的价
阅读全文