2019/10/17 CSP模拟 总结
T1 补票 Ticket
没什么好说的,不讲了
T2 删数字 Number
很后悔的是其实考场上不仅想出了正解的方程,甚至连优化都想到了,却因为码力不足只打了\(O(n^2)\)暴力,甚至还因为细节挂成了\(40\ pts\)
以后还是应该多写一下码农题
规定一下,下面的\(j\)没有特殊说明,取值范围默认在\(1, i - 1\)
考虑什么情况是合法的,首先最后对答案有贡献的元素组成的序列一定是严格上升的,即\(a_i > a_j\)
然后考虑还有没有别的限制呢
放一个图

看到我们的对答案有贡献的序列和其对应的坐标的连边一定是一个越来越倾斜(并且逆时针旋转)的过程,思考一下为什么,发现如果不满足前面那个条件的话实际上是没法通过题目的变换方法得到最终对应的序列
举个例子
1 2 3 5 2
其中的3和5并不能同时对答案作出贡献
所以又有了一个限制条件\(i - a[i] > = j - a[j]\)
看一下两个条件$$a_i > a_j$$ $$i - a[i] > = j - a[j]$$
发现是一个二维偏序
考虑一维一维的处理,先按第一个条件排一下序,然后在排序后的序列上处理后面那个条件,树状数组维护一下
#include<bits/stdc++.h>
#define N (100000 + 10)
#define lowbit(x) (x & (-x))
using namespace std;
inline int read() {
int cnt = 0, f = 1; char c = getchar();
while (!isdigit(c)) {if (c == '-') f = -f; c = getchar();}
while (isdigit(c)) {cnt = (cnt << 3) + (cnt << 1) + (c ^ 48); c = getchar();}
return cnt * f;
}
int n, tot, w, ans, gmax, BIT[N];
void modify(int x, int g) {
for (; x <= gmax; x += lowbit(x)) BIT[x] = max(BIT[x], g);
}
int query(int x) {
int ans = 0;
for (; x; x -= lowbit(x)) ans = max(ans, BIT[x]);
return ans;
}
struct node {
int d, s; //d: i - a[i].s, s: from input
}a[N];
bool cmp(node a, node b) {
return a.d == b.d ? a.s < b.s : a.d < b.d;
}
int main() {
n = read();
for (register int i = 1; i <= n; ++i) {
w = read();
if (w > i) continue;
a[++tot].s = w, a[tot].d = i - w;
gmax = max(gmax, w);
}
sort (a + 1, a + tot + 1, cmp);
for (register int i = 1; i <= tot; ++i) {
int d = query(a[i].s - 1) + 1;
modify(a[i].s, d);
ans = max(ans, d);
} printf("%d\n", ans);
return 0;
}
T3 滑冰 Shortest
感觉题解很好理解,但就是想不到
先说一下算法流程
分别按\(x\)排一个序,\(y\)排一个序,然后相邻的连上边,跑最短路即可
说一下为什么是正确的
首先\(min(|x[i] - x[j]|, |y[i] - y[j]|)\)这个条件是完全不用考虑的,因为最短路本身就是找\(min\)的过程,就算两条边都连上也可以得到正确答案
考虑\(O(n^2)\)暴力,即每个点往其他所有点连边,然后这样显然跑不动
怎么优化呢
上面那个算法很巧妙的一点是,因为我们排过序了,所以两个点之间的连边一定已经是不可以分拆的最小单位了,并且用这些最小单位边一定可以组成其他的边,相当于去除了暴力连边中的重复信息,于是复杂度优化为\(O(nlog(n))\)
#include<bits/stdc++.h>
#define N (1001000 + 10)
using namespace std;
inline int read() {
int cnt = 0, f = 1; char c = getchar();
while (!isdigit(c)) {if (c == '-') f = -f; c = getchar();}
while (isdigit(c)) {cnt = (cnt << 3) + (cnt << 1) + (c ^ 48); c = getchar();}
return cnt * f;
}
int n, z;
struct node {
int x, y;
int pos;
}a[N];
bool cmp(node a, node b) {
return a.x == b.x ? a.y < b.y : a.x < b.x;
}
bool cmp2(node a, node b) {
return a.y == b.y ? a.x < b.x : a.y < b.y;
}
int first[N], nxt[N << 1], to[N << 1], w[N << 1], tot;
long long d[N];
bool vis[N];
void add(int x, int y, int z) {nxt[++tot] = first[x], first[x] = tot, to[tot] = y, w[tot] = z;}
priority_queue < pair<int, int> > q;
void dijkstra() {
memset(d, 0x3f, sizeof d);
memset(vis, 0, sizeof vis);
d[1] = 0;
q.push(make_pair(-d[1], 1));
while (!q.empty()) {
int x = q.top().second; q.pop();
if (vis[x]) continue;
vis[x] = 1;
for (register int i = first[x]; i; i = nxt[i]) {
int v = to[i], z = w[i];
if (d[v] > d[x] + z) {
d[v] = d[x] + z;
q.push(make_pair(-d[v], v));
}
}
}
}
int main() {
// freopen("shortest.in", "r", stdin);
// freopen("shortest.out", "w", stdout);
n = read();
for (register int i = 1; i <= n; ++i) a[i].x = read(), a[i].y = read(), a[i].pos = i;
sort (a + 1, a + n + 1, cmp);
for (register int i = 1; i < n; ++i) {
int z = a[i + 1].x - a[i].x;
add(a[i].pos, a[i + 1].pos, z), add(a[i + 1].pos, a[i].pos, z);
}
sort (a + 1, a + n + 1, cmp2);
for (register int i = 1; i < n; ++i) {
int z = a[i + 1].y - a[i].y;
// cout<<z<<endl;
add(a[i].pos, a[i + 1].pos, z), add(a[i + 1].pos, a[i].pos, z);
}
dijkstra();
printf("%lld", d[n]);
return 0;
}
2019/10/17 CSP模拟 总结的更多相关文章
- 10.17 NOIP模拟赛
目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...
- 【2019.10.17】十天Web前端程序员体验(软件工程实践第五次作业)
结对信息.具体分工 Github地址:https://github.com/MokouTyan/131700101-031702425 学号 昵称 主要负责内容 博客地址 131700101 莫多 代 ...
- 2019.10.26 CSP%您赛第三场
\(CSP\)凉心模拟^_^ --题源\(lqx.lhc\)等各位蒟蒻 题目名称 比赛 传递消息 开关灯 源文件名 \(competition.cpp\) \(message.cpp\) \(ligh ...
- 2019.10.15 CSP初赛知识点整理
初赛需要的知识点整理如下: (1)计算机的硬件组成与基本常识 (2)单位/进制的转换 (3)进制/逻辑运算相关 (4)概率与期望 (5)排序的各种性质 (6)简单数据结构的使用(栈.队列.链表等) ( ...
- 2019.10.29 CSP%您赛第四场t2
我太菜了我竟然不会分层图最短路 ____________________________________________________________________________________ ...
- 2019.10.24 CSP%你赛第二场d1t3
题目描述 Description 精灵心目中亘古永恒的能量核心崩溃的那一刻,Bzeroth 大陆的每个精灵都明白,他们的家园已经到了最后的时刻.就在这危难关头,诸神天降神谕,传下最终兵器——潘少拉魔盒 ...
- 2019.10.28 CSP%您赛第四场t3
我写不动前两个了. 原谅一下. ____________________________________________________________________________________ ...
- 【2019.10.7 CCF-CSP-2019模拟赛 T3】未知的数组(unknown)(并查集+动态规划)
预处理 考虑模数\(10\)是合数不好做,所以我们可以用一个常用套路: \(\prod_{i=l}^ra_i\equiv x(mod\ 10)\)的方案数等于\(\prod_{i=l}^ra_i\eq ...
- 【2019.10.7 CCF-CSP-2019模拟赛 T2】绝对值(abs)(线段树细节题)
找规律 设\(p_i=a_{i+1}-a_i\),则答案就是\(\sum_{i=1}^{n-1}p_i\). 考虑若将\(a_i\)加上\(x\)(边界情况特殊考虑),就相当于是将\(p_{i-1}\ ...
随机推荐
- R:ggplot2数据可视化——进阶(3)
Part 3: Top 50 ggplot2 Visualizations - The Master List, 结合进阶1.2内容构建图形 有效的图形是: 不扭曲事实 传递正确的信息 简洁优雅 美观 ...
- 10个CSS简写技巧
CSS简写就是指将多行的CSS属性声明化成一行,又称为css代码优化.CSS简写的最大好处就是能够显著减少CSS文件的大小,其实还有很多其他益处.臃肿而杂乱的CSS样式表会使你遇到问题是难以调试.尤其 ...
- ES6 学习 -- 箭头函数(=>)
(1).只有一个参数且只有一句表达式语句的,函数表达式的花括号可以不写let test = a => a; // 只有一个参数a,这里的表达式相当于 "return a" ( ...
- Web介绍
web概念概述 javaWeb: 使用java语言开发基于互联网的项目 软件架构: 1.C/S:Client/Server 客户端/服务器端 2.B/S:Browser/Server 浏览器/服务器端 ...
- CSS动画库——animate.css的使用
Animate.css是一款强大的CSS3动画库 官网地址:https://daneden.github.io/animate.css/ 使用方法如下所示: (1)下载animate.css 下载地址 ...
- C++: string copy-on-write
https://blog.csdn.net/haoel/article/details/24058 https://www.cnblogs.com/promise6522/archive/2012/0 ...
- Chrome DNS_PROBE_FINISHED_NXDOMAIN
win10 下的Chrome访问网站时,提示DNS_PROBE_FINISHED_NXDOMAIN 解决方法很简单: 用管理员身份打开cmd后,运行如下指令即可解决问题. 运行命令: netsh wi ...
- 用shell脚本执行php删除缓存文件
<?php #定义删除路径//服务器缓存目录的路径 $path = '/www/wwwroot/****/data/runtime'; #调用删除方法 deleteDir($path); fun ...
- day17 文件处理及简单函数
Python之路,Day5 = Python基础5 常亮 用大写来做提示 chr() # 数字转字符ord() # 字符转数字 读文件 要以读文件的模式打开一个文件对象,使用Python内置的open ...
- BCB编写DLL终极手册
一. 编写 DLL File/New/Dll 生成 Dll 的向导,然后能够添加导出函数和导出类 导出函数:extern "C" __declspec(dllexport) Exp ...