csp-s模拟测试 56
A. Merchant
对于一个确定的集合,只可能是先减后增、单调增、>0部分的单调减
减的最优出现在0,check下
没有就直接二分值域,对于x,选出最大的m个函数值验证。
nth_element可以做到O(n)
B. Equation
式子可以化成与自身和x1有关,分奇偶讨论x1前的符号。
边的贡献在其子树,BIT维护dfs序差分前缀和,区间修改,单点查询(get祖先链上的信息)。
C. Rectangle
鸽.
csp-s模拟测试64
A. trade
反悔贪心:
a<b<c,在b卖a可能不最优,如这情况。那么我们留给c一个反悔的机会。
发现b-a+c-b=c-a,这就很好了。直接加两个b,一个b用来抵消在b卖a转而在取出位置卖a,一个用于单纯卖b。
反悔贪心难在构造反悔操作,其实是基于性质。
所以拿到题一定要推性质,无论是dp还是贪心,都能对简化问题有帮助。
B. sum
考试的时候没有打表,没看出来规律。
发现$S_{n,m}$可以由$S_{n-1,m},S_{n,m-1}$递推,转移O(1)。
然后把询问转换询问[m,n],莫队解决。
C. building
大模拟。
并查集维护连通关系,把矩形看作点,相邻关系看作边,发现点数-边数(合并次数)=连通块数,这个式子的前提是无环,并查集保证了这一点。
题解所说相邻关系与K同阶,不太会证,口胡一下就是
矩形有两边长为1,称为短边,反之长边。所有矩形长边上的相邻关系之和不会超过K个,每个矩形短边上至多有两个。然而对于很混乱的情况,胡了胡了。
这样的话就允许我们枚举相邻关系,如果我们能快速的找到相邻关系,复杂度就有保障。
考场上打了$x_1==x_2$的部分分。不太会处理横竖交错的。
正解:用一堆vector维护一堆信息,分类不漏就行。
快速查找相邻关系用lower_bound
Get到新姿势:假如我要在struct node{int l,r;}类型的vector中找到大于等于x的第一个下标
bool cmpr(const Node &a,int b){return a.r<b;} int p1=lower_bound(h[d-1].begin(),h[d-1].end(),L,cmpr)-h[d-1].begin();
注意cmpr的参数顺序
csp-s模拟测试65
期望得分:60+100+8
实际得分:60+60+10
A. Simple
考试的时候没细看范围
观察到n很小,一定有阴谋
如果枚举y,对于一个y可算出c在[1,q]内有多少正整数x,然而会重复。
用最小y去统计c就好了。
可知$yin [0,min( frac {n} {gcd(n,m)},left lfloor frac{q}{m} ight floor)]$
记得加上$x=0,y=i$除去$x=0,y=0$
B. Walk
这题考场上写了个hash表dp,不是菊花图很优秀
dp方法类似Park,由于这题没有up down之分,儿子只用dp一遍,然而考场上傻了,做了两遍,常数爆炸。
正解:枚举gcd,加入所有是gcd倍数的边,求森林最长链。稍卡常。
最近的低错在另个里。