五校联考R1 Day2T2 矩阵matrix(容斥)】的更多相关文章

题目链接 容易想到容斥,但是很恶心,因为要对行和列都容斥,然后行+列又要容斥.. 于是得到\(O(nm\log)\)的做法. 就有70分了: #include <cstdio> #include <algorithm> #define mod (1000000007) #define Mod(x) (x>mod&&(x-=mod))//>= #define ID(x,y) ((x-1)*m+y) typedef long long LL; const i…
题目链接 我们可以把棱柱拆成有\(n\)条高的矩形,尝试递推. 在计算的过程中,第\(i\)列(\(i\neq n\))只与\(i-1\)列有关,称\(i-1\)列的上面/下面为左上/左下,第\(i\)列的上面/下面为右上/右下. 我们可以发现,右上可选的颜色数与左上和右下是否同色有关,右下同理,那就记\(f[i][0/1][0/1]\)表示左上与右下是否同色,左下与右上是否同色. 但是第\(n\)列和第\(1\)列不能同色,最后怎么算答案? 不知道第\(n\)列状态算不了,所以我们还要记第\(…
[五校联考1day2]JZOJ2020年8月12日提高组T2 我想大声告诉你 题目 Description 因为小Y 是知名的白富美,所以自然也有很多的追求者,这一天这些追求者打算进行一次游戏来踢出一些人,小R 自然也参加了. 这个游戏有n 个人参加,每一轮随机选出一个还没有出局的人x,接着x 会出局.x 在出局之后剩下的人会受到一次攻击,每一个人在遭到攻击之后会有p 的概率出局.(注意遭到攻击出局的人是不能攻击剩下的人的) 在所有人都出局之后,遭受攻击次数等于特定值的人能够成为胜者.所以现在小…
[五校联考1day2]JZOJ2020年8月12日提高组T1 对你的爱深不见底 题目 Description 出乎意料的是,幸运E 的小R 居然赢了那个游戏.现在欣喜万分的小R 想要写一张明信片给小Y,但是因为小R 非常羞涩,所以他打算采用一些比较神奇的方式来表达. 他定义了一些字符串,s1 = a,s2 = b,si =s_i-1 + s_i-2 (i >=3).同时他定义了一个字符串s 的权值为一个最大的i <|s|满足s 长度为i 的前缀等于长度为i 的后缀.比如字符串aba 的权值就是…
题意 $n * m$的网格,对其进行黑白染色,问每一行每一列至少有一个黑格子的方案数. Sol 考场上只会$n^3$的dp,还和指数级枚举一个分qwq 设$f[i][j]$表示到了第$i$行,已经有$j$列被染黑,然后暴力转移上一行有几个黑格子 正解是容斥 首先固定好列,也就是保证每一列都有一个黑格子 这样的方案是$(2^N - 1) ^M$ 然后容斥行 组合数暴力算即可 #include<cstdio> #include<cstring> #include<algorith…
咕咕咕到现在~ 题面传送门 题意: 给出一个 \(n\times n\) 的矩阵 \(A\).要你求有多少个 \(n\times n\) 的矩阵 \(B\) 满足: 每一行都是 \(1\) 到 \(n\) 的排列. 对于任意 \(1\leq i\lt n\),\(1\leq j\leq n\),\(B_{i,j}\neq B_{i+1,j}\) 定义 \(f(A)\) 为矩阵 \(A\) 从上到下,从左到右拼接而成的序列,即 \(f(A)_{(i-1)\times n+j}=A_{i,j}\),…
题目 分析 首先,设\(f_{i,j}\)表示最大的以(i,j)为左下角的正方形的边长. 转移显然,\(f_{i,j}=\max(f_{i-1,j},f_{i,j-1},f_{i-1,j-1})+1\) 接着,再设\(g_{i,j,k,l}\)表示在以\((k,l)\)为左上角,\((k+2^i-1,l+2^j-1)\)为右下角的矩阵中,最大的f. 二维rmq就不讲了. 假设询问矩阵(x,y,x1,y1), 二分答案ans(想想为什么?) 用rmq看红色区域中的最大f值是否合法. 注意:出题人将…
题目描述 输入 输出 样例输入 3 4 1 1 0 1 0 1 1 0 0 1 1 0 5 1 1 2 3 2 1 3 2 3 2 3 4 1 1 3 4 1 2 3 4 样例输出 1 1 1 2 2 数据范围 解法 设f[i][j]为以(i,j)为右下角的正方形的最大边长. 则f[i][j]=min(f[i−1][j],f[i−1][j−1],f[i][j−1])+1(a[i][j]=1) 考虑利用f来求答案. 对于询问(x1,y1,x2,y2): 显然ans=min(f[x][y],x−x1…
题目 分析 发现,当子段[l,r]被取了出来,那么[l-1,r].[l,r+1]一定也被取了出来. 那么,首先将[1,n]放入大顶堆,每次将堆顶的子段[l,r]取出来,因为它是堆顶,所以一定是最大的子段,输出它,并将[l+1,r]和[l,r-1]放进堆中. 一共就只用做k次就可以了. #include <cmath> #include <iostream> #include <cstdio> #include <cstdlib> #include <c…
题目描述 输入 输出 样例输入 3 4 1 3 4 样例输出 8 7 4 4 数据范围 样例解释 解法 二分做法 考虑到可以二分第k大的值mid,如果比mid大的区间和数小于或等于mid,那么mid就合法. 找一个合法的最小mid就是我们要找的mid. 询问有多少个区间大于或等于mid可以使用dfs,从[1,n]开始: 设当前dfs到[l,r],如果当前区间合法,就可以推到[l,r-1]和[l+1,r]. 否则直接退出. 时间复杂度为O(log(maxa)∗k). 堆做法 先把所有[1,i]加入…