摘要:一个点的改变如果对根节点的值不会造成任何影响,那么这个点的所有子节点的改变也不会对根节点造成影响 因为每次只改一个叶子节点,也就是一条到根的路径,可以先预处理出初始情况下的每个结点的值 分别讨论根节点是and,or,xor,not时,1|2 个结点取值 的 各种情况(也就那么几种) 比如x是and,
阅读全文
摘要:/* 模拟二分图:每个点作为一条边,连接的是一列和一行(抽象成一个点,列在左,行在右) 由题意得 a-b相连,a-c相连,b-d相连,那么d-c就不用再相连了 等价于把二分图变成联通的需要再加多少边 用并查集可以解决 */ #include using namespace std; #define maxn 400005 int F[maxn],n,m,q; int find(int x){ ...
阅读全文
摘要:double 在1e17以后就不能顾及小数,所以用一下加精度的技巧 sqrt(r*r-d*d)=sqrt(r+d)*sqrt(r-d) 遇到误差在几位以内的注意要修改二分的精度,用最大的数据去乘以精度即可
阅读全文
摘要:只要算每条路径的贡献即可 显然长度为偶数的贡献是len/2 长度为奇数的贡献是(len+1)/2 所以结果就是(sum+tot)/2 sum:路径总长 tot:奇数路径数量 怎么求奇数路径数量:只有深度为奇数+深度为偶数的点才能组成奇数路径,求一下深度即可
阅读全文
摘要:注意最后一轮要单独求一下 且最后只能有一个root
阅读全文
摘要:dp的状态转移很像一张有向图:每个状态为一个点,每中转移方案是一条有向边 本题要求是求出最小的数,那我们用状态[i,j]表示模i,数位和为j,那么从每个点出发的十条有向边代表[0,9]十个数 从每个状态点进行bfs,由于队首的点必定是当前最小的(因为bfs的顺序),所以可以保证最后求出的是最小的数
阅读全文
摘要:/* 只要找到两个没有关系的点即可 */ #include using namespace std; #define maxn 100005 long long n,m; int a[maxn],b[maxn]; vectorG[maxn]; int main(){ cin>>n>>m; if(n==1){ puts("NO"); return ...
阅读全文
摘要:直接用kuangbin的板子,能判不规范,规范和不交 另外线段在矩形内也可以,判断方式是比较线段的端点和矩形四个角
阅读全文
摘要:枚举每个端点,然后i点j点连线作为一条路径,逐一判断这条路径是否可行即可 注意的地方:判一条线段是否可行,需要判其余线段是否和其相交,但是这个相交比较难判(因为会不规范相交),所以将问题转化为墙以外的线是否和其相交,所有墙以外的线都要和其相交!
阅读全文
摘要:求直线交点还是要推一个公式的。。 见博客https://blog.csdn.net/u013050857/article/details/40923789 还要学一下向量的定点比分法 另外poj精度好像卡的厉害,zoj1280就没啥问题
阅读全文
摘要:#include #include #include #include #include using namespace std; const double esp = 1e-8; const double inf = 1e20; const double pi = acos(-1.0); const int maxp = 1010; int sgn(double x){ if(fa...
阅读全文
摘要:#include #include #include #include #include using namespace std; const double esp = 1e-8; const double inf = 1e20; const double pi = acos(-1.0); const int maxp = 1010; int sgn(double x){ if(fa...
阅读全文
摘要:https://blog.csdn.net/a302549450/article/details/80948741?tdsourcetag=s_pctim_aiomsg 上面是题解的链接。。, 其实和kmp算法差不多,但是匹配的过程多了一些情况,还是挺有思维性的
阅读全文
摘要:第一例很简单,把两个差为偶数的列不断合并即可 这种不需要撤销的合并相连数直接用栈来做 第二例:只能横填 那么只要从最低的开始往上填,即不断将偶数个低列和其周围的列合并 用单调栈完美解决!
阅读全文
摘要:被傻逼题降智了。。 就是第一次dfs 时 求一次size,一次deep数组 然后第二次dfs时直接求最大值 先把结点1的值求出来, u->v过程中,v子树的所有结点深度-1,v外的所有结点深度+1,这个过程等价于 u的值-size[v]+size[1]-size[v] 所以第二次dfs时把父亲的值传
阅读全文
摘要:和去年多校的CSGO一样,用状态压缩来求Manhattan距离的最大值 然后要用线段树维护一下区间最大值
阅读全文
摘要:开始看错求最短路了。。 但是MST的思路和最短路也差不多 就是先不考虑特殊边,用最小点做一个生成树 然后加入特殊边,进行一次krus即可
阅读全文
摘要:正解应该是求后缀和前缀 但是多情况讨论好像也能过。。 大概分为: 首先排除不能改的情况 1.改左括号 2.改右括号
阅读全文
摘要:dp[i][j]表示到第i位,与hard的匹配状态到达了第j位 每位有两种决策:消或者不消 分别转移一下即可 转移代码
阅读全文
摘要:/* 因为质因子很少 状态转移时用dp[u][i]表示结点u的第i个质因子所在的最大深度即可 等价于带限制的求直径 */ #include #include using namespace std; #define maxn 200005 int n,a[maxn],ans; vectorG[maxn],p[maxn],dp[maxn]; void dfs(int u,int pre){ ...
阅读全文
摘要:/* 先判不可行的情况:n/2的是单一字符 判只切割一次能不能组成回文 枚举每个切割点,交换两个串的位置 剩下就是割两次 */ #include #include using namespace std; #define maxn 5005 char s[maxn]; int n; int judge(int pos){ vectorv; v.clear(); ...
阅读全文
摘要:先确定上界 然后用查询随机位置的数,求gcd作为公差即可
阅读全文
摘要:真的是很好的题 要通过左端点 l 和中间点k进行比较(去找和l同色的k即可) 然后n3来转移 然后是记忆化写法
阅读全文
摘要:超级恶心的题,写了好久,直接倒序模拟做,但是网上有博客好像是直接正序dp做的。。 因为左端点和右端点是永远不会变的,然后情况要考虑全
阅读全文
摘要:以前做过了忘记掉了。。拓扑排序如果要处理等于关系,就要用并查集把相等关系进行缩点
阅读全文
摘要:#include using namespace std; #define ll long long ll ans[100],a,b,m; /* b=2^(n-2)a + 2^(n-3)r2 + 2^(n-4)r3 + ... + rn-1 + rn 可以推出这么个公式,然后枚举n(2-50)即可 从r2开始贪心求最大的r2,然后后面的ri都可以依次确定下来*/ int solve(l...
阅读全文
摘要:进阶指南的板子好像有点问题。。交到hdu上会T 需要了解的一些概念: 交错树,顶标,修改量
阅读全文
摘要:好像多重匹配一般是用网络流来做的。。 这是匈牙利算法的模板:lim是每个组的上界 思路是每个组都可以匹配lim个点,那么当点x遇到的组匹配的点数还没有超过lim时,直接匹配即可 如果已经等于了lim,这时就要从这个组的lim个点里找到一个能匹配到其他组的点(类似于普通匹配的寻找增广路过程) 完整代码
阅读全文
摘要:a-容斥原理(带限制的不定方程) #include<bits/stdc++.h> using namespace std; #define mod 998244353 #define ll long long #define maxn 500005 ll n,m,k; ll inv[maxn],f[
阅读全文
摘要:A-暴力模拟 #include <bits/stdc++.h> using namespace std; typedef long long ll; string day[]={"Monday","Tuesday","Wednesday","Thursday","Friday"}; int t; l
阅读全文
摘要:关于本题二分图的匹配关系始终是加单向边用左边去匹配右边,match表示的是右边的人匹配的对应的左边的点
阅读全文
摘要:/* 怎么建图: 首先分集合:不能相连的点必然在一个集合里,即对角点 再确定怎么连边: 一个点可以向上下左右连边,如果遇到了洞则不行 dfs(i),让匹配到的点接受i作为match结果 寻找增广路时,要让v接受i,那么v原来接受的点match[v]就要重新找一个点进行匹配 */ #include #include #include using namespace std; #define...
阅读全文
摘要:一篇讲的详细的博客 https://blog.csdn.net/Hawo11/article/details/74908233 缩点后为什么要建立反图? 如果是按原图处理,选择一个点之后要把所有其后续点也选上,但是如果染色过程中失败,则这次染色的影响要被清空,并选上对立点 这样的复杂度会和暴力dfs
阅读全文
摘要:因为要求输出字典序最小的解,所以用暴力染色 具体有点像二分图染色 遍历0-2*n-1个点,尝试将每个点染成1,该点所能到达的所有点都要染成1 如果不行,则把上该点的影响消除,再把对立点染成1,如果还不行就无解
阅读全文
摘要:想了很久没弄明白,对于边界的情况还是有问题 等题解出了再看看 然后枚举每个后缀r,找到比它小,并且在其左边的前缀l,那么删<=l,r-1的都可以 最后的二分很迷:要多考虑特殊情况:前缀跑到后缀后面去了,那么在后缀后面加一个x+1,保证前缀必定在后缀前面
阅读全文
摘要:对于怎么建边还是不太清楚 选了a,那么b c不选,所以连边 选了b或c,那么a必定不选
阅读全文
摘要:hdu就是会卡cin,, 另一种建模方式,把点i拆成i*2,i*2+1,有时候这样会比较简单
阅读全文
摘要:比较经典的建图,详见进阶指南 2-sat一般要用到tarjan来求强连通分量
阅读全文
摘要:关于SG函数的博弈 首先定义必败态 x : SG[x]=0 设任意一个状态y,到所有y能到达的状态连一条边,令这些后继为z y : SG[y]=mex(SG[z]) SG[y]==0 : y就是必败态 SG[y]!=0 : y就是必胜态 所以博弈时把状态转换成有向图即可 那么n个有向图的情况 SG=
阅读全文
摘要:将m质因子分解,然后枚举选取的质因子个数i进行容斥,每种情况进行一次dfs即可 dfs结束标记:当质因子个数达到i时退出递归,同时累加该解对应的方案数
阅读全文
摘要:zoj2836就是裸的求lcm进行容斥,用dfs比较直观 zoj3233增加了一个集合b,lcm(b)的倍数是不符合条件的 那么在zoj2836的基础上,把lcm(x,lcm(b))造成的影响减去即可 用状态压缩来枚举集合状况
阅读全文
摘要:/* 遇到这种题一般用dfs,枚举起点来做 但是本题如何进行容斥? 比如以x为起点,第一步dfs到y,那么因子有lcm(x,y)的 所有数要被减掉(容斥中偶数是减法) 然后第二步dfs到z,那么因子有lcm(x,y,z)的所有数要加上(容斥) */ #include using namespace std; #define ll long long #define INF 1>n>>m){...
阅读全文
摘要:和hdu2204有点像 这题要特别注意精度问题,如pow的精度需要自己搞一下,然后最大的longlong可以设为1<<31
阅读全文
摘要:/* 枚举素数幂p 然后求k^p60,所以最多容斥两次就可以 枚举pi最为起点进行深搜,只搜比pi大的 */ #include using namespace std; #define ll long long int p[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59}; ll ans,n; //素数下标pos,当前幂e,容斥标记(质数...
阅读全文
摘要:邮票手机问题: 有n种类型的邮票,问将所有的类型的邮票全部收集起来所要的收集次数期望是多少。 设dp[i]为已经收集了i种类型的票,还要收集n-i种的次数的期望。 dp[n]=0; 递推式: dp[i]=dp[i+1]∗(n−i)/n+dp[i]∗i/n+1dp[i]=dp[i+1]∗(n−i)/n
阅读全文
摘要:主要是要想到边与边的通过概率是独立的,所以先求出最终的概率,然后用推出的公式求总期望即可 最终概率E[0][n-1],可以用传递闭包来做 裂项相消法都不会了。。
阅读全文
摘要:感觉是很经典的题 记忆化时因为不好直接通过E判断某个状态是否已经求过,所以再加一个vis打标记即可
阅读全文
摘要:/* 每个异或前缀和sum[i]只有两个值 区间异或和不为0,即两个不相等的前缀和 sum[i]的两个前缀和只要标记一个就可以了,为了去重只用map保存最小的那个来计数 最后统计相同的前缀和时,为了使相同的最小,每个map的值要平分 */ #include using namespace std; #define ll long long #define maxn 200005 mapmp;...
阅读全文
摘要:被一道数论题卡了半天 网上的题解说只要匹配l或者r就行,想了下还真是。。 能让r1和r2对其就让他们对其,不能对其就讨论一下两种情况就可以了
阅读全文
摘要:典型的字符串哈希题 字符串hash[i]:子串s[1-i]代表的值 要截取串s[l-r] 求hash[r]-hash[l-1]*F[len]即可
阅读全文
摘要:这题帮我复习了一下BST的中序遍历。。 因为给定的数组是递增的,那么BST的中序遍历一定是1 2 3 4 5 6 7 8 9 ... n 即[l,r]为左子树,那么根节点就是r+1,反之根节点就是l-1 那么我们只要枚举每个区间[l,r],再枚举[l,r]的根k,然后看l-1,r+1是否可以作为k的
阅读全文
摘要:非常思维的一道题目,题意很长 给定s1,s2两个集合,s1维护最大值,s2维护最小值,s1的所有元素要比s2小 操作1:往两个集合里的任意一个添加x 操作2:把x从所在的集合里删掉:要求被删的x必须是s1里最大的元素或s2里最小的元素 因为操作2的要求十分严格。。我们可以想到在最后一次操作2结束前所
阅读全文
摘要:只写了和dp有关的。。博客 https://www.cnblogs.com/huyufeifei/p/10351068.html 关于状态的继承和转移 这题的状态转移要分开两步来做: 1.继承之前状态的合法构造数量 2.构造出该状态下特有的新构造数量 这类dp尽量由已知状态推出未知态(加法转移)来做
阅读全文
摘要:用map是卡着过去的。。题解用vector+离散化后常数小了十倍。。 总之就是把所有模数给保存下来然后离散化,再去匹配一下即可,最后有个细节 自己的 题解的
阅读全文
摘要:题解给出的是带log的,,我自己写了个on的。。
阅读全文
摘要:/* dp[i][j]表示到[i,j]的权值 cnt[i,j]表示到[i,j]还可以使用的修改的次数 cnt[i,j]=max(cnt[i-1,j],cnt[i,j-1]) 如果mp[i,j]!='a',cnt[i,j]--,没得减就赋值dp[i,j],最后找到最小的dp[i,j]输出 */ #include using namespace std; #define maxn 2005 #d...
阅读全文
摘要:升维来保存第i位按j是否可行,然后枚举i-1个的状态,用5*5n就可以完成递推
阅读全文
摘要:首先是模板题三连 hdu1695——求gcd(x,y)=k的对数(注意去重) bzoj2301——求gcd(x,y)=k的对数(不用去重,在上题的基础上加了一个容斥,并且用整除分块加速求和) bzoj2818——求gcd(x,y)=p的对数(p是质数,线性筛时求公式推导出来的前缀和(也可以直接转化成
阅读全文
摘要:直接筛质数肯定是不行的 用map<ll,ll>来保存质因子的指数 考虑只有3-5个因子的数的组成情况 必定是a=pq or a=p*p or a=p*p*p or a=p*p*p*p 先用二分判后面三种情况 然后判第一种情况 由于不知道pq,而且无法直接求,我们间接用 d=gcd(a[i],a[j]
阅读全文
摘要:看了题解又调了很久,用set来维护当前满足条件的pair<degree[v],v> 离线操作,先建好一张图,然后建立好集合,每次删边后都把集合里不满足条件的点删去,同时更新集合 /* 离线操作 */ #include<bits/stdc++.h> #include<vector> using nam
阅读全文