前言
在bzoj的非权限题里面,题目又短有简单的题已经越来越少了。。于是来51Nod里面找点水题做
入门计划
1674 区间的价值 V2
这题的话,很明显地,是让我们把位分开考虑
然后我们考虑两个为
i,j
,也就是
2i
和
2j
,有多少个序列使得他们相乘。
假设
i
是与里面的,
时间复杂度
(nlog2ai)
1737 配对
两点间的距离:
dep[x]+dep[y]−2∗dep[LCA]
容易看出,
dep[x]+dep[y]
是不变的
因此,我们只需要让
2∗dep[LCA]
最小化就可以了
于是考虑贪心策略,以1位根,如果他的所有儿子的LCA都可以是他,那么就结束了,也就是只要重儿子的节点个数不超过我的一半,那么就让子树之前配对就可以了
否则,就记录一个值
o
,表示以
然后以后的重儿子,他的节点个数就可以减去
o
了,因为他多余的可以与祖先匹配
然后就没有了最快
贴一部分重要代码
void solve (LL x,LL o)//在哪一个节点,可以节省多少个了
{
LL s=son[x];
if (tot[s]-o<=tot[x]-tot[s])//直接匹配完成
{
ans=ans-(tot[x]-o)*dep[x];
return ;
}
ans=ans-(tot[x]-tot[s])*dep[x]*2;
solve(s,o+(tot[x]-tot[s]));
}
1829 函数
直接容斥一下就可以了。。
一开始没有线性算阶乘逆元居然T了
真的迷。。不就是
nlogMOD
。。这都能T的吗。。
1073 约瑟夫环 1074 约瑟夫环 V2
以前我的约瑟夫都是用线段树模拟的,一直觉得很棒棒
首先,这题是有一个
O(n)
的递推的方法的
吧人按0~n-1编号
我们考虑有i个人,先做一次,也就是到了
k−1
吧序列排出来,就是
k,k+1,k+2......0,1,2,3.....,k−2
重新编号,使得k变成0,那么我们就可以用
f[i−1]
来直到谁会或者,然后加上k就可以了
在加上不能超出范围,就可以得到递推式
f[i]=(f[i−1]+k)
然后最后那个人,因为是从0开始的,于是要
+1
,然后第一题就做完了
然后第二题,考虑到n很大,也就是说,有很多情况,都是不用取模的,你可以一直加,所以我们可以一大部分地做,可以省下很多时间,就可以通过了
1472 取余最大值
这题的话本来想到了,但是不知道他的复杂度,于是就GG了
首先,看到最大值和区间,不难想到有用单调栈来维护每个点为最大值的区间,然后再在里面乱搞
这里有个小知识,就是这个区间,你按那边少人去那边的做法,就是设一个点为
i
,他的区间是
于是就可以暴力固定一个左端点或者右端点,搞一搞前缀和,就变成了一段区间里面某个数出现个个数,这个随便做做就好了
1323 完美平方
这题的话,是平方数,明显就是让各个质数的出现次数一样啊。。
接着就对行,列,质因数列异或方程解一解就好了。。
做这题的时候,感觉我以前一直写了个假的高斯消元解异或方程组。以前求解都是爆搜的QAQ,现在才知道可以
2k
。然后解的时候没有记录当前可以用的方程pos,然后一直挂,判不好无解23333
贴一个新的板子:
for (int u=1;u<=n*n;u++)//求解
{
int j=-1;
pos=u;
for (int i=pos;i<=num;i++)
if (f[i][u]!=0) {j=i;break;}
if (j==-1) {ans=ans*2%MOD;continue;}
swap(f[pos],f[j]);
for (int i=pos+1;i<=num;i++)
if (f[i][u])
f[i]^=f[pos];
pos++;
}
1577 异或凑数
很棒的一个题啊!!我的线性基果然使用不够熟练啊!
一开始只想到一个很傻的做法,就是用线段树维护一段的线性基,然后每次就可以取出一个区间的线性基了。但是考虑到线性基合并需要
log2
的复杂度,线段树还有一个
log
,果断放弃。。
然后发现线性基还有一个骚操作,就是说你每一个数,维护一下这个为位上的,最左端出现的数在哪里。就是维护一个值x和位置id,然后每一次如果那一位有值了,那么就比较id,让id大的取去配对。用这个方法就看可以顺利地建出f[i],表示后i为的线性基。然后查询的时候就一直匹配,匹配失败有两个情况:1.这一位基里面没有 2.这一位出现的次数比r大。然后就可以
30n
的做出这题了
1230 幸运数
很裸的一个数位DP吧。。
考虑到能够出来的值不多。。
因为
81∗18=1458
9∗18=162
因此直接DPf[i][a][b][tf]表示前i位,和是什么,平方和是什么,是否有限制就可以了
有两个小技巧:时间戳,还有对于没有限制的不清0,直接记忆化就可以过
一开始
n,m
没有开
LL
,不知道在想什么。。
1667 概率好题
很棒的一个题啊,我是看题解哒
题解
1040 最大公约数之和
直接枚举公因数x,然后乘上 phi(n/x) 就可以了,不解释了