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在区间内。