摘要:题意 两个01串s和t,s中字符能相互交换,问最多能得到多少个(可交叉)的t 题解 即将s中的01塞进t中,预处理出next(tlen),然后每次填完移到next(tlen)继续填即可 代码 c++ include using namespace std; int sl,pl,i,j,a,b,e,f
阅读全文
摘要:题意 有n个城市,m辆卡车,每辆卡车有起点$s_i$,终点$f_i$,每公里油耗$c_i$,可加油次数$r_i$,每辆卡车的油箱大小一样,每次加油都会加满,在城市之间不能加油,问最小油箱大小能满足每辆卡车顺利到达终点 题解 n define ll long long define MAXN 5000
阅读全文
摘要:题意 一颗n个点的树,找出一条gcd 1的最长链,输出长度 题解 容易想到从自底向长转移 因为只需要gcd 1即可,所以定义$dp[u][i]$为u的子树中和u相连的gcd含有i的最长链长度,i为素因子 这样对于每个点u,维护$dp[u][i]$,用两条最长子链和u构成的链更新答案即可 代码 c++
阅读全文
摘要:题意 数列公式为$f_i=(f^{b_1}_{i 1} f^{b_2}_{i 2} ... f^{b_k}_{i k})$mod$P$,给出$f_{1}...f_{k 1}$和$f_{n}$,求$f_{k}$,其中$P$等于998244353 题解 3是998244353的离散对数,所以$f^{b_
阅读全文
摘要:题意 一个有n个数字的数组a[],将区间分成尽可能多段,使得段之间的相互组合异或和不等于零 题解 根据线性基的定义(线性无关),任意线性基组成的集合的异或和都不会等于0,因为假如等于零,说明一定存在一个基能被其他基异或表示 依次将数组a插入线性基中,最后非0线性基的数量就是答案 代码 c++ inc
阅读全文
摘要:题意 一个有n个数组c[],q次询问,每次询问一个区间的子集最大异或和 题解 单问区间子集最大异或和,线性基能处理,但是这次多次询问,假如每次重新建立基向量会超时 考虑区间的优先级,假如我只插入不删除的话,区间的优先级和左端点没有关系 贪心一下,只保留后面插入的基,这样就可以离线解决询问,然后查询的
阅读全文
摘要:题意 有m个人,n道菜,每道菜有$p_i$,$s_i$,$b_i$,每个人有$inc_j$,$pref_j$,一个人可以买一道菜的条件是 1. $p_i \leq inc_j \leq s_i$ 2. $|b_i pref_j| \leq inc_j p_i$ ,问每个人分别能买多少道菜 题解 转化
阅读全文
摘要:题意 有n个学生,m个社团,每个学生有一个$p_i$值,然后每个学生属于$c_i$社团, 有d天,每天首先随机去除一个人,然后再从每个社团挑选一个学生(假如社团没有学生就跳过这个社团),使得这些学生组成的集合的mex值最大,输入每天的mex值 题解 假如这道题发现是二分图匹配就很好做 左边用$p_i
阅读全文
摘要:题意 一颗有n个点的树,有q个询问,每次从树挑出k个点,问将这k个点分成m组,需要保证在同一组中不存在一个点是另一个点的祖先这种情况,问有多少中分组方案 题解 首先解决转移问题,假设一次询问全颗树的分组方案数,定义dp[u][i]为到树节点u,分了i组的方案数,其中num(fa[u])为u的祖先节点
阅读全文
摘要:题意 一颗有n个点的树,需要挑选出k个点组成序列(可重复),按照序列的顺序遍历树,假如经过黑色的边,那么这个序列就是好的,问有多少个好的序列 题解 黑边不连,红边连,假如两个点不在同一并查集,那么一定经过黑边 定义$dp[i][j][k]$为选择前i个点,起始点为j,是否已经经过黑边(k)的方案数
阅读全文
摘要:题意 每首歌有$t_i$和$b_i$两个值,最多挑选m首歌,使得sum($t_i$) min($b_i$)最大 题解 假如最小的$b_i$确定了,那么拿得越多越好 枚举最小的$b_i$然后取剩下最大的$t_i$ 两种做法 1.从$b_i$大向小扫,这样用优先队列维护最大的那些$t_i$(丢弃最小的)
阅读全文
摘要:题意 一共有k个红包,每个红包在$[s_i,t_i]$时间可以领取,假如领取了第i个红包,那么在$d_i$后才能领取下一个红包,每个红包价值$w_i$,对方假如有机会领取红包他一定会领取,你有m次阻止对方领取的机会,问对方最少可以拿到多少红包 题解 定义dp[i][j]为前i秒用了j次机会让对方拿到
阅读全文
摘要:题意 在一棵有n个点的树上给边染色,连在同一个点上的边颜色不能相同,除非舍弃掉这个点,问最少需要多少种颜色来染一棵树 题解 选择弃掉度数最高的k个点,然后第k+1个点的度数就是答案 代码 c++ include define N 200005 define pb push_back using na
阅读全文
摘要:题意 一个大小为n的数组a[],问最多有多少个不相交的区间和相等 题解 离散化用值来做,贪心选择较前的区间 代码
阅读全文
摘要:题意 将一个回文串切成一段一段,重新拼接,组成一个新的回文串,问最少切几刀 题解 首先无论奇偶串,最多只会切两刀 然后对于偶数串,看看有没有循环回文串,有的话只需要切一刀 代码 c++ include using namespace std; int n,m,i,j,ok,ans; string s
阅读全文
摘要:题意 一个n个数字的数组a[],求有多少对l,r满足$sum[l,mid]=sum[mid+1,r]$,sum为异或和(n define M 3000005 define ll long long using namespace std; ll f[M][3],a[M],ans; int n,i;
阅读全文
摘要:题意 给你一个有n个数字的a数组,一个有n 1个数字的k数组,两种操作: 1.将a[i]+x,假如a[i]+k[i] a[i+1],则a[i+1]要变成a[i]+k[i],直到某个a[j]+k[j] 2.询问某个区间的和 题解 利用题目性质将题目转化到你会的东西的性质 令$t_i=k_1+..+k_
阅读全文
摘要:题意 给你一个矩阵, 每次从每行挑选一个数,组成一个排列,排列的和为不重复数字之和,求所有排列的和(n,m define ft first define se second define MOD 1000000007 define MAXN 2005 define mk make_pair defi
阅读全文
摘要:题意 每次从[1,m](m 发现每加入一个数,gcd会变为原来gcd的因数 $dp[x]$ $dp[gcd(x,i)]$ 但是方程却是反方向的 图片 代码 c++ include define MOD 1000000007 define MAXN 100005 define ll long long
阅读全文
摘要:局部dp + 定义状态取消后效性 题意 给你一个某些位置可以改变的字符串,假如字符串存在回文子串,那么这个字符串就是坏的,问有多少好的串(n $dp[i][0]=dp[i 1][0] (k 2)+dp[i 1][1] (k 1)$ $dp[i][1]=dp[i 1][0]$ 分开讨论[A, 1, 1
阅读全文
摘要:多重排列 + 反向01背包 题意: 给你一个字符串(n 即正常累加01背包的时候都是反着扫,但是用总方案减去非法方案的时候需要正着扫 附上线性逆元,阶乘,逆元阶乘打表板子 代码 c++ include define P 1000000007 define M 100005 define ll lon
阅读全文
摘要:poj1743 下标从0开始版本 c++ include include include include define M 20005 using namespace std; int x[M],y[M],sa[M],rk[M],c[M],h[M],s[M]; int n,i,l,r,mid,m,m
阅读全文
摘要:hdu2222 c++ include define ll long long define M 500005 using namespace std; int tr[M][30],T,n,i,fail[M],cnt[M],sz; char s[1000005]; void add(char s){
阅读全文
摘要:链接讲得很详细,画几个重点方便以后忘了捡 next[]数组从第i位递推算出第i+1位,所以遍历s[0,len 2]即可 next[i]计算的是s[0,i 1]的最长公共前后缀长度,失配时,模式串向右移动的位数为:已匹配字符数 失配字符的上一位字符所对应的最大长度值,即j nt[j] 关于计算next
阅读全文
摘要:贪心 + 思维 题意 你面前有一个队列,加上你有n个人(n using namespace std; int n,m,a[300005],u,v,i,ok,ans; vectorA;set vi; int main(){ cin n m; for(i=1;i a[i]; for(i=0;i u v;
阅读全文
摘要:欧拉函数 + 区间更新线段树 题意 对一个序列(n 欧拉函数性质 1. 假如$p$是一个质数,$\varphi(p)=p 1$,$\varphi(p^k)=p^{k 1} (p 1)=p^k \frac{p 1}{p}$ 2. 假如p,q互质,$\varphi(p q)=\varphi(p) \va
阅读全文
摘要:题意 交互题,需要去猜一个乱序的等差数列的首项和公差,你能问两种问题 1. 数列中有没有数比x大 2. 数列的第i项是什么 最多只能问60次 题解 首先用第一种问题+二分问出数列最大的数是多少,最多二十次 然后用第二种问题尽可能分散的询问第i项,然后将问出的数组排序,对相邻两个数的差求gcd 随机数
阅读全文
摘要:题意 给你一个数n( $a=p_1^{x_1} p_2^{x_2} p_3^{x_3}... p_n^{x_n}$, $b=q_1^{y_1} q_2^{y_2} q_3^{y_3}... q_n^{y_n}$ p,q为素因子,后缀零个数为min(floor($x_i/y_i$)) 求p在n!中的个
阅读全文
摘要:题意 给你一排m个的骨牌(m define ll long long define mxN 300005 define mxM 10000005 define inf 0x3f3f3f3f using namespace std; ll n,m,i,j,k,N,q,x,y,p; int l[mxM]
阅读全文
摘要:题意 给你n个字符串,字符串长度总和加起来不会超过1e5,定义字符串相乘为$s s1=s1+s[0]+s1+s[1]+s1+...+s1+s[size 1]+s1+s[size]+s1$,求n个字符串依次相乘后最长连续字符相同的子序列长度 题解 鬼畜的题意 or 难以优化的复杂度,都需要观察性质才能
阅读全文
摘要:题意 给你一个n m二维偏序表,代表x[i]和y[j]的大小关系,根据表构造大小分别为n,m的x[],y[],使得两个数组中最大的数尽量小 题解 按照偏序表,构造出从小到大的拓扑图 如何解决相等的数的偏序关系? 用并查集缩点后再进行拓扑排序 如何解决最大的数最小? 只需要使得同一层的数相同就行,可以
阅读全文
摘要:题意 有n个特殊宝石(n define P 1000000007 define ll long long define M 105 using namespace std; struct N{ ll a[M][M]; }; ll m,n,i,j; N mul(N x,N y){ N z; memse
阅读全文
摘要:题意 在一个二维坐标轴上给你一个起点一个终点(x,y define ll long long using namespace std; ll sx,sy,ex,ey,n,x[100005],y[100005],i,l,r,mid; char s[100005]; int ok(ll d){ ll p
阅读全文
摘要:题意 给你n个数(n dp[i][j] 2. 和前面的分组 dp[lt[i] 1][j 1] dp[i][j] 怎么确定i前面的哪个点是最大的? 选择能和i分到一组的最前面的数 因为选择最前面的数可以降低前一组的上限 用双指针or单调队列处理 双指针板子 c++ for(l=r=n;l =1;){
阅读全文
摘要:C 题意 给你一个$n m$(n,m define pii pair define se second define ft first define mk make_pair using namespace std; int dx[]={0,0, 1,1}; int dy[]={ 1,1,0,0};
阅读全文
摘要:思维 + 区间dp 题意 给一个长度为n的字符串( define ll long long using namespace std; ll n,f[505][505]; char s[505]; ll dfs(int l,int r){ if(l r)return 0; if(l==r)return
阅读全文
摘要:二分 + 线段树(弃用结构体型线段树) 题意 有n台电脑,只有一个充电器,每台电脑一开始有a[i]电量,每秒消耗b[i]电量,充电器每秒可以给一台电脑充x电,假如有一台电脑在某一秒末电量 define M 200005 define ll long long using namespace std;
阅读全文
摘要:枚举 + 差分前缀和 题意 有一段[1,n]的线段,有q个区间,选择其中q 2个区间,使得覆盖线段上的点最多为多少? 题解 一开始用贪心搞,搞到一半发现需要枚举的情况太多 只能用暴力搞,即枚举被去掉的两个区间,那么如何判断去掉哪两个区间比较好? 维护去掉后剩下的点数即答案 代码 c++ includ
阅读全文
摘要:题意 给你一个有n( 比如存在一个首字符在i和一个首字符在j的串,那么比较的时候哈希值分别都要乘以(size i)和(size j),得到权级都是size的串 两层for已经是n n复杂度,还需要判定后面的串是否是前面串的子串? 一开始想法就是用一个map[i]记录每个位置之前哈希值的出现次数,但是
阅读全文
摘要:题意 给你一个m(=k (n 1)$,可以用双指针,对于每个l可以处理出最小的r满足要求 这样就把数组分成了三段[1,l 1],[l,r],[r+1,m],第一段[1,l 1]删除数字使得可以被k整除(没有限制随便删除),第二段[l,r]分成两种情况: 1. (r l+1) k:去掉(r l+1 k
阅读全文
摘要:B 题意 给你n( 因为每个数只会出现一次,所以对于某个和来说,组成的每个数对都是唯一的 代码 c++ include using namespace std; int n,k,m,a[1005],i,p[1005],j,vi[1005],d,ans,mk[1005]; double ti=0.5;
阅读全文