摘要:枚举每种灯管,然后找到代价最小的那种灯管 贪心策略:灯管从0开始向右放置,如果末尾是不能放置灯管的结点,那么要往回找到最近一个可以放置灯管的结点,在那里放置灯管 所以先预处理每个不能放置灯管的结点对应的最近的可以放置灯管的结点,即要能够自动往前找下标
阅读全文
摘要:/* 如果有某一位,那么这一位必须存在 枚举所有情况,计算每种情况时0额外另算 */ #include using namespace std; #define ll long long ll ans,n,cnt[11],F[20],a[11]; ll calc(){ ll res=1,len=0; for(int i=1;i>n; while(n){ ...
阅读全文
摘要:网上的题解直接用随机过的, 自己用模拟就模拟三个向量的和并就模拟不出来。。 以后再回头看看
阅读全文
摘要:首先要求出三种等价情况 5×1+1×50=1×5+5×105×1+1×50=1×5+5×10 9×5=5×1+4×10 8×5+1×50=9×10 那么可以求出三种关于x5,x10的不可行条件 x5 ≥ 1 且 x10 ≥ 5 x5 ≥ 9 x10 ≥ 9 那么只要依次枚举这x5,x10的可能的取值
阅读全文
摘要:考虑每种c都是可以独立进行计算的,所以这题的答案等价于每种c的最优解之和 计算每种c的最优解:把问题转化成求出每种c的最大值,再转化成i个人分j张卡片的最大收益 dp[i,j]表示i个人分j张卡片的最大收益,由于h对于每种状态都是确定的,所以我们只要进行一次打表O(n*k*n*k),这个dp打表类似
阅读全文
摘要:问题转换成缩点求度数为0的点的个数,s点所在联通块作额外处理 缩点写的很烂调了一早上。。
阅读全文
摘要:很思维的题,b的1个数和c的1个数相差为偶数时,必定有偶数个不同 反之必定有奇数个不同
阅读全文
摘要:绝对是很好的题 把问题转化成当第i个询问的答案是数值x时是否可行 要判断值x是否可行,只要再将问题转化成a数组里>=x的值数量是否严格大于b数组里的>=x的值 那么线段树叶子结点维护对于值x的a数组里的合法数数量-b数组里的合法数数量,如果是正数即这个值可行 线段树维护区间最大值,然后询问最靠右的非
阅读全文
摘要:暴力求长度为len时,以i,j为左上角的旗子的数量 不剪枝的话复杂度是n*n*m*n,必定超时 两个可以剪枝的地方:如果格子[i,j]可以作为长度为len的旗子的左上角,那么其必定不可以作为长度>len的旗子的左上角 同理,如果格子[i,j]为左上角不可以组成长度为len的旗子,并且是因为len行内
阅读全文
摘要:依次求每一段公里的期望消耗即可,这是可以递推的 dp[i]表示每公里的期望消耗 dp[i]=1/2*a1+1/4*a2 +...+1/2^(i-1)*ai-1 + 1/2^(i-1)*ai注意最后一项是没有间断的道路的期望虽然是算期望,但是实际上是算概率概率从1到n递推即可
阅读全文
摘要:给定n个数,求i的位置的期望 那么反向考虑,j!=i排在i前面的概率是0.5,那么对i的位置的期望贡献就是1*0.5 这题就是拓展应用一下
阅读全文
摘要:非常好的题!期望+建矩阵是简单的,但是直接套高斯消元会T 所以消元时要按照矩阵的形态 进行优化
阅读全文
摘要:高斯消元又弄了半天。。 注意只要能建立矩阵,那就必定有解,所以高斯消元里可以直接return 1
阅读全文
摘要:比较经典的题,题解看网上的。。https://www.cnblogs.com/GXZlegend/p/7054536.html 自己sort弄错了。。还以为是高斯消元写歪了。。
阅读全文
摘要:/* dp[i]表示力量为i时的期望 dp[i]=sum{tj}/n+sum{dp[i+cj]+1}/n //前一项是cj=i的和 初始状态dp[m] */ #include using namespace std; const double C = ((double)1+sqrt(5))/2; const double esp = 1e-8; const int maxn = 3e4+5;...
阅读全文
摘要:难的地方在于计数dp。。给定范围[1,n]的数去填m个位置,要求不能出现超过I个相同的数, 那就用dp[i][j]表示在阶段i,已经填了j个位置的可能解法,那么只要枚举i填的位置数k∈[0,min(j,I-1)]进行状态转移即可
阅读全文
摘要:求概率应该dp数组应该顺着求 这是由初始状态来决定递推方向的
阅读全文
摘要:很水的题,但要注意的是必须处理分母为0的情况
阅读全文
摘要:在推导期望方程时我们常常会遇到dp[i]和其他项有关联,那么这时候我们就难以按某个顺序进行递推 即难以通过已经确定的项来求出新的项 即未知数的相互关系是循环的 但是我们又可以确定和dp[i]相关联的项是有规律的,即存在一个可以递推dp[i]的通项公式,那么不妨设置未知数,通过原方程的迭代来打破这种循
阅读全文
摘要:迭代是化简公式的常用技巧 dp[i][j]表示队伍中有i人,tomato排在第j位出现情况2的概率,那么先推出公式再进行简化 dp[i][1]=p21*dp[i][i] + p41 j<=k : dp[i][j]=p21*dp[i][j-1] + p31*dp[i-1][j-1] +p41 j>k
阅读全文
摘要:还是逆推,如果遇到跳板直接继承目标地的期望即可
阅读全文
摘要:首先要推出dp[i]的期望方程,会发现每一项都和dp[0]相关, 那我们将dp[i]设为和dp[0]有关的式子dp[i]=a[i]*dp[0]+b[i],然后再回代到原来的期望方程里 然后进行整理,可以发现两个系数a[i],b[i]是可以逆推的,并且通过求出a[0],b[0]可以求出dp[0]
阅读全文
摘要:有个结论是到最后肯定出现循环节。。感觉这种做法有点歪 正解当然是题解啦 虽然到了1e8,但是cf上还是能过的
阅读全文
摘要:/* 已知递推数列 F[i]=a*F[i-1]+b (%c) 解方程F[x]=t an+1 = b*an + c an+1 + c/(b-1) = b(an + c/(b-1)) an+1 + c/(b-1) = b^(n-1) * (a1+c/(b-1)) 根据这个数列可得 F[x] = (F[1] + b/(a-1))*a^(x-1) - b/(a-1) = t; (F[1] + ...
阅读全文
摘要:广义欧拉降幂对于狭义欧拉降幂任然适用 https://blog.csdn.net/qq_37632935/article/details/81264965?tdsourcetag=s_pctim_aiomsg bzoj388 #include<bits/stdc++.h> using namespa
阅读全文
摘要:代码不知道上了多少补丁。。终于过了 用类似拓扑排序的办法收缩整棵树得到x,然后找到x直连的最远的和最近的点 只有这三个点可能是根,依次判一下即可 另外题解的第一种方法时找直径,然后判两端点+重心+所有直连重心的叶子节点,感觉这样子复杂度爆炸啊。。(如果是遍历所有叶子节点的话)
阅读全文
摘要:题意理解了就很好做 题意:给一张无向图,任意取两个点s,t,s->t的路径上必经边数量为k 求这样的s,t,使得k最大
阅读全文
摘要:#include using namespace std; #define maxn 100005 #define inf 0x3f3f3f3f struct Edge{int to,nxt,w;}e[maxnq; q.push(s);d[s]=1; while(q.size()){ int x=q.front();q.pop(); fo...
阅读全文
摘要:#include #include #include #include using namespace std; #define maxn 100005 #define inf 0x3f3f3f3f struct Edge{int to,nxt,w;}e[maxnq; q.push(s);d[s]=1; while(q.size()){ int x=q....
阅读全文
摘要:/* 因为牛的容量为1,把牛拆点 按照s->f->cow->cow->d->t建图 */ #include #include #include #include using namespace std; #define inf 0x3f3f3f3f #define maxn 10005 struct Edge{int to,nxt,c;}e[maxnq; while(q.size(...
阅读全文
摘要:一开始将数列设置为0 1 2 3 4 5 6.。。 然后从左到右遍历,每位不够就增加即可
阅读全文
摘要:网络流的题好难。。感觉有点遭不住了 这题用矩阵存图,然后把k个物品,每个物品都求一次费用流
阅读全文
摘要:自己写的代码怎么都调不出来。。先放网上的记一下
阅读全文
摘要:/* 带权二分图匹配 用费用流求,增加源点s 和 汇点t */ #include using namespace std; #define maxn 10005 #define maxm 200005 struct Edge{int to,nxt,w,c;}e[maxm >M,H; void add(int u,int v,int w,int c){ e[tot].to=v;e[tot...
阅读全文
摘要:int d[maxn]; bool bfs(){//在残量网络上构造分层图 memset(d,0,sizeof d); queueq; while(q.size())q.pop(); q.push(s);d[s]=1; while(q.size()){ int x=q.front();q.pop(); ...
阅读全文
摘要:思想就是把时间段离散化,然后用个点来表示一段时间
阅读全文
摘要:一种很普遍的做法就是把一个带有容量的点拆成两个点,一个入点一个出点,链接两个点的边的权值为这个点的容量 hdu3732 #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<vector> #i
阅读全文
摘要:一种很普遍的做法就是把一个带有容量的点拆成两个点,一个入点一个出点,链接两个点的边的权值为这个点的容量 hdu3732 #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<vector> #i
阅读全文
摘要:很简单的任务调度模板题 把一个工作完成一天的量当做是边
阅读全文
摘要:#include using namespace std; #define maxn 1005 #define ll long long const ll inf = 0x3f3f3f3f3f3f3f3f; struct Edge{ll to,nxt,w;}e[maxnq; while(q.size())q.pop(); q.push(1);d[1]=1; ...
阅读全文
摘要:直接推公式没有推出来 看了题解才会做。。 首先能够确定前面几个数的gcd一定是2^j * 3^k, 其中k<=1 那么可以用dp[i][j][k]来表示到第i位的gcd是2^j*3^k f(j,k) 为 n / 2^j / 3^k 那么状态转移有 dp[i+1][j][k]=dp[i][j][k]*
阅读全文
摘要:自己不会做,看了题解懂得 从最高位依次往低位遍历,因为偶数个1是不改变符号的,所以带个贪心即可(可以看成是带撤销的。。) 每轮循环用sum记录该位选择1可以减少的值 如果是负数,就不要改成1 如果是正,就改成1,然后增加一次改成1的影响 怎么增加影响:如果一个数的i位改成1,等价于其在最终减少的值
阅读全文
摘要:C——筛法 D——异或前缀和+bitmask,好题 E——待补
阅读全文
摘要:c——贪心构造题 /* 1 [n/2+1,n] 2 [n/2+2,n] ... n/2 [n,n] n/2+1 [1,1] n/2+2 [1,2] ... n [1,n/2] ai要换到位置ai上,用1,n作为跳板 从2开始,把值为i的移动到位置i上 */ #include<bits/stdc++.
阅读全文
摘要:/*首先要把原始化简成 k/phi[k] 的格式,然后把有关k的sigma提出来,后面就是求gcd(i,j)==k的莫比乌斯反演这里要用整除分块加下速*/#include using namespace std; #define ll long long #define maxn 2000005 ll n,m,mod; bool vis[maxn+10]; int prime[maxn+10...
阅读全文
摘要:用队列维护,对于每块颜色相同的相连的边进行dfs并记录即可 注意这题要用vis来标记边,不可以标记点 因为点的深度是可以随时更新的(这样的做法不满足贪心条件)
阅读全文