10.19 qbxt国庆day3

最近的题都莫名简单

经常AK

炼金术

【问题描述】

即使是最伟大的ACM选手也是需要足够的金钱来把妹的的。于是ZYB发明了一台炼金机器.
这台机器一共有三个功能:

1.能把a位沙子变成b位石油.

2.能把c位石油变成d位金子.

3.能把e位金子变成f位沙子.

值得注意的是你并不需要用整单位的物品进行兑换,例如你可以利用0.1 沙子来兑换0.1 石油。

然而现在ZYB里手只有10^100的沙子,他想考考你,他能否得到无穷多的金子?

【输入格式】

从文件 a.in 中读入数据。

第一行一个正整数T,表示数据组数.

接下来T行,每行6个整数a_i,b_i,c_i,d_i,e_i,f_i.

【输出格式】

输出到文件 a.out 中。

对于每组数据,如果ZYB能产生无穷多的金子就输出YES,否则输出NO.

【样例输入】

(本题样例输入输出有10万组,这里取前6组作为展示)

6
198 226 169 343 676 825
0 74 904 423 852 249
250 613 912 549 515 76
20 783 0 670 874 494
382 908 220 930 343 51
226 608 97 969 740 630

【样例输出】

YES
YES
NO
YES
YES
YES

【数据规模】

对于50%的数据,所有数都不为0.

对于50%的数据,没有任何限制。

以上的数据档互不相交.

对于所有的数据,满足\(1\le T\le100000, 0\le a,b,c,d,e,f\le1000\).

【题解】

如果我们有1的沙子,可以变成\(\displaystyle\frac b a\)的石油,进而可以变成\(\displaystyle\frac{bd}{ac}\)的金子,进而可以变成\(\displaystyle\frac{bdf}{ace}\)的沙子。如果\(bdf>ace\)那么就可以进入高产循环,进而能产生无限金子。

但是当他们中有0呢?我们从根源来考虑问题:

  • 如果d=0,因为你没有金子,而且你无法产生金子,所以你无法得到金子。
  • d不等于0:
    • 如果c=0,那么你可以从没有石油无中生有出金子,所以能产生无限金子喽。
    • 如果c不等于0,那么石油可以转化为金子,你有了无限石油就有了无限金子。
      • 我们再分析石油,如果b=0,那么你不能产生石油,所以你无法得到金子。
      • 如果b不等于0:那么就能产生石油了。
        • 如果a=0,那么你可以产生无限石油,进而产生无限金子。
        • 如果a不等于0:继续分析,那么您就能从沙子转化为金子
          • 我们继续分析沙子,如果f=0,那么如果你想要产生无限金子,你是需要把沙子再转化成沙子的,显然现在不可以,所以就不能
          • 如果f不等于0:你就能转化出沙子
            • 如果e=0,那么你就有无限沙子,从而无限石油,从而就有无限金子
            • 如果e不等于0,就是六个值都不等于0,那么就套用上面的式子即可。

神仙题。。。。。。。。。。。。。

矩阵循环

【问题描述】

给出一个N行M列的01矩阵,现在我们每次可以将某一行整体循环左移一位,或者将某一行整体循环右移一位.(例如11000循环右移一位会变成01100,而循环左移一位会变成10001)现在要求你用最少的步数,来使得这个矩阵里至少有一列全部都是1.为了方便你只需要输出这个步数。

【输入格式】

从文件 b.in 中读入数据。

第一行两个整数N,M,描述矩阵的大小。

接下来𝑌,每行一个长度为M的01串。

【输出格式】

输出到文件 b.out 中。

一行输出答案.如果无论如何也不存在解就输出−1.

【样例输入】

3 6
101010
000100
100000

【样例输出】

3

【数据规模】

对于30%的数据,N,M≤ 5.

对于20%的数据,每行至多有一个1.

对于20%的数据,M≤ 100

对于30%的数据,没有任何限制。

以上的数据档互不相交.

对于所有的数据,满足1 ≤ N ≤ 100, 1 ≤ M ≤ 10^4.

【题解】

处理一个数组,f[i][j]表示让第i行第j列有1(别的列不管),第i行需要旋转的次数

让所有1的位置bfs即可

GMPotlc提供了更好的做法:维护一个向左一个向右然后取min(但是好像需要开三倍数组)

每一列的f相加为让最后所有1在这一列上的答案

答案为所有列取min

注意如果有一行全是0,那么肯定无解,那么这一行的f设成0x3f3f3f3f即可,其实有更好的做法一开始直接判断。

最短路

【问题描述】

你来到了一个陌生的世界,这个世界,是一座完整的城市。

这座城市由N条东西向和M条南北向的街道构成,分别标号为1, 2, ...., N,两边都是一样。令(x,y)为第x条南北向街道和第y条东西向街道构成的交点。

在这座城市,街道之间的距离基本都是固定,且只会是1或者5.第i条南北向街道与第i+1条南北向街道的距离是D_i,第i条东西向街道与第i+1条东西向街道的距离是E_i。

初来乍到,第一件该做的事情就是熟悉街道。你一共熟悉了Q天街道,每天从(Sx,Sy)跑到(Ex,Ey).你只能够沿着街道走,并且不能跑到边界之外(最边上的街道就是边界).同时,这个城市有个奇怪的规定,若你正在走一条南北向的街道,到下一个路口,就必须走东西向的街道。(具体看图,注意图中的不一定是最优解).

其实题面少一句:若你正在走一条东西向的街道,到下一个路口,就必须走南北向的街道。这句话在样例1中没有体现,但在样例2(下面的样例2为评测时的第一个测试点)中体现了。如果没有这句话,第三题的答案应该为11而非13(by ghj1222)

现在你想知道,对于这Q天每天你最少需要走多少距离。

【输入格式】

从文件 c.in 中读入数据。

第一行,两个正整数n,Q.

第二行,N-1个整数D_i.

第三行,N-1个整数E_i.

接下来Q行,每行四个正整数Sx,Sy,Ex,Ey.

【输出格式】

输出到文件 c.out 中。

Q行,,每行一个整数.

【样例输入1】

10 3
5 1 5 5 5 1 1 5 5
1 5 5 5 1 5 5 1 5
4 3 9 10
9 2 2 9
5 1 5 10

【样例输出1】

46
50
49

【样例输入2】

5 5
1 5 1 5 
1 1 1 5 
3 3 2 1
2 4 3 1
4 4 5 5
2 2 5 2
5 4 3 2

【样例输出2】

7
10
10
13
8

【数据规模】

对于10%的数据,\(N,Q\le5\).

对于30%的数据,\(N,Q\le100\).

对于60%的数据,\(N,Q\le1000\).

对于100%的数据,\(1\le N,Q\le100000,1\le Sx,Sy,Ex,Ey\le N\).

【题解】

大水题。。。

可以当做最短路做,可以拆点,也可以连斜边(by olinr)

注意到交换Sx和Ex,交换Sy和Ey答案不变

其实横纵坐标是分开的

我们设dx=|Ex-Sx|,dy=|Ey-Sy|,那么如果|dx-dy|<=1,那么可以直接走过去而不用绕远。处理出横纵坐标前缀和直接输出即可。

那么如果大于1呢?我们假设dx-dy>1(dy-dx>1同理不写了),那么说明在x坐标上走的比较长,因为需要交替的走,所以y坐标上需要绕远一下。我们把从Sy到Ey的称为基础的路程,那么剩下就是绕远的路程了。我们绕远绕一个来回,那么不难推出有\(\displaystyle\frac{dx-dy}{2}\)个来回。设他为rest。

由于我们要找最短距离,所以尽量绕小的,也就是1的格子。

如果从Sy到Ey中途有1那么就太棒了,直接在中途绕就行了。答案为rest*2

如果从Sy到Ey中途没有1,那么有两种解决方案:

一是在中途绕长度为5的格子。。。rest*10

二是离开Sy到Ey的区间取区间外面寻求长度为1的格子。假设我们在区间外部走了dis的距离,走到了一个临近长度为1的格子的格点,那么答案为dis*10+(rest-dis)*2。注意可能出现rest-dis<0的情况,就是我们走不到一个长度为1的格子,那么暴力一点直接和0取max,

答案为这两种情况取min呢

那么怎么求dis呢?怎么判断区间里是否有1呢

我们预处理一个数组lx[i]和rx[i],表示i向左/右走能走到长度为1的格子需要走的距离。如果i这个点与一个长度为1的格子相邻,那么lx[i]=rx[i]=0。这个数组不难用O(N)的复杂度递推出来。

对于一个区间,处理出两个端点的l和r,其中dis为左端点l和右端点r取min,如果左端点r和右端点l小于等于区间长度(事实上这两个同时满足或同时不满足)那么就有1在区间内。

posted @ 2018-10-19 15:05  ghj1222  阅读(347)  评论(1编辑  收藏  举报