7.7 [BAPC 2014 Preliminary](https://www.jisuanke.com/contest/1403)
A. 思维题,重点在于当剩余的n<k时,只要k%n==0就可以成功,比如 64 6的时候,先约分:32:6,再约:16:6,一直约到 1:6 ,那n=1,当然ok。
B. dijkstra最短路一下
D. Dp,结束后想了一下,dp[i]表示第i层停下来的所有怨气,dp[i]=min(dp[i],dp[j] + val(j->i)) ,(j<i)i之前电梯停在j层,然后从j直接到i 的话,加上这一部分的怨气就好了val,而valij的怨气就是i的前缀和加上若每一层都停的怨气,再减去了j层停下来的人消失的这部分怨气。
F. 飞行航道 水
J. 找单词,八方找,正反找。看了题解 好像是先判断了一下回文减少了一下长度?
7.10 [ Benelux Algorithm Programming Contes](https://www.jisuanke.com/contest/1404)
B. 最少按下的按钮次数
用bfs,时间小于0,变成0,大于3600,变为3600。vis[i]记录时间为i的最少步骤数目。
1 |
|
G. 水
I. 计算组成n的最小的两个斐波那契数a b,其中按b小来排,且a<b
由上可知,先计算出最大的两个相邻数相加小于n的地方,设为x,y(x<y),然后xa+yb=n,从b=1开始求满足条件的a,且a<b。
1 |
|
J. 把迷宫设置大,然后从中间模拟
7.12
B. 最小路径覆盖,网络流,最大流
1 |
|
E. 求次短路是否等于最短路长。
1 |
|
F. 求大数因子个数,用大数分解求出质因数
7-12German Collegiate Programming Contes…
7-14 https://www.jisuanke.com/contest/1444
7-17The 2018 ACM-ICPC Chinese Collegiate…
7-19 German Collegiate Programming Contes…
7.23 [多校1 ](http://acm.hdu.edu.cn/contests/contest_show.php?cid=802)
1001 Maximum Multiple 水。
1002 Balanced Sequence 贪心题。对于左右括号的情况分类,然后按照规则排序。具体见代码。
1 |
|
1003 Triangle Partition 水。 对x,y按照升序排序再每次取三个就好了。
1004 Distinct Values 给你一个n,一个q,表示数列中有n个元素,q个区间询问,每次一个[l,r],表示此区间内的数字不能有重复,要求输出最小字典序的。用set维护一下区间内的数字出现情况就好了。
1 |
|
1007 Chiaki Sequence Revisited 数学题。
1 |
|
1011 Time Zone 水。
7.25 [ 多校2](http://acm.hdu.edu.cn/contests/contest_show.php?cid=803)
1003 Cover 没看题,听了题解,大概是给你一个无向图,让你求至少要多少一笔画才能把它画完。一笔画有两种情况,一种是欧拉路,一种是欧拉回路,也就是说,对于图中的所有点,度数为奇数的要么是0(回路),要么是2(一个进来的点,一个出去的点)。所以要把一个图构造成欧拉路/回路的话,就意味着要在图中x个奇数度的点中连接x/2条边,然后在对于新生成的图,找欧拉路,然后再把添上去的x/2条边删去,分成的几条路就是一笔画的结果。
1004 Game 水题,先手必赢。先手可以取或者不取1。
1005 Hack It 不知所措的构造题。要求是构造出一个n*n(n<=2000)的矩阵,你可以在里面填黑点,但是你不能让任意四个黑点组成一个矩形(四个角),要求是至少包含85000个黑点。老实说,我无法理解构造方法。
1007 Naive Operations 线段树 题解
1010 Swaps and Inversions 水题。数逆序数对,再乘以min(x,y)即可。这里我发现逆序数对数有x个,就可以通过交换相邻数字x次使得它不存在逆序数。
用归并排序可以得到逆序数对个数。
1 |
|
7.24 [ The 2018 ACM-ICPC China JiangSu Prov..](https://www.jisuanke.com/contest/1408)
A. Plague Inc 水题暴力,遍历每个点到感染源的路求最远。
B. Array n个数,k对逆序数,求可能的方案数。这是一道DP 。
D. Persona5 公式题
E. Massage 公式结论题
I. T-shirt ////////////////////////////////////
J. Set 结论是(n+1)!-1,用java写
K. Road 连通图,删去尽可能多的路,使得每个城市到第0号城市的最短路长度不变,求可能的方案数量。
用floyd先求出每个城市之间的最短路,然后对每条0i城市的最短路,判断0j城市的距离加上i到j的原始距离是否还和最短路相等,相等的话,在j城市上的最短路径+1。最后将他们乘起来。
1 |
|
7.26 [ Nordic Collegiate Programming Contes...](https://www.jisuanke.com/contest/1410)
A. Adjoin the Networks 回头补把。
B. Bell Ringing 用生成全排列的邻位互换法:(具体方法解释可以看排列组合的文章)
仔细想想不就是把n插入到已完成的n-1阶排列的不同位置中得到n阶排列吗?
n=1; 1
n=2; 12 , 21
n=3; 123, 132, 312, 321, 231, 213
……
用这种方法可以产生出任意n阶全排列,(而且符合bellring中的移动规律,即每个数移动的位置最多为1,就能一下子构造出n!个不重复的全排列)
1 |
|
C. Cryptographer’s Conundrum 水
D. Disastrous Downtime 水,取最大的ai~ai+1000范围内的数字个数即可。
E.Entertainment Box n个节目,k个录像带,给出每个节目的播放时间,求最多能录几个节目。
用multiset维护当前正在录制的所有节目的结束时间,二分找到最接近下一个要录的节目的起始时间且小于起始时间的录像带,把这个录像带中的r替换成下一个要录的节目,cnt++,如果没有找到并且集合的size还不到k个的话,就直接把r放进去,cnt++。最后输出cnt。
1 |
|
G.Goblin Garden Guards 给n个哥布林的位置(x,y),给出m个圆,对于每一个圆,输出最大的不在圆内的哥布林数目。
由于哥布林的位置是整数,那么对于圆,可以预处理出距离圆心0~r范围内的x最大偏差值和y的最大偏差值,如果哥布林的x,y与圆心的偏差值有一者在最大偏差值之外,就cnt++。
1 |
|
7.28 teemo场
A. Teemo’s bad day 裸的并查集,判断两个数字的根是否一样,不一样就cnt++,顺便union即可。(好久没写并查集find都写炸)
1 |
|
B. Teemo’s hard problem 题目意思是给你一个数列,你可以任意反转[L,R],使得这个数列的非递减序列最长。
1 |
|
C. Teemo’s tree problem 又是一个dp
F. Teemo’s dream 没看题
G .Teemo’s convex polygon 将多边形对角线相连,其对角线最多被分割成多少段?
$$
max=(n^4-6n^3+17n^2-24*n)/12
$$
J. Teemo’s formula 结论是$Σ_{k=1}^nk^2C_n^k=2^{n-2}n(n+1)$
K.Teemo’s reunited 求的是其他所有的点到某一点的距离和的最小值,就是曼哈顿距离。HDU 4311Meeting point-1
这题也是用“分治”,虽说题目要求的是曼哈顿距离,但是我们为什么真的就要一步到位的求呢,可以横纵坐标分开求,先x排序,然后遍历一遍,求出横坐标的距离,然后y排序,遍历一遍求出坐标的距离加在刚才求得的x的距离上,就是曼哈顿距离了。
这里有一个非常巧妙但是其实很显而易见的东西:假定现在我们已经按x排好序了分别是ABC三个点,那么C到AB的距离和是|C-A|+|C-B|,又因为已经排序了,那么绝对值可以去掉,得(C-A)+(C-B),那么就是2*C-(A+B),也就是说一个点到它前面的点的距离的和等于它前面的点的个数乘以它的自己再减去前面所有点的和,到这里你是不是想到求一个数列的和的时候我们遍历一遍数列就得到了,通过这个方法我们用O(n)就得到了一个点到它前面的点的距离和,然后再倒着遍历一遍数列用相似的思想把它到它后面的点的距离再加上就行了。
还有一种也是分开x,y排序求和,不过可以这么做:先直接求出最前面的点到所有点的距离,然后依次遍历数列,通过后面一个点跟前面一个点的关系,找出差值相减,就是了。不明白的话仔细想想或者画图看看。
1 |
|
7.29
A. Coins 概率dp….不懂不懂
B. The Difference 水题
D. Fence Building 一个圆,一个圆的内接n边形,连接多边形对角线,求整个圆被分割成几块。
OEIS大法好。。。
1 |
|
G.The Mountain 水
I. A Possible Tree 给你一棵树,q个询问,问的是x->y路径上的异或和为val , 问你最多有几个询问是真的?
带权并查集。由于异或的特点,假设某个点为根,比如0,那么比如2->5的异或值,就是2->1的异或值和5->1的异或值异或一下。所以我们用yihuo[i]来表示i到源点的异或和。如果两个数的源点已经一样,那么判断一下val==yihuo[i]^yihuo[j]即可,若是不一样,就把他们union,同时yihuo[rootp]=yihuo[p]^yihuo[q]^val。
1 |
|
K. Sum of the Line 给你一个n,分析之后发现求的是所有gcd(n,i)=1(i<=n)的数的平方和。
用容斥,先用公式$\frac{n(n+1)(2n+1)}{6}$求出1~n的平方和,然后筛出sqrt(n)内的素数,并求出n的所有质因数,然后对于质因数的乘积tot,如果质因数的个数是奇数,就加上$tot^2*(1^2+2^2+3^2……+(n/tot)^2)$,是偶数就减去。
或者用莫比乌斯反演来做
(补莫比乌斯反演做法)
1 |
|
7.30 多校三
A. Problem A. Ascending Rating 输入n,m,k,p,q,r,MOD,表示一个长度为n的数列,给你前k个数字,(后面的要根据递推式自己写),然后m表示一个[l,l+m]的区间,从l=1开始,在这个区间中有两个值,一个是MAX,一个是CNT,起始都为0,从区间的第一个数开始扫,如果扫到的数字比MAX大,让MAX=ai,并且CNT++。求的是$A =\sum_{i=1}^{n-m+1}{MAX_i 异或i}$ , $B=\sum_{i=1}^{n-m+1}{CNT_i 异或i}$
思路是用一个单调队列从最后一个区间往前倒着维护,如果队列为空,则直接放入ai,若ai>=队首元素,则将队列中的元素全部弹出,同时将ai放入,若ai小于队首元素,则将队尾中小于ai的元素弹出,将ai放入队尾中,每一个区间的cnt值即为队列中元素的个数,而MAX值则为队首元素。如果队首元素的位置不在下一个区间范围内,则弹出。注意STL的双端队列会被卡,这里可以用数组直接模拟。(可以补一个正向写的,但是我WA到死,主要就是用单调栈来维护每一个数字右边的第一个比他大的位置,最后一个栈里的数的stack设为n+1,然后从右到左,dp[n-1]=1,dp[i]=dp[stack[i]]+1,………然后单调队列维护区间最大值)
1 |
|
C. Problem C. Dynamic Graph Matching 在一个图中,任意k条不共点的边可以构成一个匹配。给你n个点,有q个操作,操作分两种,一种是+ u v,在u v中间连线,一个是- u v,删边,两点之间可以连多条路线。问你对于每一次操作,k=1,2,…… n/2的匹配方案分别有多少?
思路:树状DP。(补)
D. Problem D. Euler Function 水。求φ(n)为合数的第k个数。根据规律可看到,从第7个开始就都是偶数。
F. Problem F. Grab The Tree 水。很容易看出sum=0时平手,否则就是先手赢。
L. Problem L. Visual Cube 水。直接写。
7.31 ACM-ICPC 2015 Shenyang Preliminary C…
B. Best Solver (补)
C. Minimum Cut (补)
F. Fang Fang 水。
J. Jesus Is Here 有、搞的题。把递推关系算出来……表示不想再写一编代码,就那个意思反正。
1 |
|
M. Largest Point 写的我脑子有点不清楚了……
8.1多校4
B. Harvest of Apples 题意是从n个苹果里面选取最多m个苹果的方案数量。m、n、t<=1e5
思路:莫队分块+组合预处理,原来莫队中的区间[l,r]在这里用n、m代替了。
接下来是推公式部分:
S(n,m)表示$\sum_{i=1}^n\sum_{j=1}^mC_i^j$
我们可以得出$S(n,m)=S(n,m-1)+C_n^m$ ,——-①
又因为有$C_n^m=C_{n-1}^m+C_{n-1}^{m-1}$(组合数学的一个基本公式),因此又可以推出:$S(n,m)=S(n-1,m)+S(n-1,m-1)=2S(n-1,m)-C_{n-1}^m$——–②
有了①②两个式子,我们就可以得到S(n,m)和S(n-1,m)、S(n+1,m)、S(n,m-1)、S(n,m+1)之间的关系,先预处理出n!和相应的需要的逆元,然后把输入的查询分块,按照代码中所示的“套路”排序法,排一排,然后对于每个n,m开始处理,分四种情况这样。
1 |
|
D. Nothing is Impossible 水,按占比来算就好。
E. Matrix from Arrays 讲一下思想吧,再写一边代码的话可能又要写一万年。对于这个块的计算,比如这个块的四个角顺时针分别叫:a,b,c,d,将(0,0)点到(i,j)点的里面所有的数字和叫做pre,那么就是pre[b]-pre[b]-pre[d]+pre[a]。分析一下就可以得到,对于所有的无限大的矩阵,他都是重复某个特定的矩阵来的。这些矩阵有以下长度规律:(L为给定数组的长度,L从1~10,)
len[1]=1,len[2]=4,len[3]=3,len[4]=8,len[5]=10,len[6]=12,len[7]=14,len[8]=16,len[9]=18,len[10]=20。
矩阵为n*n。
故对于给定的L和数组可以先处理出重复矩阵的样子,然后再进行分块和的计算。
关于分块和的计算(pre),把块内完整的小矩阵的个数算出来求个和,除了完整的还有不完整的,不完整的其实也好看,就是矩阵最左边和最上面的部分,也用pre算出来就行。
J. Let Sudoku Rotate 数独,有一个16*16的数独 数独内的数字从0~E,一开始数独是完美的,可是有个人逆时针旋转了数独中的某几块(4x4),导致数独不完美了,给你这个旋转后的数独,要求还原他至少要再旋转几步?
dfs+剪枝。
写出下列几个操作:
- 顺时针旋转4*4的方块;
- 判断每行的总和是否都为120;
- 判断每行和每列的元素是否都不重复;
- dfs,由于一行块有4个分块,因此四重循环,同一个x分别对应y的起始:0,4,8,12,循环+1表示旋转次数+1,如果在2、3的判断中都满足这写要求,说明可以进行下一个x+4(起始行)块的旋转操作dfs,step+本次旋转的操作(i,j,k,l四重循环),要是不满足还是要继续。当x==16或者是step比当前已知的最小ans要大的时候都可以return。
1 |
|
K. Expression in Memories 表达式中有一些是用?代替的,问你这个表达式能否符合正确的要求,能的话输出任意成立的表达式(不含?)。注意细节,一开始对“+0?”单独扫,?填运算符号。完了之后就按顺序扫,判断是否符合。(注意细节,容易wa)
1 |
|
L. Graph Theory Homework 水,得到结论:根号函数的性质:$\sqrt{a+b+c+…}\le\sqrt{a}+\sqrt{b}+\sqrt{c}+…$