csp-s模拟测试 56~65

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倍数的边,求森林最长链。稍卡常。

最近的低错在另个里。

原文地址:https://www.cnblogs.com/hzoi-yzh/p/11626976.html