杂题选讲II
Clique Connect AT_abc352_e
朴素的想法是按题意暴力建边跑最小生成树,发现一个联通块内的很多边是冗余的,可以相邻两点建边跑最小生成树即可。
点击查看代码
// author : yhy
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
using Pii = pair<LL, LL>;
const LL kMaxN = 2e5 + 5;
vector<tuple<LL, LL, LL> > v;
LL n, m, k, c, x, cnt, ans, fa[kMaxN];
LL find(LL x) {
return fa[x] == x ? x : fa[x] = find(fa[x]);
}
signed main() {
cin.tie(0)->ios::sync_with_stdio(0);
cin >> n >> m;
for (LL i = 1; i <= n; i++) {
fa[i] = i;
}
for (LL i = 1; i <= m; i++) {
cin >> k >> c;
for (LL pr = 0; k--;) {
cin >> x, pr && (v.push_back({c, pr, x}), 0), pr = x;
}
}
sort(v.begin(), v.end());
for (auto [w, x, y] : v) {
LL fx = find(x), fy = find(y);
fx != fy && (cnt++, ans += w, fa[fx] = fy);
}
cout << (cnt == n - 1 ? ans : -1);
return 0;
}
菱形(站外题)
有 tree 的 TrickII。
题目大意:
给定初始值为 \(01\) 长为 \(n\) 宽为 \(m\) 的矩阵,给定 \(q\) 次操作共两种:
1 x y tx ty表示将 \((x,y)\) 以左上角的 \(tx\) 行 \(ty\) 列矩阵中的值异或 \(1\)。
2 x y d表示将所有到 \((x,y)\) 曼哈顿距离 不超过 \(d\) 的值异或 \(1\)。\(1\le n,m \le 1000,1\le q \le 6\times10^5,保证输入合法\)。
统计每个位置被操作覆盖多少次,根据初始值和覆盖次数即可算出答案,将 \(1,2\) 操作拆开算,\(1\) 操作直接二维差分,\(2\) 操作发现加的是一个菱形,朴素的想法是拆成 \(n\) 行跑一维差分,发现可以将矩阵旋转 \(45^\circ\),\((x,y)\) 转成 \((x+y,y-x)\),菱形转成矩形后可以直接跑二维差分,注意第一维空间要开 \(2\) 倍,第二位要加上 \(D=1000\) 的偏移量。
点击查看代码
// author : yhy
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
using Pii = pair<LL, LL>;
const int kMaxM = 1005, kMaxN = 2515, D = 1005;
int n, m, q;
bool c[kMaxM][kMaxM];
LL d[2][kMaxN][kMaxN];
void add(int ty, int x, int y, int x2, int y2) {
d[ty][x][y]++, d[ty][++x2][++y2]++;
d[ty][x2][y]--, d[ty][x][y2]--;
}
signed main() {
cin.tie(0)->ios::sync_with_stdio(0);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> c[i][j];
}
}
cin >> q;
for (int ty, x, y, x2, y2; q--;) {
cin >> ty >> x >> y >> x2;
if (ty == 1) {
cin >> y2;
add(0, x, y, x + x2 - 1, y + y2 - 1);
} else {
int nx = x + y, ny = y - x + D;
add(1, nx - x2, ny - x2, nx + x2, ny + x2);
}
}
for (int i = 1; i <= 2500; i++) {
for (int j = 1; j <= 2500; j++) {
d[0][i][j] += d[0][i - 1][j] + d[0][i][j - 1] - d[0][i - 1][j - 1];
d[1][i][j] += d[1][i - 1][j] + d[1][i][j - 1] - d[1][i - 1][j - 1];
}
}
for (int i = 1; i <= n; i++, cout << '\n') {
for (int j = 1; j <= m; j++) {
LL t = d[0][i][j] + d[1][i + j][j - i + D];
cout << (!c[i][j] ? (t & 1) : !(t & 1)) << ' ';
}
}
return 0;
}
Complete the Projects (hard version) CF1203F2
首先一个特别显然的贪心思路是,\(b_i\ge0\) 的项目在限制条件下做的越多越好,显然到脑补证明就行,那么对于 \(b_i<0\) 的项目先按 \(a_i+b_i\) 降序排序,然后设状态 \([i,j,k]\) 表示前 \(i\) 个项目 rating 还剩 \(j\) 且完成 \(k\) 个项目,其中 \(k\) 是最优化属性按非 \(k\) 属性分组,然后判断转移合法性转移即可,可以像背包那样压掉一维。
点击查看代码
//author : yhy
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
using Pii = pair<int, int>;
const int kMaxN = 105, kMaxM = 65005;
int n, r, ans, cnt[2], f[kMaxN][kMaxM];
Pii a[2][kMaxN];
signed main() {
cin.tie(0)->ios::sync_with_stdio(0);
cin >> n >> r;
for (int i = 1, x, y; i <= n; i++) {
cin >> x >> y;
a[(y < 0)][++cnt[(y < 0)]] = {x, y};
}
sort(a[0] + 1, a[0] + cnt[0] + 1);
for (int i = 1; i <= cnt[0]; i++) {
r >= a[0][i].first && (r += a[0][i].second, ans++);
}
sort(a[1] + 1, a[1] + cnt[1] + 1, [](Pii x, Pii y){
return x.second > y.second;
}), memset(f, -0x3f, sizeof f), f[0][r] = ans;
for (int i = 1; i <= cnt[1]; i++) {
for (int j = 0; j <= r; j++) {
f[i][j] = max(f[i][j], f[i - 1][j]);
if (j - a[1][i].second >= a[1][i].first && j <= r + a[1][i].second) {
f[i][j] = max(f[i][j], f[i - 1][j - a[1][i].second] + 1);
}
}
}
int maxv = 0;
for (int i = 0; i <= r; i++) {
maxv = max(maxv, f[cnt[1]][i]);
}
cout << maxv;
return 0;
}
|LIS| = 3 AT_abc237_f
LIS 的 \(O(n\log n)\) 求法:设状态 \(f_i\) 表示 LIS 的第 \(i\) 位的最小值,由于题目中 LIS 最多有 \(3\) 位,所以将 \(f_1,f_2,f_3\) 压进状态,设状态 \(F_{x,a,b,c}\) 表示前 \(x\) 位 \(f_1,f_2,f_3\) 分别为 \(a,b,c\) 的方案数,状态有拓扑序考虑递推。
点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int kMaxN = 1005, kMaxV = 15, M = 998244353;
int n, m, ans, f[kMaxN][kMaxV][kMaxV][kMaxV];
int main() {
cin >> n >> m, f[0][m + 1][m + 1][m + 1] = 1;
for (int i = 1; i <= n; i++) {
for (int a = 1; a <= m + 1; a++) {
for (int b = a; b <= m + 1; b++) {
for (int c = b; c <= m + 1; c++) {
for (int x = 1; x <= c && x <= m; x++) {
int na = a, nb = b, nc = c;
if (x <= na) na = x;
else if (x <= nb) nb = x;
else nc = x;
f[i][na][nb][nc] = (f[i][na][nb][nc] + f[i - 1][a][b][c]) % M;
}
}
}
}
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= m; j++) {
for (int k = 1; k <= m; k++) {
ans = (ans + f[n][i][j][k]) % M;
}
}
}
cout << ans;
}
杂题选讲II的更多相关文章
- 正睿OI DAY3 杂题选讲
正睿OI DAY3 杂题选讲 CodeChef MSTONES n个点,可以构造7条直线使得每个点都在直线上,找到一条直线使得上面的点最多 随机化算法,check到答案的概率为\(1/49\) \(n ...
- 2019暑期金华集训 Day6 杂题选讲
自闭集训 Day6 杂题选讲 CF round 469 E 发现一个数不可能取两次,因为1,1不如1,2. 发现不可能选一个数的正负,因为1,-1不如1,-2. hihoCoder挑战赛29 D 设\ ...
- ZROI 暑期高端峰会 A班 Day5 杂题选讲
CF469E \(n\) 个需要表示的数,请使用最少的 \(2^k\) 或 \(-2^k\) 表示出所有需要表示的数.输出方案. \(n\le 10^5,|a_i|\le 10^5\). 首先每个数肯 ...
- hs-black 杂题选讲
[POI2011]OKR-Periodicity 考虑递归地构造,设 \(\text{solve(s)}\) 表示字典序最小的,\(\text{border}\) 集合和 \(S\) 的 \(\tex ...
- ZROI 19.08.02 杂题选讲
给出\(n\)个数,用最少的\(2^k\)或\(-2^{k}\),使得能拼出所有数,输出方案.\(n,|a_i|\leq 10^5\). 显然一个绝对值最多选一次.这个性质非常强. 如果所有都是偶数, ...
- p_b_p_b 杂题选讲
[ARC119F] AtCoder Express 3 [ARC117F] Gateau 考虑二分答案,对前缀和建差分约束 \(\text{check}\) ,但是用 \(\text{spfa}\) ...
- namespace_std 杂题选讲
CF1458C Latin Square 2021 EC Final C. Random Shuffle [THUPC2021] 混乱邪恶 [JOISC2022] 制作团子 3 2022 集训队互测 ...
- 贪心/构造/DP 杂题选做Ⅱ
由于换了台电脑,而我的贪心 & 构造能力依然很拉跨,所以决定再开一个坑( 前传: 贪心/构造/DP 杂题选做 u1s1 我预感还有Ⅲ(欸,这不是我在多项式Ⅱ中说过的原话吗) 24. P5912 ...
- 贪心/构造/DP 杂题选做Ⅲ
颓!颓!颓!(bushi 前传: 贪心/构造/DP 杂题选做 贪心/构造/DP 杂题选做Ⅱ 51. CF758E Broken Tree 讲个笑话,这道题是 11.3 模拟赛的 T2,模拟赛里那道题的 ...
- PJ考试可能会用到的数学思维题选讲-自学教程-自学笔记
PJ考试可能会用到的数学思维题选讲 by Pleiades_Antares 是学弟学妹的讲义--然后一部分题目是我弄的一部分来源于洛谷用户@ 普及组的一些数学思维题,所以可能有点菜咯别怪我 OI中的数 ...
随机推荐
- input添加文字 提示效果 点击后清空,移出时恢复提示
<input type="text" value="模糊型号查询" onfocus="if(value=='模糊型号查询') {value='' ...
- Kafka入门实战教程(2)基于Docker搭建Kafka环境
1 准备工作 这里我们使用一台Linux CentOS系统的服务器来模拟三个Kafka Broker的伪集群(即一台server上开三个不同端口)环境用于学习测试,大概的准备工作有两个: 安装Dock ...
- homestead 配置多站点 报403
)配置:Homestead 报403 一般是Homestead.yaml sites没有映射上 导致 vagrant global-status vagrant provision ef7a202 ) ...
- 前端开发系列045-基础篇之TypeScript语言特性(五)
本文主要对TypeScript中的泛型进行展开介绍.主要包括以下内容 ❏ 泛型函数类型 ❏ 泛型接口(Interface) ❏ 泛型类(Class) ❏ 泛型约束 一.泛型函数的类型 在以前的文章中, ...
- screen 相当于 浏览器的多标签.简单使用说明
简介:screen 相当于 浏览器的多标签. 转载: CSDN 个人常用命令 screen -ls 显示所有视窗 杀死视窗 kill -9 threadnum 例如在上面的2637,kill -9 2 ...
- Prim 算法求最小生成树
数据参考 百度经验 博客园 楠楠IT 测试接口 牛客 连通工程 问题背景 求国家建设公路的最小开销 算法思想 首先建立 邻接矩阵 然后 设定最小消耗顶点(就是两个定点之间的权重最小)顶点集合 U 每次 ...
- K8S三、实战
目录 创建第一个pod 创建Deployment 滚动升级和回滚 创建serivce 访问Service HPA 创建第一个pod kubectl create deployment nginx-de ...
- SciTech-Mathmatics-Probability+Statistics: The Scientific Method科学研究方法 & Engineering Design工程 + Population VS Sampling(Hypothesis of Parameters) + Likelyhood VS Probability(Model of Solid Parameters)
SciTech-Mathmatics-Probability+Statistics: Differences: The Scientific Method & Engineering Desi ...
- 医院PACS系统--九五小庞
一.什么是PACS系统医学影像系统(Picture Archiving and CommunicationSystems,简称PACS)是应用在医院影像科室的系统,主要的任务就是把日常产生的各种医学影 ...
- 在SqlSugar的开发框架的Vue3+ElementPlus前端中增加对报表模块的封装处理,实现常规报表的快速处理
在我们开发业务系统的时候,往往都需要一些数据报表进行统计查看,本篇内容介绍如何在实际的前端中对报表内容进行的一些封装操作,以便提高报表模块开发的效率,报表模块的展示主要是结合Vue3中比较广泛使用的e ...