ARC184 随便写点
最逆天的一集。
ARC184 A
题目解析
关键观察:注意到 \(m\) 很小,只有 \(10\),并且 \(q = 950\)。考虑有什么性质。
我们发现 \(m\) 很小,我们考虑挖掘性质。
有一个关键观察:如果有大于 \(10\) 个数的类型相等,那么他们一定都是好的。
如果我们知道了 \(20\) 个数中的相对情况,假设有 \(x\) 个数类型相等,其他 \(n - x\) 个数类型相等,这两种数类型不同,由于上面的性质,当 \(x \neq 10\) 时,数量较多的一类必定是好数,数量较少的一类必定是坏数。
按照上面的启发,我们考虑将 \(1000\) 个数进行分组,每组内有 \(20\) 个数。我们计算这 \(20\) 个数的相对情况(这是容易的),然后根据上面的结论,我们就能知道当一组内两种类型数目不相等时它们的好坏之分。
因此,我们只需要考虑 \(x = 10\) 的情况(这种组别显然最多只有一个)。这好办,我们只需要将在这组内的任意一个数和不在这组内的任意一个数比较,这样我们就能区分出哪一种类别是好数。
需要注意一个细节:这样算下来最多的询问次数会到达 \(951\),所以需要轻微的调整来解决这一问题。具体比较简单,可以看代码。
void solve() {
cin >> n >> m >> q;
vector <int> ans;
for (int i = 1; i <= 50; i ++) {
int l = (i - 1) * 20 + 1, pos = 0, cnt0 = 1, cnt1 = 0;
int tar = -1;
for (int j = 2; j <= 20 && (i != 50 || !ans.empty()); j ++) {
cout << "? " << l << ' ' << l + j - 1 << endl;
cin >> col[l + j - 1];
cnt0 += (col[l + j - 1] == 0);
cnt1 += (col[l + j - 1] == 1);
}
if (i == 50 && ans.empty()) {
for (int j = 1; j <= 19; j ++) {
cout << "? " << 1 << ' ' << j + l - 1 << endl;
cin >> col[j + l - 1];
cnt0 += (col[l + j - 1] == 0);
cnt1 += (col[l + j - 1] == 1);
if (col[j + l - 1] == 1) ans.push_back(j + l - 1);
}
if (cnt1 == 9)
ans.push_back(1000);
break;
}
if (cnt0 < cnt1) {
for (int j = 1; j <= 20; j ++)
if (col[l + j - 1] == 0) ans.push_back(l + j - 1);
} else if (cnt0 > cnt1) {
for (int j = 1; j <= 20; j ++)
if (col[l + j - 1] == 1) ans.push_back(l + j - 1);
} else {
pos = (i == 1 ? 1000 : 1);
cout << "? " << l << ' ' << pos << endl;
cin >> tar;
tar ^= 1;
for (int j = 1; j <= 20; j ++)
if (col[l + j - 1] == tar) ans.push_back(l + j - 1);
break;
}
}
cout << "! ";
for (int x : ans) cout << x << ' ';
cout << endl;
}
ARC184 B
ARC184 C
ARC184 D
关键转换:删点不是很好考虑,所以转换成选点。
首先我们考虑选择的点集有多少不同的。我们先对第一维 \(x\) 坐标进行排序,然后容易想到 \(dp\)。
显然,选择的点集中相邻两个点 \((i, i + 1)\) 肯定需要满足 \(y_i > y_{i + 1}\)。据此,可以想到一种比较 naive 的 \(dp\) 方法:设 \(dp_i\) 表示当前考虑了前 \(i\) 个点(选择了 \(i\)),枚举 \(j\),如果 \(y_j > y_i\) 则可以直接转移。
但是上面这个 \(dp\) 有一个显然的漏洞:重复。因为对于一个删除的点集,可能有多个选择的点集能得到它。因此,我们需要在这些结果相同的点集中选择出一种具有代表性且容易计算的方案。
关键观察:我们再加一条限制,选择任意一个没被删除且没被操作的点,操作它之后一定会删除一个其他点。
通过上面这一个限制,我们就有了一个比较明确的 \(dp\) 思路:设 \(dp_i\) 表示当前考虑了前 \(i\) 个点(选择了 \(i\))的方案数,然后每次枚举 \(j\),并且判断这一转移合不合法。
假设现在有一个选择的点集,我们要判断它是否合法。显然,我们设所有没被删除且没被操作的点所在的点集为 \(T\),然后在点集 \(T\) 中遍历每个点 \(i\) 判断 前面是否存在 \(j\) 使得 \(y_j < y_i\) 或者 后面是否存在 \(j\) 使得 \(y_i < y_j\)。
但是现在还有一个问题:在 \(dp\) 的转移中如何判断该方案是否合法?
关键观察:我们称相邻两个已操作的点之间所有没被删除的点为一个段。那么,任意两个段之间没有任何关系。即,设左边的点集为 \(S\),右边的段的点集为 \(T\),那么 \(\forall i \in S, j \in T, y_i > y_j\)。
上面这个观察是显然的,但很重要。那么,我们就可以在转移的过程中,只判断当前这一段是否满足要求即可。
void solve() {
n = read();
for (int i = 1; i <= n; i ++)
t[i].x = read(), t[i].y = read();
sort(t + 1, t + n + 1);
t[0] = {0, n + 1}, t[n + 1] = {n + 1, 0};
dp[0] = 1;
for (int i = 1; i <= n + 1; i ++) {
for (int j = 0; j < i; j ++) {
if (t[j].y <= t[i].y) continue;
for (int k = 1; k <= n; k ++)
vis[k] = 0;
bool flg = 1;
long long mn = 2e18, mx = -2e18;
for (int k = j + 1; k < i; k ++) {
if (!(t[j].y > t[k].y && t[k].y > t[i].y))
continue;
vis[k] |= (mn < t[k].y);
mn = min(mn, t[k].y);
}
for (int k = i - 1; k > j; k --) {
if (!(t[j].y > t[k].y && t[k].y > t[i].y))
continue;
vis[k] |= (mx > t[k].y);
mx = max(mx, t[k].y);
}
for (int k = j + 1; k < i; k ++) {
if (!(t[j].y > t[k].y && t[k].y > t[i].y))
continue;
flg &= (vis[k] == 1);
}
if (flg) {
(dp[i] += dp[j]) %= mod;
}
}
}
cout << dp[n + 1];
}
ARC184 随便写点的更多相关文章
- Jquery 随便写些知识点
针对jQuery随便写些觉得还挺实用的一些东西,也没系统的去理一番,只是想到哪写到哪,写的不完全也请多见谅. jQuery和其他javascript库产生$符号冲突了?$符号想必用jQuery的人都不 ...
- 随便写一点最近开发遇到的问题和解决方法 大部分关于laravel和php
laravel里要想对对象进行自己设计的排序(usort()), 得用匿名方法, 原声php就不用 php里面可以随便写html代码, 比如可以把html直接后缀名改成.php, 然后在任何地方& ...
- Jquery网页加载进度条(随笔,当然要随便写,当日记动态心情写咯)
首先先是吐槽时间... 告诉大家一个好消息,就是有个妹子非常仰慕我的前端技术说要包养我 然后有好多羡慕嫉妒恨的童鞋一定要说,少年你太天真了,那一定是HR 然后我表示她不是HR,本宅的春天貌似要到来了. ...
- 忙了好一阵,今天随便写篇关于canvas的小东西
前几天在朋友圈发了几条3D demo视频,其中就有3D空间组成各种图形.如上! 那么这些图形的每个mesh的坐标可不是手动去写,如果你愿意我当然不拦着!所以今天这篇就来介绍如何获得这些图形的坐标数据. ...
- 实现一个最简单的VIM文本编辑器(可能有bug,随便写了一个)
简单的写了一个文本编辑器,功能很简单,但足以把文件IO相关的操作熟悉了,可能功能或者分配的大小还不够完善.请参考参考: #include <stdio.h> #include <co ...
- H5取经之路——随便写点儿
[相对定位] * 1.使用position:relative:设置元素为相对定位的元素: * 2.定位机制: ①相对于自己原来文档流中的的位置定位,当不指定top等定位值时,不会改变元素位置: ②相对 ...
- java用POI操作excel——随便写一下,最基础的东西
前两天部门实施在做一个东西,需要把客户放在Excel中的数据导入到Oracle数据库中,我就想着直接写一个模板,必要的时候改一下实体类应该可以解放实施同事的双手,不过在实际写的过程中,还是碰到很多问题 ...
- 今天一天课,随便写点吧/xk
知道的越多,不知道的也就越多. 最近想学很多很多东西,但是发现没有一个计划,也没有那么多时间精力,都是想到哪学到哪,有的就是学了一半就放下了,又去学新的,感觉需要规划一下学习路线,时间什么的 推荐一个 ...
- Vue.js的小例子--随便写的
1.领导安排明天给同事们科普下vue 2.简单写了两个小例子 3.话不多说直接上代码 <!DOCTYPE html> <html> <head> <meta ...
- <随便写>数据库调优的几种方式
1.创建索引 要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引 在经常需要进行检索的字段上创建索引,比如要按照表字段username进行检索,那么就应该在姓名字段 ...
随机推荐
- 解决MySQL 8.0 设置简单密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy require...
MySQL8.0下设置简单密码出现错误提示:ERROR 1819 (HY000): Your password does not satisfy the current policy requirem ...
- 典型相关分析 CCA
最近有小伙伴在问我一个数据分析的问题, 做毕设, 实证分析. 不知道改如何处理数据. 看了下设计的量表大致是这样的, 都是 5级的里克特量表, 大致分为两波, X, Y. 小伙伴认为就只有两个变量, ...
- 一文玩转NGINX(对于NGINX,你真的了解吗?)
前言 nginx [engine x] 是一个 HTTP 和反向代理服务器, 邮件代理服务器, 和一个通用的 TCP/UDP 代理服务器, 最初由 Igor Sysoev. 运行了很久 在许多负载重的 ...
- React-Native开发鸿蒙NEXT-多bundle的加载
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- Spring Boot微服务设置logback日志打印级别并关闭kafka debug日志
摘要:以关闭Spring Boot微服务kafka日志为例,介绍logback日志框架中logger标签的属性. 问题描述 在Spring Boot整合kafka的时候,日志配置使用 logbac ...
- 全国省市json文件
[ { "label": "北京市", "value": "北京市", "children": [ ...
- 在idea里面如何配置自己的tomcat
第一:到官网上去下载自己电脑对应的tomcat版本 第二:下载后解压 在bin目录里面找到: 双击打开是不是会出现: 然后再在bin里面找到:shutdown.bat 双击给他关闭了 第三:在我的电脑 ...
- 【运维必看】雷池社区版自动 SSL:从申请到部署全自动化,让证书续期从此 “无感”!
雷池社区版自动SSL 作者:夜猫(社区9群) 正常安装雷池,并配置站点,暂时不配置ssl 不使用雷池自带的证书申请. 安装(acme.sh),使用域名验证方式生成证书 先安装gityum instal ...
- 一站式运维管家 ChengYing 主机接入原理解析
之前的文章中,我们已经为大家介绍了 ChengYing 的安装原理.产品包制作.产品线部署等内容,本篇将和大家介绍一个困扰许多开发者的内容--ChengYing 主机接入.帮助所有对 ChengYin ...
- Blazor学习之旅(1)初步了解Blazor
2022年9月以来在学习Blazor做全栈开发,因此根据老习惯,我会将我的学习过程记录下来,一来体系化整理,二来作为笔记供将来翻看.作为第一篇,我们先来了解一下这个Blazor到底是个什么鬼. 什么是 ...