摘要:
首先可以把题目转化一下:把树拆成若干条链,每条链的颜色为其所在的树的颜色,然后排放所有的链成环,求使得相邻位置颜色不同的排列方案数。 然后本题分为两个部分:将一棵树分为1~n条不相交的链的方案数;将这些链安排顺序使得不存在两条相邻的链来自同一棵树。 第一部分显然可以O(n2)树形DP,f[i][j] 阅读全文
摘要:
考虑k=1的做法:这是一道原题,我还写过题解,其实挺水的,但当时我菜还是看题解的:https://www.cnblogs.com/hfctf0210/p/10187947.html。其实就是树上差分后值为1。 考虑k>1的做法:其实可以再次树上差分,给每个点i赋值v[i]=dep[i]k-dep[i 阅读全文
摘要:
二进制分组SB做法没意思还难写还可能会被卡常其实是我不会写。用一种比较优秀的O(Tnlogn)做法,只需要做2次dijkstra。对原图做一次、对反图做一次,然后记录每个点的最短路是从k个源点中的哪个转移过来的。然后枚举每条边,若两边转移过来的源点不同,则用d1+w[i]+d2来更新答案即可。 #i 阅读全文
摘要:
感觉是6题中最难的一题,其实这题是一个二合一: 第一问:给定平面上若干点和k个关键点,关键点覆盖一个45°倾斜的正方形范围r,求有多少点被至少一个关键点覆盖。这个可以曼哈顿转切比雪夫距离,然后再扫描线求解,复杂度O(nlogn) 第二问:求最少和最多有多少次擦肩而过。显然每个交点都可以做对向交换,这 阅读全文
摘要:
出这种麻将题有意思吗? 乍看很难实则很水,就是麻将式DP,想必大家很熟悉了吧。首先把“国士无双”和“七对子”两种牌型判掉,然后观察牌胡的形式,发现每多一张牌实际上就是把1个面子变成1个杠子,然后可以直接DP啦!f[i][j][k][p][q]表示到第i种牌型,(i-2,i-1,i)有j个,(i-1, 阅读全文
摘要:
首先看到与或,很显然想到按照位拆分运算。然后就变成了0/1矩阵,要使矩阵在当前位与为1,则矩阵全为1,如果是或为1,则是矩阵不全为0,然后求全为0/1的矩阵个数即可。记录c[i][j]表示以a[i][j]在该位向上0/1的长度。然后对于每一行,单调栈求解即可。 #include<bits/stdc+ 阅读全文
摘要:
要想让一个位置作为最小循环,其必须是最小后缀,然后一个字符串的最小后缀不超过O(logn)个,于是维护备选集合即可。 然而要在O(n)复杂度求解,需要求出原串后缀与原串的LCP长度,需要用Z-algorithm。而此时由于备选后缀存在前缀关系,比较时只需用到每个后缀与原串的LCP #include< 阅读全文
摘要:
AB 签到(A是a-b problem就不放code了) #include<bits/stdc++.h> using namespace std; int r,g,b,n,ans; int main() { cin>>r>>g>>b>>n; for(int i=0;i*r<=n;i++) for(i 阅读全文
摘要:
O(nlogn)的做法十分显然,有三种可以做到O(nlogn)的:1、最容易的想法:把串扩展成两倍,然后跑一遍SA求后缀数组。2、求后缀同样也可以用SAM去求解,用map存一下。3、最暴力的方法:直接二分+hash比较第一位不同的。 其实这题想要让我们用最小表示法求解,然而我不会就来学一下。很容易发 阅读全文
摘要:
设第i个人在t时刻生/死为(x,0/1,t),然后显然能够连上(x,0,t)->(x,0,t-1),(x,1,t)->(x,1,t+1),然后对于每个限制,用朴素的2-SAT连边即可。 但这样的点数达到了O(nT),其实有一种方法可以只把限制的边连接建图,点数为4m,这样可能会被卡常。 有没有更优秀 阅读全文