2019-08-05 纪中NOIP模拟B组
T1 [JZOJ1432] 输油管道
题目描述
请你帮忙设计一个从城市M到城市Z的输油管道,现在已经把整个区域划分为R行C列,每个单元格可能是空的也可能是以下7种基本管道之一:
油从城市M流向Z,‘+’型管道比较特殊,因为石油必须在两个方向(垂直和水平)上传输,如下图所示:
现在恐怖分子弄到了输油管道的设计图,并把其中一个单元格中的管道偷走了,请你帮忙找到偷走的管道的位置以及形状。
数据保证石油的流向是唯一的,只有一个管道跟M和Z相连,除此此外,保证没有多余的管道,也就是说所有的管道在加进被偷的管道后一定都会被用上。
数据保证有解而且是唯一的。
数据范围
$1 \leq R,C \leq 25$
分析
开局打150行搜索的我就是个铁憨憨,这题浪费了好多时间啊...
由于起点和终点之间的管道是唯一的,所以只要枚举每个单元格中的管道,如果管道通向了空地,那么这片空地就是被拆除管道的位置
然后通过判断该位置需要连接的方向,就可以得到管道形状
如果是起点或终点旁边的管道被拆除,就需要进行一些特判
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 30 int n, m, x, y, x1, y1, x2, y2, s, e;
int book[], d[][] = {, , , , , -, -, };
char g[N][N]; void check(int i, int j, int dir) {
int dx = i + d[dir][], dy = j + d[dir][];
if (g[dx][dy] == '.') x = dx, y = dy, book[(dir + ) % ] = ;
else if (g[dx][dy] == 'M') s = ;
else if (g[dx][dy] == 'Z') e = ;
} int main() {
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++) {
scanf(" %c", &g[i][j]);
if (g[i][j] == 'M') x1 = i, y1 = j;
if (g[i][j] == 'Z') x2 = i, y2 = j;
}
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++) {
if (g[i][j] == '|') check(i, j, ), check(i, j, );
else if (g[i][j] == '-') check(i, j, ), check(i, j, );
else if (g[i][j] == '+') check(i, j, ), check(i, j, ),
check(i, j, ), check(i, j, );
else if (g[i][j] == '') check(i, j, ), check(i, j, );
else if (g[i][j] == '') check(i, j, ), check(i, j, );
else if (g[i][j] == '') check(i, j, ), check(i, j, );
else if (g[i][j] == '') check(i, j, ), check(i, j, );
}
if (!s && !e) {
if (x1 == x2) printf("%d %d -", x1, (y1 + y2) >> );
else printf("%d %d |", (x1 + x2) >> , y1);
}
else {
if (!s) {
for (int i = ; i < ; i++)
if (x1 + d[i][] == x && y1 + d[i][] == y)
book[(i + ) % ] = ;
}
else if (!e) {
for (int i = ; i < ; i++)
if (x2 + d[i][] == x && y2 + d[i][] == y)
book[(i + ) % ] = ;
}
if (book[] && book[] && book[] && book[]) printf("%d %d +", x, y);
else if (book[] && book[]) printf("%d %d |", x, y);
else if (book[] && book[]) printf("%d %d -", x, y);
else if (book[] && book[]) printf("%d %d 1", x, y);
else if (book[] && book[]) printf("%d %d 2", x, y);
else if (book[] && book[]) printf("%d %d 3", x, y);
else if (book[] && book[]) printf("%d %d 4", x, y);
} return ;
}
T2 [JZOJ1433] 数码问题
题目描述
Alice有一个N*N的格子,把1-N^2按照从上到下从左到右的顺序填进表格中,允许在表格上进行两种操作:
(1) 旋转行——这一行的数向右移动一个位置,而最后一列的数会移到第一列;
(2) 旋转列——这一列的数向下移动一个位置,最后一行的数会移到第一行。
Alice想把数X移到(R,C)处可以采用以下方法:
• 如果X不在C这一列,通过旋转行操作把X移到C这一列;
• 如果X不在R这一行,通过旋转列操作把X移到R这一行。
Alice现在想采用上述方法,依次把K个数移到各自的目标位置,编程计算每个数需要几次操作。
数据范围
$1 \leq N \leq 10^4$,$1 \leq K \leq 10^3$
分析
如果每次都将整个矩阵移动,那么 $O(nk)$ 不仅会 $TLE$ 的,还会 $MLE$
实际上真正需要用到的数字只有 $K$ 个,其他数字在题中其实是无效的
所以只需要记录这 $K$ 个数字的位置,每次把他们移动就可以了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 1005 int n, m, k, l1, l2, ans;
int x[N], y[N], r[N], c[N]; int main() {
scanf("%d%d", &n, &k);
for (int i = ; i <= k; i++) {
scanf("%d%d%d", &m, r + i, c + i);
x[i] = (m + n - ) / n;
y[i] = m - (x[i] - ) * n;
}
for (int i = ; i <= k; i++) {
l1 = (c[i] - y[i] + n) % n;
for (int j = ; j <= k; j++)
if (x[i] == x[j]) {
y[j] += l1;
if (y[j] > n) y[j] -= n;
}
l2 = (r[i] - x[i] + n) % n;
for (int j = ; j <= k; j++)
if (y[i] == y[j]) {
x[j] += l2;
if (x[j] > n) x[j] -= n;
}
printf("%d\n", l1 + l2);
} return ;
}
T3 [JZOJ1434] 灌水
题目描述
学生都很喜欢灌水,第一天只有Alice给她的每个朋友灌了一次水,从第二天开始,所有学生(包括Alice)将会有规律地去灌水:
• 如果前一天被灌了奇数次的水,他们将会给每个朋友灌一次水;
• 如果前一天被灌了偶数次的水,他们将会给每个朋友灌两次水。
学生编号为1到N,Alice为1号,学生之间的朋友关系会给出。
计算H天后一共灌了几次水。
数据范围
对于 $50 \%$ 的数据,$1 \leq H \leq 10^3$
对于 $100 \%$ 的数据,$1 \leq N \leq 20$,$1 \leq H \leq 10^9$
分析
看这个数据范围,显然状压,$0$ 表示前一天被灌了偶数次水,$1$ 表示前一天被灌了奇数次水
然后如果是一天天推过去,只能得到 $50 \, pts$
但其实状压的所有状态只有 $2^n$ 种,所以在 $2^n$ 天内一定会出现至少一次循环
所以只需要找出这个循环节,就不用把每一天的状态都推出来了
时间复杂度就优化为了 $O(2^n n)$
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 21 ll ans, pre[ << N];
int n, h, k, t, last, now;
int g[N], book[ << N], cnt[N];
char c[]; int main() {
scanf("%d%d", &n, &h);
for (int i = ; i <= n; i++) {
scanf("%s", c + );
for (int j = n; j >= ; j--) {
if (c[j] == '') g[i] <<= ;
else g[i] = (g[i] << ) | , cnt[i]++;
}
}
ans += cnt[]; now = g[];
pre[] = ans; book[now] = ;
for (k = ; k <= h; k++) {
last = now; now = ;
for (int i = ; i <= n; i++) {
if (last & ( << i - )) {
ans += cnt[i];
now ^= g[i];
}
else ans += cnt[i] * ;
}
pre[k] = ans;
if (book[now]) break;
book[now] = k;
}
if (k >= h) {printf("%lld\n", ans); return ;}
t = (h - book[now]) / (k - book[now]);
ans += (t - ) * (pre[k] - pre[book[now]]);
k += (t - ) * (k - book[now]) + ;
for (; k <= h; k++) {
last = now; now = ;
for (int i = ; i <= n; i++) {
if (last & ( << i - )) {
ans += cnt[i];
now ^= g[i];
}
else ans += cnt[i] * ;
}
}
printf("%lld\n", ans); return ;
}
T4 [JZOJ1435] 开花
题目描述
在遥远的火星上,上面的植物非常奇怪,都是长方形的,每个植物用三个数来描述:左边界L、右边界R以及高度H,如下图所示描述一个植物:L=2,R=5和H=4。
aaarticlea/JPG;base64,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" alt="" width="168" height="117" />
每天都有一个新植物长出来,第一天的植物高度为1,后面每天长出的植物比前一天的高1。
当一个新植物长出来的时候,跟其他植物的水平线段相交处会长出一朵小花(前提是之前没有长出花朵),如果线段交于端点,是不会长花的。
下面为示意图:
给出每天的植物的坐标,计算每天长出多少新花。
数据范围
$1 \leq N \leq 10^5$,$1 \leq L \leq R \leq 10^5$
分析
线段树区间修改+单点查询
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 100005
#define lc (p << 1)
#define rc ((p << 1) | 1)
#define mid ((l + r) >> 1) int n, m;
int L[N], R[N], sum[N]; struct Tree {
int val, mark;
} t[ * N]; void build(int p, int l, int r) {
t[p].val = t[p].mark = ;
if (l == r) return;
build(lc, l, mid);
build(rc, mid + , r);
} void pushDown(int p, int l, int r) {
if (t[p].mark) {
t[lc].val += t[p].mark * (mid - l + );
t[rc].val += t[p].mark * (r - mid);
t[lc].mark += t[p].mark;
t[rc].mark += t[p].mark;
t[p].mark = ;
}
} void update(int p, int l, int r, int ql, int qr) {
if (l > qr || r < ql) return;
if (l >= ql && r <= qr) {
t[p].val += (r - l + );
t[p].mark += ;
return;
}
pushDown(p, l, r);
update(lc, l, mid, ql, qr);
update(rc, mid + , r, ql, qr);
t[p].val = t[lc].val + t[rc].val;
} int query(int p, int l, int r, int q) {
if (l > q || r < q) return ;
if (l == r) return t[p].val;
pushDown(p, l, r);
return query(lc, l, mid, q) + query(rc, mid + , r, q);
} int main() {
scanf("%d", &n);
for (int i = ; i <= n; i++) {
scanf("%d%d", L + i, R + i);
m = max(m, R[i]);
}
build(, , m);
for (int i = ; i <= n; i++) {
int v1, v2;
if (R[i] - L[i] > ) update(, , m, L[i] + , R[i] - );
v1 = query(, , m, L[i]);
v2 = query(, , m, R[i]);
printf("%d\n", v1 - sum[L[i]] + v2 - sum[R[i]]);
sum[L[i]] = v1; sum[R[i]] = v2;
} return ;
}
2019-08-05 纪中NOIP模拟B组的更多相关文章
- 2019-08-21 纪中NOIP模拟A组
T1 [JZOJ6315] 数字 题目描述
- 2019-08-15 纪中NOIP模拟B组
T1 [JZOJ3455] 库特的向量 题目描述 从前在一个美好的校园里,有一只(棵)可爱的弯枝理树.她内敛而羞涩,一副弱气的样子让人一看就想好好疼爱她.仅仅在她身边,就有许多女孩子想和她BH,比如铃 ...
- 2019-08-01 纪中NOIP模拟B组
T1 [JZOJ2642] 游戏 题目描述 Alice和Bob在玩一个游戏,游戏是在一个N*N的矩阵上进行的,每个格子上都有一个正整数.当轮到Alice/Bob时,他/她可以选择最后一列或最后一行,并 ...
- 2019-08-25 纪中NOIP模拟A组
T1 [JZOJ6314] Balancing Inversions 题目描述 Bessie 和 Elsie 在一个长为 2N 的布尔数组 A 上玩游戏. Bessie 的分数为 A 的前一半的逆序对 ...
- 2019-08-23 纪中NOIP模拟A组
T1 [JZOJ2908] 矩阵乘法 题目描述 给你一个 N*N 的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第 K 小数. 数据范围 对于 $20\%$ 的数据,$N \leq 100$,$Q ...
- 2019-08-20 纪中NOIP模拟B组
T1 [JZOJ3490] 旅游(travel) 题目描述 ztxz16如愿成为码农之后,整天的生活除了写程序还是写程序,十分苦逼.终于有一天,他意识到自己的生活太过平淡,于是决定外出旅游丰富阅历. ...
- 2019-08-20 纪中NOIP模拟A组
T1 [JZOJ6310] Global warming 题目描述 给定整数 n 和 x,以及一个大小为 n 的序列 a. 你可以选择一个区间 [l,r],然后令 a[i]+=d(l<=i< ...
- 2019-08-18 纪中NOIP模拟A组
T1 [JZOJ6309] 完全背包 题目描述
- 2019-08-09 纪中NOIP模拟B组
T1 [JZOJ1035] 粉刷匠 题目描述 windy有N条木板需要被粉刷. 每条木板被分为M个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一 ...
- 2019-08-17 纪中NOIP模拟B组
T1 [JZOJ3503] 粉刷 题目描述 鸡腿想到了一个很高(sha)明(bi)的问题,墙可以看作一个N*M的矩阵,有一些格子是有污点的.现在鸡腿可以竖着刷一次,覆盖连续的最多C列,或者横着刷一次, ...
随机推荐
- Tomcat + mysql + myeclipse 启动遇到的问题
1. 问题: Tomcat启动时报错如下:Table 'performance_schema.session_variables' doesn't exist 2. 网络上普遍找到的解决办法: 控制台 ...
- MY_0002:导出单位设置
1,导出模型给canvas工具用时,设置单位为m,再参考模型所占网格大小.
- Jquery基础(动画效果的轮播图特效)
jquery文档准备的三种写法: $(document).ready(function() { }); $().ready(function() { }); $(function() { }); jq ...
- 数位dp(模板+例题)
文章参考:数位dp之总结 首先,什么是数位dp?它是干什么的? 数位dp是一种计数用的dp,一般就是要统计一个区间[le,ri]内满足一些条件数的个数. 举个栗子: 加入我们要枚举所有上界不超过231 ...
- 如何使用Mbp模块构建应用.
上一篇文章https://www.cnblogs.com/mbpframework/p/12073102.html,介绍了一下Mbp的框架.其实这个框架写出来主要是为了学习,当然也可以经过优化运用到实 ...
- jQuery---城市选择案例
城市选择案例 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UT ...
- linux-crond_计划任务
定时计划任务 主要文件介绍: [root@nginx ~]# ll /etc/cron* -d drwxr-xr-x. 2 root root 21 7月 11 20:28 /etc/cron.d d ...
- python is 与==区别
总结 is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同.莱布尼茨说过:“世界上没有两片完全相同的叶子”,这个is正是这样的比较,比较是不是同一片叶子(即比较的id ...
- 初识压缩感知Compressive Sensing
压缩感知是近年来极为热门的研究前沿,在若干应用领域中都引起瞩目.最近粗浅地看了这方面一些研究,对于Compressive Sensing有了初步理解,在此分享一些资料与精华.本文针对陶哲轩和Emman ...
- 杭电oj 1087——super jump!jump!jump(java实现)
question:Super Jumping! Jumping! Jumping! 意思就是找一串数字中的和最大子串 思路:创建另一个数组,每一项是路径数组对应项之前最大子串的和,然后遍历此数组找出最 ...