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组的更多相关文章

  1. 2019-08-21 纪中NOIP模拟A组

    T1 [JZOJ6315] 数字 题目描述

  2. 2019-08-15 纪中NOIP模拟B组

    T1 [JZOJ3455] 库特的向量 题目描述 从前在一个美好的校园里,有一只(棵)可爱的弯枝理树.她内敛而羞涩,一副弱气的样子让人一看就想好好疼爱她.仅仅在她身边,就有许多女孩子想和她BH,比如铃 ...

  3. 2019-08-01 纪中NOIP模拟B组

    T1 [JZOJ2642] 游戏 题目描述 Alice和Bob在玩一个游戏,游戏是在一个N*N的矩阵上进行的,每个格子上都有一个正整数.当轮到Alice/Bob时,他/她可以选择最后一列或最后一行,并 ...

  4. 2019-08-25 纪中NOIP模拟A组

    T1 [JZOJ6314] Balancing Inversions 题目描述 Bessie 和 Elsie 在一个长为 2N 的布尔数组 A 上玩游戏. Bessie 的分数为 A 的前一半的逆序对 ...

  5. 2019-08-23 纪中NOIP模拟A组

    T1 [JZOJ2908] 矩阵乘法 题目描述 给你一个 N*N 的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第 K 小数. 数据范围 对于 $20\%$ 的数据,$N \leq 100$,$Q ...

  6. 2019-08-20 纪中NOIP模拟B组

    T1 [JZOJ3490] 旅游(travel) 题目描述 ztxz16如愿成为码农之后,整天的生活除了写程序还是写程序,十分苦逼.终于有一天,他意识到自己的生活太过平淡,于是决定外出旅游丰富阅历. ...

  7. 2019-08-20 纪中NOIP模拟A组

    T1 [JZOJ6310] Global warming 题目描述 给定整数 n 和 x,以及一个大小为 n 的序列 a. 你可以选择一个区间 [l,r],然后令 a[i]+=d(l<=i< ...

  8. 2019-08-18 纪中NOIP模拟A组

    T1 [JZOJ6309] 完全背包 题目描述

  9. 2019-08-09 纪中NOIP模拟B组

    T1 [JZOJ1035] 粉刷匠 题目描述 windy有N条木板需要被粉刷. 每条木板被分为M个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一 ...

  10. 2019-08-17 纪中NOIP模拟B组

    T1 [JZOJ3503] 粉刷 题目描述 鸡腿想到了一个很高(sha)明(bi)的问题,墙可以看作一个N*M的矩阵,有一些格子是有污点的.现在鸡腿可以竖着刷一次,覆盖连续的最多C列,或者横着刷一次, ...

随机推荐

  1. shadow文件中密码的加密方式

    1) 查看shadow文件的内容 cat /etc/shadow 可以得到shadow文件的内容,限于篇幅,我们举例说明: root:$1$Bg1H/4mz$X89TqH7tpi9dX1B9j5YsF ...

  2. Mybatis的增删改和log4j的基础配置

    带条件查询 mapper文件的内容: <select id="getSelectElectron" resultType="electron"> s ...

  3. 纪中集训2020.02.03【NOIP提高组】模拟B 组总结反思——登机(board),游戏(game),分组(group)

    T1 JZOJ5535. 登机(board) 比赛时 一在题目列表里看到题目标题,就热血沸腾了,不知道为什么,老师居然放了一道之前做过的题目.我清楚地记得这题是DP,于是很快码了出来.讲一讲我的思路, ...

  4. Python获取时间范围

    import datetime def dateRange(beginDate, endDate): dates = [] dt = datetime.datetime.strptime(beginD ...

  5. Win10安装4 —— 通过BIOS进入PE

    本文内容皆为作者原创,如需转载,请注明出处:https://www.cnblogs.com/xuexianqi/p/12369367.html 一:"BIOS"与"PE& ...

  6. python3.6安装lxml库

    好像是在python3.5之后,安装了lxml也无法使用etree 为了就解决这个问题使用如下方法: 1.下载lxml的wheel文件,下载地址:https://www.lfd.uci.edu/~go ...

  7. 第70届(2019)IMO中国国家队选拔考试试题

    (几何除外)1,几何,略2,给定n≥3,是否存在无穷个2n元集{a1,...,an,b1,...,bn}满足其中元素整体互素,a1,...,an成等差数列,b1,...,bn也成等差数列.3,给定k, ...

  8. Python-Django学习笔记(二)-创建一个Django项目与应用

    1.创建一个Django项目 打开cmd命令行,设置好工作目录(cd 目录路径),然后输入 django-admin startproject projectname #必须安装好Django才可以执 ...

  9. Alice and Hairdresser

    Alice's hair is growing by leaps and bounds. Maybe the cause of it is the excess of vitamins, or may ...

  10. PYthon之路Day12

    生成器 核心:生成器的本质就是一个迭代器 程序员自己写的一种迭代器 作用:节省空间 生成器可以使用for进行遍历 生成器编写方式: 基于函数编写 def func():    print('这是一个函 ...