状压dp 枚举子集的方法

状压dp有些时候需要去枚举子集,但是复杂度会很高,所以需要一种快速的方法去枚举。for(int i=s;i;i=(i-1)&s){ j=i^s;}具体可以看这篇博客:https://blog.csdn.net/yanzhenhuai/article/details/81572028
分类: 其他 发布时间: 02-26 23:23 阅读次数: 0

汇编语言 输出16进制数

依次在屏幕上输出01H, 25H, 38H, 62H, 8DH, 9AH, BAH, CEH代码:DATAS SEGMENT N DB 8 ARRY DB 01H, 25H, 38H, 62H, 8DH, 9AH, 0BAH, 0CEHDATAS ENDSSTACKS SEGMENT ;此处输入堆栈段代码STACKS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKSSTART: MOV AX,DATA
分类: 其他 发布时间: 02-26 23:22 阅读次数: 0

csust2020新生赛热身赛题解

1.a+b#include<iostream>using namespace std;int main(){ int t;cin>>t; while(t--){ int a,b; cin>>a>>b; cout<<a+b<<endl; } return 0;}2.Psycho-Pass#include <bits/stdc++.h>using na
分类: 其他 发布时间: 02-26 23:22 阅读次数: 0

csust2020新生赛题解

1.会长的数字签到题,只要找输入的数字中有无某一位数字除以2等于0。代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1e5;char s[maxn];int main(){ scanf("%s",s+1); int d=strlen(s+1),flag=0; for(int i=1;i<=d;i++){ int num=s[i
分类: 其他 发布时间: 02-26 23:22 阅读次数: 0

牛客编程巅峰赛S2第12场-共鸣问题

题解:对于一对关系(x,y,z),若全都不点,则为-z,点其中一个就是-z+z=0,两个都点就是-z+z+z=z,可以看出,我们把初始值设为-z,那么每个音符的贡献就是z,贪心的去想,如果z+a[i]>0,则说明这个音符可以点。代码:class Solution {public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * @param n int整型 * @param m int整型
分类: 其他 发布时间: 02-26 23:22 阅读次数: 0

ACM常见概率期望分布

1.两点分布即只先进行一次伯努利试验,该事件发生的概率为p,不发生的概率为1-p。这是一个最简单的分布,任何一个只有两种结果的随机现象都服从0-1分布。期望:E=p方差: D = p*(1-p)^2 + (1-p) * (0-p)^2 = p * (1-p)2.二项分布做n次伯努利实验,有k次实验成功期望:E = np方差:D = np(1-p)3.几何分布在n次伯努利实验中,第k次实验才得到第一次成功的概率分布。其中:P(k) = (1-p)^(k-1)*p期望:E=1/p方差:D
分类: 其他 发布时间: 02-26 23:21 阅读次数: 0

atcoder Educational DP Contest x-Tower

题意:有n堆物品,每堆物品都有三个值,重量w,承重s,价值v,可以将这些物品进行堆积,堆积在每个物品上方的总重量必须小于等于其承重,问堆积起来的物品的最大总价值是多少。题解:假设只有两个物品 w1,s1 / w2,s2,如果第一个物品在上面,那么还能放的重量为s2-w1,反之就是s1-w2。如果s2-w1>s1-w2,即s2+w2>s1+w1,贪心的去想,我们必定是选择还能放重量多的方案。由此可以得到结论,对s+w按照升序排序,大的选择放下面,最后就是01背包问题。代码:#inclu
分类: 其他 发布时间: 02-26 23:21 阅读次数: 0

牛客IOI周赛22-普及组 C-照看小猫

题解:主要考察容斥,组合数学。我们可以先预处理出每个长度有多少个方案。因为不能有重复的名字,我们可以先对a数组排个序,那么不难看出,第i只猫前面的i-1只猫能取的名字一定在第i只猫能取的名字里面,因此,第i只猫能取的名字的方案数要减去i-1才是它真正的方案数。最后乘起来即可。代码:#include<bits/stdc++.h>#include<cstdio>#include<iostream>#include<algorithm>#inclu.
分类: 其他 发布时间: 02-26 23:21 阅读次数: 0

codeforces gym Graph and Cycles

题目链接:https://codeforces.com/gym/102392/problem/J题意:给出一个带权的完全图,让你划分这些边,使得每个划分里的边可以构成一条回路。定义f(ex,ey)=max(ex,ey)。每个划分的权值等于f(e1,e2)+f(e2+e3)+f(e3,e4)…。现在求怎么划分使得每一组的权值之和最小。题解:因为是回路,所以对于每个点而言,必定有一条出去的边,和一条进入的边相对应,那么最优方案肯定是将第一大和第二大的相对应,第三大和第四大的相对应,以此类推。代码:#
分类: 其他 发布时间: 02-26 23:21 阅读次数: 0

Codeforces Round #691 (Div. 2) C. Row GCD

题意:给出两个数组a,b,对于b数组中的每一个数,求gcd(a[1]+b[j],a[2]+b[j],a[3]+b[j],…)。题解:这题主要考察gcd的性质,如果知道,则可以直接秒。性质如下:gcd(a[1],a[2],a[3],a[4],…)=gcd(a[1],a[2]-a[1],a[3]-a[2],a[4]-a[3],…)。那么题目所求式子就变成gcd(a[1]+b[j],a[2]-a[1],a[3]-a[2],a[4]-a[3],…)所以我们先预处理出gcd(a[2]-a[1],a[3]-
分类: 其他 发布时间: 02-26 23:20 阅读次数: 0

Codeforces Round #691 (Div. 2) D. Glass Half Spilled

题意:给出n个水杯的容量和其已经包含的水量,有如下操作,选择两个杯子,将其中一个杯子中的x容量水转移到另一个杯子,但是会洒出x/2的水。现在求,对于1-n中每一个数字k,任意选择k个杯子,其水量之和最大是多少。题解:首先,对于被选的那k个杯子,它们一定不会倒水出去,所以我们先不考虑倒水,设dp[i][j][k]表示前i个水杯,选j个,其容量为k能够得到的最大水量。那么状态转移方程就是:dp[i][j][k]=max(dp[i-1][j][k],dp[i][j][k]);//不要第i个水杯dp[i
分类: 其他 发布时间: 02-26 23:20 阅读次数: 0

Educational Codeforces Round 100 (Rated for Div. 2) B. Find The Array

题意:给出一个a数组,现在要构造一个b数组,使得b数组相邻两个元素其中一个能整除另一个,并且a数组与b数组之差的绝对值的和*2<=a数组元素之和。题解:思路一:先给出结论:小于等于x并且离x最近的2的幂次方的范围是[x/2,x]。知道这个结论,很快就能知道,只要把b[i]=离a[i]最近的2的幂次方,就一定能满足条件。结论的正确性可以用反证法来证明。思路二:我们假设b[i]<=a[i],由条件可以推出a[i]-b[i]<=a[i]/2,即2*b[i]>=a[i]。那么什
分类: 其他 发布时间: 02-26 23:20 阅读次数: 0

AtCoder Beginner Contest 190 E - Magical Ornament(图论+状压dp)

题意:给出n种宝石,有m种关系,现在要在一排放置一些宝石,只有存在关系的宝石才能相邻,并且要求必须放置c数组里的宝石,问最少要放多少宝石?题解:这题比F题难是我没想到的。。。其实将题目转化一下就是:将所给的关系建边,然后在图中找到一条最短路径使得能包含所需所有点。首先我们需要求出必须放置的点之间两两的最短路径。因为k很小,所以我们可以进行k次bfs,求出两点间的最短距离。然后就是一个状压dp的问题了。设dp[i][j]表示状态 为 i 最后到达的点为 j 的最小路径。状态 i 变为二进制,第 i
分类: 其他 发布时间: 02-26 23:20 阅读次数: 0

牛客- 华华给月月出题(素数筛+快速幂)

题目链接题意:求n<=1.3*10^7。题解:一开始还以为是个模板题,直接用快速幂去求,但是tle了。看了题解才知道,要先筛素数。因为每个数都可以表示成一些质数相乘,所以我们对于某个合数x,可以表示成 x=x的最小质因子*y。那么x^n= x的最小质因子^n * y^n。那么在素数筛的过程就我们就可以求出所有元素的n次方。这样做可以减少使用快速幂的次数,大大降低了复杂度。代码:#include<cstdio>#include<iostream>#inclu
分类: 其他 发布时间: 02-26 23:19 阅读次数: 0

2021牛客寒假算法基础集训营1 C题-红与蓝

题目:比赛的时候看这道题,把它想复杂了,以为是其他图论的算法,赛后看别人写的才知道就是深搜一下就行。o(╥﹏╥)o题解:可以发现,树的叶子节点肯定是与它的父亲节点相匹配的,所以我们深搜一遍,从底层往上去模拟匹配的过程,对于以i为根节点的子树,我们先将它的子子树匹配好,如果 与 i 相邻的儿子节点都有匹配关系,那么说明 i 节点肯定要跟它的父亲节点匹配,如果只剩 1 个点未匹配,那么就让他和 i 节点匹配,如果存在多个,那么肯定不存在解。最后我们再对根节点任意涂一种颜色,然后根据匹配关系对其他节点依
分类: 其他 发布时间: 02-26 23:19 阅读次数: 0

2021牛客寒假算法基础集训营2 D .牛牛与整除分块(打表规律)

题目:题解:这题如果直接用整除分块写会t,可惜比赛中我打了表也没看出规律。o(╥﹏╥)o可以发现,对于x<sqrt(n),答案一定是x。再可以发现,1到sqrt(n)之间的数一定会出现,那么我们算出n/x是这些数中的第几大,因为是对称的,所以可以算出另一半有多少个数,加上去就是答案。可以看这幅图理解。代码:#include<cstdio>#include<iostream>#include<algorithm>#include<cstri
分类: 其他 发布时间: 02-26 23:19 阅读次数: 0

codeforces Gym - 101147A The game of Osho(sg博弈)

题意:给出g对数字,每对由bi和ni组成,一次操作可以选择一对,然后将ni减去bi的k次幂,k为任意非负整数,无法操作者失败,问先后手谁能赢。题解:打出sg表可以发现,对于b是奇数,sg值=n%2。对于b是偶数,则存在一个长度为b+1的循环节,如果n%(b+1)==0,则sg=0,如果n%(b+1)==b,则sg=2,其余情况,都是1010交替出现,即sg=(n%(b+1))%2。附上打表代码+ac代码:#include<cstdio>#include<iostream&gt
分类: 其他 发布时间: 02-26 23:19 阅读次数: 0

牛客-蓝魔法师(树形dp)

题目题解:设dp[i][j]表示以 i 为根的子树,选j个点保持连通的方案数。那么可以列出转移方程:for(int j=min(num[u],k);j>=1;j--)//枚举之前选了多少个点 for(int z=min(k,num[v]);z>=1;z--)//枚举当前子节点选了多少个点 dp[u][j+z]=dp[u][j+z]+dp[u][j]*dp[v][z];转移过程类似于背包,而且必须是从大枚举到小。还要注意的是,子节点这个子树也可能不选,那么状
分类: 其他 发布时间: 02-26 23:18 阅读次数: 0

牛客-旅游(树形dp)

题目链接题目:题解:这题其实是一个最大独立集的问题。先解释啥什么是最大独立集:一个点集,集合里面的点之间没有公共边,即每两个点之间没有边将他们连接起来,且集合中的点的数量最大。然后再来看这题,可以用dp来解决此问题,设dp[i][1]表示 点i在点集里,dp[i][0]表示 点 i 不在点集里。那么状态转移很容易可以写出来:dp[u][1]+=dp[v][0];dp[u][0]+=max(dp[v][1],dp[v][0]);#include<cstdio>#include&l
分类: 其他 发布时间: 02-26 23:18 阅读次数: 0

2021牛客寒假算法基础集训营3 E-买礼物

题目链接题目题解:出题人题解写的挺好的,拿来用一用。代码:#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#include<queue>#include<map>#include<stack>#include<set>#define iss ios:
分类: 其他 发布时间: 02-26 23:18 阅读次数: 0