「SNOI2019」积木】的更多相关文章

传送门 Description 有一块\(n\)行\(m\)列的网格板, \(n,m\)都是奇数.网格上平铺着一些\(1*2\)的积木.积木可以旋转,不能重叠.网格板上只有一格的空位. 你可以做两种操作: 将一块与空白格相邻(指有公共边)的积木旋转\(90^{\circ}\)到空白格中: 将一块与空白格相邻的积木平移至空白格中. 如图所示(被移动的积木颜色较浅): 请你用以上两种操作将给定的网格板变换为指定的状态. Solution  发现并没有要求用最短的步骤(笑... 其实,每次改变空格的位…
Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \sum_{i=0}^{T-1} [(i\in A\pmod P)\land(i\in B\pmod Q)] \] 换言之,就是问有多少个小于 \(T\) 的非负整数 \(x\) 满足:\(x\) 除以 \(P\) 的余数属于 \(A\) 且 \(x\) 除以 \(Q\) 的余数属于 \(B\). 输…
LOJ#3098. 「SNOI2019」纸牌 显然选三个以上的连续牌可以把他们拆分成三个三张相等的 于是可以压\((j,k)\)为有\(j\)个连续两个的,有\(k\)个连续一个的 如果当前有\(i\)张牌,且\(i >= j + k\) 那么可以\((j,k)\rightarrow (k,(i - j - k) \% 3)\) 可以用矩阵乘法优化,每遇到一个有下限的牌面的就再特殊造一个矩阵转移 #include <bits/stdc++.h> #define fi first #def…
LOJ#3097. 「SNOI2019」通信 费用流,有点玄妙 显然按照最小路径覆盖那题的建图思路,把一个点拆成两种点,一种是从这个点出去,标成\(x_{i}\),一种是输入到这个点,使得两条路径合成一条(或者是新建一条),标成\(y_i\) 源点向每个\(x_i\)流一条容量为1,费用为0的边 然后向每个\(y_{i}\)流一条容量为1,费用为W的边 每个\(y_i\)向汇点连一条容量为1,费用为0的边 这个时候,如果你充满梦想,你可以把所有的\(x_{i}\)到\(y_j\)(\(i < j…
LOJ#3096. 「SNOI2019」数论 如果\(P > Q\)我们把\(P\)和\(Q\)换一下,现在默认\(P < Q\) 这个时候每个合法的\(a_i\)都可以直接落到\(Q\)中,因为\(a_{i} \equiv a_{i} \pmod Q\)这样避免了麻烦 然后呢我们发现每次把\((a_{i} + P) \% Q\)会走成一个圈,我们就要求从\(a_{i}\)开始数\(\lfloor \frac{T - 1- a_{i}}{P} \rfloor + 1\)个圈里\(b_{i}\)…
LOJ#3095. 「SNOI2019」字符串 如果两个串\(i,j\)比较\(i < j\),如果离\(a_{i}\)最近的不同的数是\(a_{k}\),如果\(j < k\)那么\(i\)排在\(j\)前面 否则的话如果\(a_{k} < a_{i}\),那么\(i\)排在\(j\)前 于是写个比较函数扔到sort里就可以了 #include <bits/stdc++.h> #define fi first #define se second #define pii pa…
这题是01背包(\(DP\)) 如何判断要拆走那个积木,首先定义一个\(ans\)数组,来存放这对积木能拼成多高的,然后如果\(ans_i = n\)那么就说明这个高度的积木可以. 话不多说,上代码! #include<cstdio> //从最小高度~1枚举, 如果能恰好达到这个高度(即用它有的积木恰好能拼出)有n个城堡 #include<cstring> #include<algorithm> using namespace std; int n, len, min_…
题目 还好我没生在陕西啊 首先发现这个题不能\(dp\),数据范围不大,好像一种网络流的样子啊 哎等等,这样向后面连边不是一个\(DAG\)吗,这不是最小权路径覆盖的板子吗 于是我们套路的拆点,对于一个点\(i\)我们拆成\(i\)和\(i'\),源点向点\(i\)连费用为\(0\)容量为\(1\)的边,\(i'\)向汇点连费用为\(0\)容量为\(1\)的边 之后我们把让\(S\)向\(i'\)直接连费用为\(W\)容量为\(1\)的边,表示直接连到控制中心 对于点\(i\),我们向\(j'(…
题目 看起来非常一眼啊,我们完全可以\(std::sort\)来解决这歌问题 于是现在的问题转化成了比较函数怎么写 随便画一下就会发现前面的好几位是一样的,后面的好几位也是一样,只需要比较中间的一段子串的大小就好了 比较大小我们显然是需要\(lcp\)的 发现这里的后缀恰好有一位是错位的,于是我们只需要知道对于每一个后缀\(i\)知道它和后缀\(i+1\)的\(lcp\)长度是多少 我们显然可以\(O(n)\)递推求出来 之后快排即可 #include<bits/stdc++.h> const…
根据题意 每个点可以直接与S,T相连 也可以和前面的哨站相连 暴力建边的话 有n2条边 要用分治优化建边: 类似于归并排序 先对每一层分为左半边与右半边 对每一半都拿出来先排序去重后 直接排成一条链建边 if (l == r) { return ; } ; solve(l, mid), solve(mid + , r); ; for (int i = l; i <= r; i++) { aa[++cnt] = a[i]; } sort(aa + , aa + + cnt); cnt = uniq…