A. Cakey McCakeFace
按题意模拟即可。
#include
#include
#include
#include
#include
#include
#include
#include
B. Table
枚举下底边,求出每个位置向上延伸的最大长度,枚举每个位置作为右下角,那么单调栈中每一个子矩形都可以对长宽都不超过它的询问产生贡献,通过差分二维前缀和,那么$O(1)$单点修改即可。
为了避免枚举单调栈中每一项,可以在每一项退栈时计算有多少个右下角可以与它产生贡献,这是对差分后的二维前缀和的一段区间加,再次差分前缀和转化成单点修改即可。
时间复杂度$O(xy+n+d)$。
#include
const int N=2010;
int n,m,_a,_b,i,j,a[N][N],b[N][N],f[N],q[N],t;
inline void work(int x,int y,int z,int o){
/*for(int i=y;i<=z;i++){
b[i-y][o]--;
b[i+1-x][o]++;
}
return;*/
b[0][o]--;
b[z-y+1][o]++;
b[y+1-x][o]++;
b[z+1-x+1][o]--;
}
int main(){
scanf("%d%d%d%d",&n,&m,&_a,&_b);
while(_a--){
int xl,xr,yl,yr;
scanf("%d%d%d%d",&xl,&xr,&yl,&yr);
a[xr][yr]++;
a[xl][yr]--;
a[xr][yl]--;
a[xl][yl]++;
}
for(i=n;i;i--)for(j=m;j;j--)a[i][j]+=a[i+1][j]+a[i][j+1]-a[i+1][j+1];
for(i=1;i<=n;i++)for(j=1;j<=m;j++)a[i][j]=a[i][j]==0;
/*puts("");
for(i=1;i<=n;i++){
for(j=1;j<=m;j++)printf("%d",a[i][j]);
puts("");
}*/
for(i=1;i<=n;i++){
for(j=1;j<=m;j++)if(a[i][j])f[j]++;else f[j]=0;
for(q[t=0]=0,j=1;j<=m;q[++t]=j++){
while(t&&f[j]
C. Macarons
设$f[i][S]$表示考虑前$i$行,第$i$行每个位置是否被填充的情况为$S$的合法方案数。
逐格转移预处理出转移矩阵后快速幂即可。
时间复杂度$O(2^{3n}\log m)$。
#include
#define rep(i) for(int i=0;i>i&1)){
up(g[j^(1<>(i-1)&1))up(g[j|(1<<(i-1))],f[j]);
}
}
for(j=0;j>=1,mul(A,A,A))if(K&1)mul(A,B,B);
printf("%d",B[m-1][m-1]);
}
D. Candy Chain
设$f[i][j]$表示将区间$[i,j]$全部消完的最大收益,$dp[i]$表示考虑前$i$个位置的最大收益,那么$dp[i]=\max(dp[i-1],dp[j-1]+f[j][i](1\leq j\leq i))$。
对于$f$的计算,设$g[i][j][k]$表示考虑区间$[i,j]$,最后一次要删去的串在字典树上位于$k$点的最大收益,要么枚举一个区间消掉,要么在字典树上往下走,要么消去$k$代表的字符串。
时间复杂度$O(n^4c)$,但常数很小,且无用状态很多,远远达不到上界。
#include
#include
#include
using namespace std;
const int N=55,M=20005;
int n,m,i,j,k,x,tot,son[M][26],w[M],f[N][N],dp[N];
int g[N][M];
char a[N],b[N];
inline void up(int&a,int b){a
E. Ingredients
拓扑排序之后背包即可。
#include
#include
#include
#include
#include
#include
#include
#include
F. Shattered Cake
$ans=\frac{\sum_{i=1}^n w_il_i}{W}$。
#include
int w,n;long long s;
int main(){
scanf("%d%d",&w,&n);
while(n--){
int x,y;
scanf("%d%d",&x,&y);
s+=x*y;
}
printf("%lld",s/w);
}
G. Cordon Bleu
考虑费用流建图,新建一个容量为$n-1$的虚点,表示从餐厅出发的快递员,剩下部分显然,然后求最小费用最大流。
这样边数为$O(n^2)$,不能接受。注意到这些边费用都是曼哈顿距离,将绝对值拆开后$4$个象限分别用可持久化线段树优化建图即可。
如此一来点数边数均为$O(n\log n)$,可以通过。
#include
#include
#include
#include
#include
#include
#include
#include
H. Kabobs
留坑。
I. Burglary
设$f[i][j][k]$表示考虑从上往下前$i$行,目前两条路线分别位于第$i$行的第$j$和第$k$根管道上的最大收益,暴力转移即可。
时间复杂度$O(10^4n)$。
#include
#include
#include
#include
#include
#include
#include
#include
J. Frosting on the Cake
按题意模拟即可。
#include
#include
#include
#include
#include
#include
#include
#include
K. Blowing Candles
求凸包后旋转卡壳,注意特判所有点共线的情况。
#include
#include
#include
#include
#include
#include
#include
#include