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. Android数据存储之SD卡文件操作

    赶上智能手机刚问世时有幸用过的小伙伴都知道,那时候的Android系统是把我们自己买的SD卡作为外部存储的,但是不知道从哪天开始,SD卡就被固化到智能手机的内部了,但是我们仍然把它称为外部存储.我想A ...

  2. JS获取标签内容的方法

    JS获取标签内容的方法 测试代码 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  3. js image to base64 摘录

    //传入图片路径,返回base64 //用处,由于在新增时,使用的是base64的格式,为了统一,在编辑时,也将图片转为base64,以便于统一处理 /* 使用: 因为图像处理存在一定的延时,所以通过 ...

  4. 初识linux&常用命令&目录文件的浏览和管理

    Linux系统的主要用途:主要用于服器务器,特别是网络服务 Linux命令格式 命令   [选项]  [ 参数] 命令:告诉操作系统做什么,执行什么 选项:说明命令的运行方式(可以改变命令的功能).选 ...

  5. 在 myeclipse 引入项目

    1.进入 myeclipse 在界面空白处,右键,出现如下图所示 2.选择 Import...,弹出如下图所示界面 3.双击上图红框内的内容,弹出如下图所示界面,然后点击按钮“Browse...”,选 ...

  6. linux c++调试日志函数

    #ifndef MYLOG_H #define MYLOG_H #include <stdio.h> #define __DEBUG__ #ifdef __DEBUG__ #define ...

  7. POJ-3984-迷宫问题(bfs+记录路径)

    定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, ...

  8. 12306 VS 淘宝双十一

    最近过年买票回家经常听到的一句话就是,md 12306又崩了..卧槽..心累.. 但其实有不了解的真相. 为什么12306要时不时崩一下 另一边双十一几亿人同时购物疯狂败家剁手都没有问题,为什么123 ...

  9. Quartz.NET 2.x教程

    第1课:使用Quartz第2课:工作和触发器第3课:关于工作和JobDetails的更多信息第4课:有关触发器的更多信息第5课:SimpleTriggers第6课:CronTriggers第7课:Tr ...

  10. 1307E - Cow and Treats 二分 枚举边界 容斥

    1307E - Cow and Treats 题意 有一排给定口味的草,并且给m头牛,每个牛都只吃一种口味的草,并且要吃给定数量个.现在可以安排牛从两边出发,方向向另一方向进发,每次路过符合他口味的草 ...