Balanced Sequence
题意
给你几个含有左右括号的串,你可以任意组合,求组合能得到的最大的括号匹配数量。
贪心。
具体贪心法可以见代码。
看!代码
1 |
|
给你几个含有左右括号的串,你可以任意组合,求组合能得到的最大的括号匹配数量。
贪心。
具体贪心法可以见代码。
1 | #include <bits/stdc++.h> |
给你一个n,代表有n个队伍,一个k,代表每个队伍中有k个战士,对应k个经验值,我方队伍中也有k个战士。
输入我方战士的k个战斗力,
接下来每一行输入敌方每个队伍k个战士的战斗力,打败k个战士后可以得到的经验值。
只有我方k个战士的战斗力均对应大于敌方某个队伍中k个战士的战斗值,才能得到相应的k个经验,提升战斗力,然后接着跟其他的队伍打。
问你我方战士每个人最后最多能为多少战斗力?
k<=5,n<=1e5,保证得到的战斗力在int范围内。
首先由于读入数据大,先来个读入挂。
然后我们可以对每一种敌方战士(列),建立k个优先队列,以战斗值小为上。
然后不断循环,每次从第1个战士开始和第1个队列中的敌方战士打,如果强于他,就弹出这个战士,并记录这个战士对应的队伍中的战败情况,一旦他们的队伍全军覆没,我方每个战士就可以得到相应的经验值,然后和第i个队列中的战士打,一直到i=k为止,结束一轮循环。
然后一直循环直到某一次循环中不再有打赢他们的情况出现。
1 | #include <bits/stdc++.h> |
给你n个点,m条边,要求从1号走到n号,每条边上都有一种颜色,如果你在相同颜色的边上走,不会有额外的花费,但是如果你从一种颜色的边走到另一种颜色的边上,那么就要加1的花费,求的是最小花费。
1<=n<=1e5, 0<=m<=2e5
多组。
如果直接bfs优先队列处理大顶堆的话,把跑过的点或者边标记了的话,是考虑不周到的。
如:
6 8
1 2 2
2 3 2
3 4 2
1 4 1
1 5 1
4 5 2
5 6 2
2 6 1 答案应该是1,但是很多都容易输出2。
正确的做法是,用set[i]储存每次到达点i的前驱结点,如果到达这个点的花费比历史中到达这个点的最小花费要大,就continue,如果相等,前驱结点在set中,continue,如果不在set中,就放入set中,如果小于的话,就把set[i]清空,然后把历史最小花费mincost[i]更新了,并且把前驱结点放到set中(我发现放这条边的颜色也是可以的),然后对当前这个点连出去的每一条边继续判断,如果不是反向边,而且mincost[nxt]>=((当前颜色!=下个颜色)+mincost[i]),就把mincost[nxt]更新了,并且如果nxt点不是终点,就把nxt点push到优先队列中,优先队列存的是每一个点的到达状态,按照到达的花费从小到大放。
1 | #include <bits/stdc++.h> |
定义:
$$
F_1=A
$$
$$
F_2=B
$$
$$
F_n=D\cdot{}F_{n-1}+C\cdot{}F_{n-2}+\lfloor\frac{P}{n}\rfloor
$$
求Fn,Mod1e9+7。
一看到这个向下取整!
多么亲切啊!
整除分块啊!
……
一开始怎么都想不出来怎么把分块用进去,队友一波机智,先分块,然后矩阵快速幂,哇,秒啊,然后两个小时过去了……
由于莫比乌斯中我们经常会用到一个分块的概念:
$$
\sum_{i=1}^n\lfloor\frac{n}{i}\rfloor
$$
1 | for(int l=1,r;l<=n;l=r+1) |
那么我们就想,因为矩阵快速幂要求的是尾项是个常数,而对于这个整除来说,在某些区间内它的值是一定的,因此我们就可以先把他们划分为好几块,然后对于每个区间进行矩阵快速幂即可,有些细节注意,比如说次数不足3次时,要手写一波判断,因为没有需要的Fn-1,Fn-2,比如n小于p的时候,需要在循环内直接结束,比如n大于p的时候,分块结束后再进行裸的矩阵快速幂。
1 | #include <bits/stdc++.h> |
就是给你n个模式串,长度总和不超过1e6,给你一个匹配串,长度不超过1e6,然后要求是把匹配的字符换成”*”。
AC自动机,在标记尾节点的地方(个数)顺带标记一下匹配串的最长长度,然后用vector pair存一下每次匹配时的位置和匹配的长度,最后对于每一pair进行处理。(对了 先把模式串用小写的保存下来,因为不区分大小写)
1 | //该程序不能判别相同模式串,因此若模式串重复,答案会将相同模式串当做不同的处理,因此若需要可以用map去重或修改insert |
1 | //该程序不能判别相同模式串,因此若模式串重复,答案会将相同模式串当做不同的处理,因此若需要可以用map去重或修改insert |
结构体版
1 | #include<iostream> //查询匹配的数量 ,不知道有没有带重复的 |
求:
$$
Ans=\sum_{i=1}^{n}\sum_{j=1}^m\frac{φ(ij)}{φ(i)φ(j)}%p
$$
其中,n,m<=1e6, max(n,m)<=p<=1e9,且p为素数。
##思路
由欧拉函数公式:
$$
φ(x)=x(1-\frac{1}{p_1})(1-\frac{1}{p_2})(1-\frac{1}{p_3})…(1-\frac{1}{p_n}),其中p_i为x的质因子
$$
将公式带入$\frac{φ(ij)}{φ(i)φ(j)}$中:
$$
原式=\frac{ij(1-\frac{1}{c_1})…(1-\frac{1}{c_t})}{i(1-\frac{1}{a_1})…(1-\frac{1}{a_n})j(1-\frac{1}{b_1})…(1-\frac{1}{b_m})}
$$
$$
=\frac{1}{(1-\frac{1}{a_1})(1-\frac{1}{a_2})…(1-\frac{1}{b_1})(1-\frac{1}{b_2})…}
$$
上下同乘以gcd(i,j),则可以得到:
(这里虽然讲不清楚但是大致是一个容斥)
$$
原式=\frac{gcd(i,j)}{gcd(i,j)-gcd(i,j)/质因数的任意组合+gcd(i,j)/所有质因子的组合}
$$
$$
=\frac{gcd(i,j)}{φ(gcd(i,j))}
$$
因此
$$
Ans=\sum_{i=1}^{n}\sum_{j=1}^m\frac{gcd(i,j)}{φ(gcd(i,j))}%p
$$
令k=gcd(i,j),并枚举k,有:
$$
Ans=\sum_{i=1}^{n}\sum_{j=1}^m\sum_{k=1}^{min(n,m)}\frac{k}{φ(k)}[gcd(i,j)==k]%p
$$
$$
=\sum_{k=1}^{min(n,m)}\frac{k}{φ(k)}\sum_{i=1}^{n}\sum_{j=1}^m[gcd(i,j)==k]%p
$$
$$
=\sum_{k=1}^{min(n,m)}\frac{k}{φ(k)}\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{k}\rfloor}[gcd(i,j)==1]%p
$$
$$
=\sum_{k=1}^{min(n,m)}\frac{k}{φ(k)}\sum_{i=1}^{\lfloor\frac{n}{dk}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{dk}\rfloor}
\sum_{d=1}^{min(n,m)}μ(d)%p
$$
$$
=\sum_{k=1}^{min(n,m)}\frac{k}{φ(k)}\sum_{d=1}^{min(n,m)}μ(d){\lfloor\frac{n}{dk}\rfloor}{\lfloor\frac{m}{dk}\rfloor}%p
$$
就可以做啦!
枚举k=1~min(n,m),先分析出要预先求的东西:
预处理:由于n/dk向下取整时,当dk>n,值为0,因此我们只要先枚举dk=1到min(n,m)即可。
然后对于for(k),dk为d的倍数增长,此时,d=dk/k,将μ(dk/k)、n/dk、m/dk相乘,取模得到F(k)+=。
计算:然后就可以一个大循环,枚举k从1~min(n,m),求得k*逆元(φ(k)),再*先前求得的F(k),并取模即可。
注意:由于时间限制, 取模一定要尽量少取。特别是在预处理阶段中,求F(k)时,由于F(k)是重复累加的,因此若是每一次累加都取模,会造成不必要的时间浪费,因此我们可以把F(k)开long long,然后在全部预处理完毕之后再一次性for取模。
1 | #include <bits/stdc++.h> |
## Recovery
给两行,由01组成,一行表示行中1的个数,一行表示列中1的个数,奇数为1,偶数为0。
如果不能构造就是-1,能就输出原来的矩阵的样子。
按照1尽可能的多,然后字典序小。
不太好说,这个。。。。就。。。看代码吧。
主要是发现行列之间1的关系,以及如何放比较好,。
1 | #include <bits/stdc++.h> |
“我把集市上买的一颗热葡萄塞进嘴里,肆意的甜蜜在口腔蔓延,甚至闻起来也是紫色的。”
这大概是在整部电影中让我印象最深刻的一句话了。
在徐志摩先生笔下,佛罗伦萨(翡冷翠)是有风穿过橄榄林带来着石榴花香,蓝天白云下有色彩鲜艳的隔壁,深绿色的百叶窗和深红色的屋顶,隔着夜,隔着天,通着恋爱的灵犀一点。旅行、到一个五颜六色的地方,认识五颜六色的陌生人。在看完这部电影之后,我几乎就想即刻动身了。我知道有这么一个地方,它有充足的阳光,适合葡萄生长,也适合酿造爱情和生活,“当太阳照在山顶上的伊特鲁里亚石壁上,洋槐树就被镶上金边,色彩柔和的房子沿着小河岸弯弯曲曲的排列,如同水彩画一般”,“微风吹拂的白色窗帘,墙角灰白色的陶罐,麦田里新收的草卷儿”。我希望一动不动的盯着这片土地,天旋地转。旅行的魅力。
而托斯卡纳的乡野,总会使人联想起高更、梵高那些大师们的画笔,大片大片浓厚的色彩,金色的、橘色的、紫罗兰色的,这般会流动的色彩。语言在其面前是多么苍白。如果可以,我甚至想把那些灿烂的色彩贴在这张白纸上。像墨绿的火焰一样朝向天空的树林,金光流溢的草原,盛开的虞美人,色彩的盛宴。
这里有达芬奇,有文艺复兴,还有郁郁葱葱长满葡萄藤的山坡。
然后弗兰西斯来到了这里。
在明信片上写下了“紫色”的心情,开始改变,是托斯卡纳送给她的第一份礼物。
原本只是一场失意的旅行,却用自己所有的积蓄买下了一座破败不堪的,连水龙头都出不了水的小房子——“Bramasole”,意大利语向往阳光的意思。命运的突然就像是在“Bramasole”中被白鸽的粪便砸中,而过去就像海中突然陆沉的岛屿,一下子消失不见了。然后一切就成真了。新生活是具体的,一砖一瓦,雕花的铁床,栏杆上的画像,刚刚成熟的橄榄,从此她拥有“三口水井、一条罗马古道、一处伊特拉斯坎人的古城墙遗址、一条地下信道、一百一十七棵橄榄树、二十棵李树、以及其他数也数不清处的果树和花丛,还可以在屋外铺着亚麻布的长桌上,吃着用院子里才来的鼠尾草做馅料的意大利方饺,敲开路边捡来的球果、用其中的松仁做出香味四溢的老祖母馅饼……”这座房子实在是太老了,就像你会随时倒下去长眠不醒的老祖母。
而生活就是与人不停的邂逅,不停的与周边的环境发生关系。
在她落寞绝望时充满耐心的安慰她的可靠的房产中介,靠美和灵性生活,永远纯真如孩童叫她振作起来的神秘女郎,帮法兰西斯修房子的修缮工们,还有每天早晨为路边的圣母像献上鲜花,悼念亡妻的老人,以及属于她的一场短暂的罗曼蒂克史。
一点一点回移的日子就好像小野丽莎的歌,fly me to the moon,柔柔软软轻轻悄悄的,不经意而温柔的掠过。
治愈是我所有能形容这部电影的词汇。
其实那个时候刚好是我生活的极大转折点——一个不知道会往哪里转向的,不知是褒义还是贬义的转折点。说不知道,但当时的我,连呼吸都是不知所措。在不愿意接受的悲伤中也思考生活的方向,我知道我为什么不愿意接受这样的转折,尽管它的本质是好的。就像弗兰西斯,离婚也是她不愿意接受的事实,是很难走出来的人生巨大的转折点。在这样的时刻,往往所有的注意力会被吸引,会失去对其他事物的热情,天晴的时候在下雨,下雨的时候整个人都会湿透。弗兰西斯在忙碌琐碎的装修之中顾不及心碎的滋味,但我一静下来,手头空空荡荡的时候,各种情绪翻江倒海的来了,落魄不止。
我听到弗兰西斯一个人的嘶喊:
“我一个人住那么大的房子有什么用?”
那你为什么还要在这里?
“因为我厌倦了恐惧,因为我的心底仍然有希望。”
“我想要在这里举办一场婚礼,我想要有一个家。”
有时候遇到很糟糕的境遇,躲不开、避不掉的重重压力围城,生活被就像被胡乱泼了墨。在这个时候,希望是最美好的东西。
好心的中介讲了这么一个故事,他说奥地利和意大利之间的阿尔卑斯山脉中有一段叫做塞默灵,那段山脉地势险峻,令人望而生畏,他们在那里建造了连通维也纳和威尼斯的铁路。尽管当时根本没有火车可以驶过,但他们依然把铁轨铺好了,因为他们知道总有一天会有火车驶过。
你不必期待、不必翘首以盼,该来的总会来,而你,只需要做好准备。
杨绛先生说:“人的一切痛苦本质上都是对自己无能的愤怒。”有时候我们不快乐,是因为想要的太多,希望一切都在自己的手里。但是又何必呢,我们掌握不了的东西就任其流浪,有一句很俗很俗的话讲,该来的总会来。“当我还是个小女孩时,我总是数小时地看瓢虫,最后,我会放弃,然后在草地上睡着了。当我醒来的时候,它们爬得我满身都是。”
影片的最后,弗兰西斯的愿望在托斯卡纳实现了。她想要一个家,托斯卡纳给了她一个靠自己撑起来的家;她想要一场婚礼,一对漂亮真挚的小爱人在她的家里举办了婚礼;她想要孩子,她的好友带着自己刚出世的宝宝和自己的同性恋人来她的房子度假。她想要的一切都有了,只是换了一种方式。
最终,屋子里干涸的水龙头会有潺潺的流水,而好事总会来到,而当它来晚时,也不失为一种惊喜。
“希望你也在这里。”
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. 找单词,八方找,正反找。看了题解 好像是先判断了一下回文减少了一下长度?
B. 最少按下的按钮次数
用bfs,时间小于0,变成0,大于3600,变为3600。vis[i]记录时间为i的最少步骤数目。
1 | #include <bits/stdc++.h> |
G. 水
I. 计算组成n的最小的两个斐波那契数a b,其中按b小来排,且a<b
由上可知,先计算出最大的两个相邻数相加小于n的地方,设为x,y(x<y),然后xa+yb=n,从b=1开始求满足条件的a,且a<b。
1 | #include <bits/stdc++.h> |
J. 把迷宫设置大,然后从中间模拟
B. 最小路径覆盖,网络流,最大流
1 | #include <bits/stdc++.h> |
E. 求次短路是否等于最短路长。
1 | #include <cstdio> |
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…
1001 Maximum Multiple 水。
1002 Balanced Sequence 贪心题。对于左右括号的情况分类,然后按照规则排序。具体见代码。
1 | #include <bits/stdc++.h> |
1003 Triangle Partition 水。 对x,y按照升序排序再每次取三个就好了。
1004 Distinct Values 给你一个n,一个q,表示数列中有n个元素,q个区间询问,每次一个[l,r],表示此区间内的数字不能有重复,要求输出最小字典序的。用set维护一下区间内的数字出现情况就好了。
1 | #include <bits/stdc++.h> |
1007 Chiaki Sequence Revisited 数学题。
1 | #include <bits/stdc++.h> |
1011 Time Zone 水。
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 | #include <stdio.h> |
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 | #include <bits/stdc++.h> |
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 | #include <bits/stdc++.h> |
C. Cryptographer’s Conundrum 水
D. Disastrous Downtime 水,取最大的ai~ai+1000范围内的数字个数即可。
E.Entertainment Box n个节目,k个录像带,给出每个节目的播放时间,求最多能录几个节目。
用multiset维护当前正在录制的所有节目的结束时间,二分找到最接近下一个要录的节目的起始时间且小于起始时间的录像带,把这个录像带中的r替换成下一个要录的节目,cnt++,如果没有找到并且集合的size还不到k个的话,就直接把r放进去,cnt++。最后输出cnt。
1 | #include <bits/stdc++.h> |
G.Goblin Garden Guards 给n个哥布林的位置(x,y),给出m个圆,对于每一个圆,输出最大的不在圆内的哥布林数目。
由于哥布林的位置是整数,那么对于圆,可以预处理出距离圆心0~r范围内的x最大偏差值和y的最大偏差值,如果哥布林的x,y与圆心的偏差值有一者在最大偏差值之外,就cnt++。
1 | #include <stdio.h> |
A. Teemo’s bad day 裸的并查集,判断两个数字的根是否一样,不一样就cnt++,顺便union即可。(好久没写并查集find都写炸)
1 | #include <bits/stdc++.h> |
B. Teemo’s hard problem 题目意思是给你一个数列,你可以任意反转[L,R],使得这个数列的非递减序列最长。
1 | #include <bits/stdc++.h> |
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 | #include<iostream> |
A. Coins 概率dp….不懂不懂
B. The Difference 水题
D. Fence Building 一个圆,一个圆的内接n边形,连接多边形对角线,求整个圆被分割成几块。
OEIS大法好。。。
1 | #include<stdio.h> |
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 | #include <bits/stdc++.h> |
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 | #include<bits/stdc++.h> |
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 | #include <bits/stdc++.h> |
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 水。直接写。
B. Best Solver (补)
C. Minimum Cut (补)
F. Fang Fang 水。
J. Jesus Is Here 有、搞的题。把递推关系算出来……表示不想再写一编代码,就那个意思反正。
1 | #include<bits/stdc++.h> |
M. Largest Point 写的我脑子有点不清楚了……
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 | #include <bits/stdc++.h> |
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+剪枝。
写出下列几个操作:
1 | #include <bits/stdc++.h> |
K. Expression in Memories 表达式中有一些是用?代替的,问你这个表达式能否符合正确的要求,能的话输出任意成立的表达式(不含?)。注意细节,一开始对“+0?”单独扫,?填运算符号。完了之后就按顺序扫,判断是否符合。(注意细节,容易wa)
1 | #include <bits/stdc++.h> |
L. Graph Theory Homework 水,得到结论:根号函数的性质:$\sqrt{a+b+c+…}\le\sqrt{a}+\sqrt{b}+\sqrt{c}+…$
有一个容量为2n的背包,n种食物,每种食物的体积为i,最多有$a_i$个,除了食物,还有m件装备,每件装备的体积是$b_i$,必须带一件装备,问2n的背包能够装下的所有情况种数?
1<=n<=5e4 , 0<=ai<=2n , 1<=m<=2n,0<=bi<=2n。
背包全部装食物的方案数:
$$
\prod_{i=1}^n(1+x^i+x^{2i}+…+x^{a_ii})=\prod_{i=1}^n\frac{1-x^{i(a_i+1)}}{1-x^i}
$$
$$
=\prod_{i=1}^n(1-x^{i(a_i+1)}) \prod_{i=1}^n(\frac{1}{1-x^i})
$$
对于左边的累乘进行分析:
$$
(1-x^{i(a_i+1)})(\sum_{j=1}^{2n}dp[j]x^j)
$$
$$
=\sum_{j=1}^{2n}dp[j]x^j-\sum_{j=1}^{2n}dp[j]x^{i(a_i+1)+j}
$$
我们将j向右移$i*(a_i+1)$位,则:
$$
=\sum_{j=1}^{2n}dp[j]x^j-\sum_{j=i(a_i+1)}^{2n+i(a_i+1)}dp[j-i(a_i+1)]x^j
$$
$$
=\sum_{j=1}^{i(a_i+1)}dp[j]x^j+\sum_{j=i(a_i+1)}^{2n}(dp[j]-dp[j-i(a_i+1)])x^j
$$
(由于2n以后的项都没有意义,所以可以减少到2n)
$$
dp[j]=dp[j]-dp[j-i*(a_i+1)]
$$
对于右边的累乘:
$$
\prod_{i=1}^n(\frac{1}{1-x^i}) = \prod_{i=1}^{2n}(\frac{1}{1-x^i}) \prod_{i=n+1}^{2n}({1-x^i})(不满2n所以补上)
$$
$$
Q(x)=\sum_{i\ge1}(1-x^i)=\sum_{i\ge1}(-1)^i(x^{\frac{3i^2-i}{2}}+x^{\frac{3i^2+i}{2}})=(1-x)(1-x^2)…=1-x-x^2+x^5+x^7+……
$$
整数拆分的式子是这样的:
$$
P(x)=(1+x+x^2+…)(1+x^2+x^4+…)(1+x^3+x^6+…)
$$
$$
=\prod_{i\ge1}(1+x^i+x^{2i}+…)=\prod_{i\ge1}\frac{1}{1-x^i} (x<1无穷等比数列求级数)
$$
因此我们可以看到:Q(x)P(x)=1,也就是说:
$$
(1-x-x^2+x^5+x^7+……)(1+p(1)x+p(2)x^2+p(3)x^3+…)=1
$$
因此我们考虑,对于每项x^n前面的系数,必定有:
$$
p(n)-p(n-1)-p(n-1)+p(n-5)+p(n-7)……=0
$$
因此得递推式:
$$
p(n)=p(n-1)+p(n-1)-p(n-5)-p(n-7)……
$$
可以求出dp[i]=p[i]。(i<=2n)
对于右边的式子$\prod_{i=n+1}^{2n}({1-x^i})$,由于累乘$x^a*x^b=x^{(a+b)}$,故对于a+b>2n的都可以舍去。
就化为了:
$$
1-\sum_{i=n+1}^{2n}x^i
$$
$$
P(x)(1-\sum_{i=n+1}^{2n}x^i),P(x)=\sum_{i=1}^{2n}dp[i]x^i
$$
$$
=\sum_{i=1}^{2n}dp[i]x^i -\sum_{i=n+1}^{2n}dp[i-n-1]x^i-\sum_{i=n+2}^{2n}dp[i-n-2]x^i-……
$$
$$
=\sum_{i=1}^{n}dp[i]x^i+x^{n+1}(dp[n+1]-dp[0])+x^{n+2}(dp[n+2]-dp[1]-dp[0])+……
$$
$$
+x^{2n}(dp[2n]-dp[n-1]-dp[n-2]-…-dp[0])
$$
也就是说对于所有dp[i],i>=n+1,<=2n的,都进行减去sum[i-n-1] (前缀和)的操作。即:
$$
dp[i]=dp[i]-\sum_{j=1}^{i-n-1}dp[j]
$$
那么所有的部分就都算完啦!!!!!!
啊啊啊啊啊啊啊啊啊啊啊啊啊
1 | #include <bits/stdc++.h> |
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true