摘要:
由于是排列,因此b一定只出现了一次,找到出现的位置并向左右扩展考虑如何判定是否满足条件,当且仅当$[左边比b小的数ls]+[右边比b小的数rs]=[左边比b大的数lb]+[右边比b大的数rb]$,暴力枚举+线段树复杂度为$o(n^2logn)$变形上式,得到$ls-lb=rb-rs$,对两边分别处理 阅读全文
摘要:
一道有趣的建图题,新建一个初始存在水的点,那么造井相当于向其连边,费用就是造井的费用,之后求最小生成树即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 struct ji{ 4 int x,y,z; 5 bool operator < (co 阅读全文
摘要:
首先有一个东西叫做括号序列,即每一个点入栈加左括号,出栈加右括号容易证明,括号序列中A到B的距离是A到B中消去所有成对出现后剩余括号的数量用线段树来维护,考虑某个区间中两点的距离最大值,分为两种情况:1.点对在左区间/右区间;2.跨过区间的中点前者很好处理,来分析一下后者:容易发现消去成对的括号后剩 阅读全文
摘要:
移动可以理解为空白格的移动,问题等价于双方在一张无向图(相邻不同色点连边,起点视为黑色)移动,不能经过重复的点,无法移动者为负由于这张图是二分图,因此有结论,先手必胜当且仅当起点一定在任意一组最大匹配中证明:必要性,即先手必胜=>一定在匹配中,其等价于不在匹配中=>后手必胜,考虑一组最大匹配,容易发 阅读全文
摘要:
bzoj1068的简化版本,用f[i][j]表示表示区间i到j的最少字符数量,分为两种情况:1.某个子串重叠,枚举这个子串(注意:二位数长度为2);2.枚举断点 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define mod 998244 阅读全文
摘要:
设f[i]表示深度不超过i的方案数,那么有f[0]=1,$f[i]=f[i-1]^{n}+1$,然后用高精度即可(注意深度恰好为d还要用f[d]-f[d-1]才是答案) 1 #include<bits/stdc++.h> 2 using namespace std; 3 struct ji{ 4 i 阅读全文
摘要:
手动模拟一组样例,可以理解大致应该如何操作具体实现中,记录每一位当前应该+1还是-1,然后操作最低的位并将后面的+1和-1全部取反即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,b,a[105],flag[105]; 4 voi 阅读全文
摘要:
将每一个重置为0的点作为一段,那么它会导致后面为以x x为开头的斐波拿起数列的东西,那么设这一段是以x为开头,要快速转移到下一段,就可以解决这道题目为了转移,我们要处理出下面的东西:1.求出x关于模k的逆元,也就是找到这个0原来的值,那么x*上一个数就是下一段的开头;2.通过这个值反推出这一段的长度 阅读全文
摘要:
对于每一行,用一个2^12个01来表示,其中这一行就是其中所有为1的点所代表的行(i二进制中包含的行)的max的min,然后就可以支持取max和min了,查询只需要枚举答案即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 阅读全文
摘要:
记一条链两端的lca为该链的lca,f[i]表示所有lca在i子树内的链的最大价值和(为方便递推,假设存在i-i的链价值为0),有递推式$f[i]=max(\sum_{son}f[son]+val)$(其中son是链上所有点的儿子且不再链上的节点,val表示该链的价值),时间复杂度为$o(n^{2} 阅读全文
摘要:
先考虑如何求出任意两数的最大差值和最小差值,直接差分约束建图跑floyd求最短路和最长路即可然后枚举i和j,考虑dA+dB和di+dj的关系,分两种情况移项,转化成dA-di和dj-dB的关系或dA-dj和di-dB的关系(只要有一个关系确定即确定)即可考虑(由于不等式都是两个变量,因此一定无法形成 阅读全文
摘要:
用f[i][j]表示到第i轮,之前取过的状态为j时之后的期望收益,枚举第i轮出现的物品,并判断能否取来转移,最终再将f[i][j]/=n即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,x,a[105],b[105]; 4 d 阅读全文
摘要:
容易发现从当前状态到目标最少要跳不同的位置数-1,然后以此为估价函数IDA*(444ms,即先枚举答案再A*)或A*(664ms)即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 int t,x,y,ans,dx[8]={-2,-2,-1,- 阅读全文
摘要:
先二分答案,然后搜索暴力判断由于数据范围较大,需要剪枝:1.当前所有可能被用到的木板长度和(长度要不小于最小所需长度)>=所要拼成的所有木板的和;2.对于需求从大到小枚举木板(这样一开始枚举次数较少,后来的情况容易被剪枝掉) 1 #include<bits/stdc++.h> 2 using nam 阅读全文
摘要:
用f[i][j][k]表示第一行前i个数,第二行前j个数选k个子矩形的答案,考虑转移:1.在第一行/第二行选择一个矩形2.当i=j时,可以选择一个两行的矩形注意要特判m=1的情况 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,t 阅读全文
摘要:
考虑用状压dp枚举排列,即f[i][j]表示当前状态为i,余数为j的方案数,考虑在末尾新增一个字符来转移即可,注意最后答案要除以排列组合 1 #include<bits/stdc++.h> 2 using namespace std; 3 int t,d,n,tot[15],f[2005][1005 阅读全文
摘要:
题目即要求$Ah+Bv<=C+Aminh+Bminv$,如果同时枚举minh和minv,那么即要求$minh\le h$,$minv\le v$且$s\le C+Aminh+Bminv$从小到大枚举minh,然后答案可以理解为所有s合法-v合法且s合法,对于两个在枚举minv的时候预处理即可 1 # 阅读全文
摘要:
用f[i][j][0/1]表示区间[i,j],i之前有没有M的最少需要多少个字符,然后分两种情况:1.可以分为两个,转移到dp[l][mid][0]+1;2.枚举断点,但当前面有M时,后面的这个不能重复,因此只能写成r-k 1 #include<bits/stdc++.h> 2 using name 阅读全文
摘要:
对于同一行或同一列的点,不论如何交换都在同一行或同一列,而最终这n个点行和列各不相同,因此即要找到n个点,使得行和列不同然后对于每一个1,将所在行和所在列连边,二分图能完全匹配那么就说明存在这种方案 1 #include<bits/stdc++.h> 2 using namespace std; 3 阅读全文
摘要:
先二分答案,容易发现一定有一个正方形覆盖在角上(即有两条边在最X的地方),否则4个最X的点一定无法覆盖,然后暴力确定即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 struct ji{ 4 int x,y; 5 bool operator 阅读全文
摘要:
用线段树维护区间中最大的一段连续的1,以左端点为左端点最大的一段连续的1,以右端点为右端点最大的一段连续的1,然后就可以支持区间修改和查询了 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 50005 4 #define L 阅读全文