51Nod 入门计划 10/10

前言

在bzoj的非权限题里面,题目又短有简单的题已经越来越少了。。于是来51Nod里面找点水题做

入门计划

1674 区间的价值 V2

这题的话,很明显地,是让我们把位分开考虑
然后我们考虑两个为 i,j ,也就是 2i 2j ,有多少个序列使得他们相乘。
假设 i 是与里面的,j是或里面的,那么你就枚举左端点a,然后合法的右端点b,肯定是满足 a ~b里面每一个数在第 i 为都是有1的,然后至少有一个数是在第 j位有1的,然后b是一个区间。你扫出关于 i,j 两个合法端点减一下就可以了。这个显然是单调的,可以O(n)做出来
时间复杂度 (nlog2ai)

1737 配对

两点间的距离: dep[x]+dep[y]2dep[LCA]
容易看出, dep[x]+dep[y] 是不变的
因此,我们只需要让 2dep[LCA] 最小化就可以了
于是考虑贪心策略,以1位根,如果他的所有儿子的LCA都可以是他,那么就结束了,也就是只要重儿子的节点个数不超过我的一半,那么就让子树之前配对就可以了
否则,就记录一个值 o ,表示以x LCA 的可以有多少个与重儿子配对,然后递归下去重儿子处理
然后以后的重儿子,他的节点个数就可以减去 o 了,因为他多余的可以与祖先匹配
然后就没有了最快O(1),最差 O(n)
贴一部分重要代码

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个人,先做一次,也就是到了 k1
吧序列排出来,就是 k,k+1,k+2......0,1,2,3.....,k2
重新编号,使得k变成0,那么我们就可以用 f[i1] 来直到谁会或者,然后加上k就可以了
在加上不能超出范围,就可以得到递推式 f[i]=(f[i1]+k)
然后最后那个人,因为是从0开始的,于是要 +1 ,然后第一题就做完了
然后第二题,考虑到n很大,也就是说,有很多情况,都是不用取模的,你可以一直加,所以我们可以一大部分地做,可以省下很多时间,就可以通过了

1472 取余最大值

这题的话本来想到了,但是不知道他的复杂度,于是就GG了
首先,看到最大值和区间,不难想到有用单调栈来维护每个点为最大值的区间,然后再在里面乱搞
这里有个小知识,就是这个区间,你按那边少人去那边的做法,就是设一个点为 i ,他的区间是li ri ,你几句比较一下 ili rii ,那个小就暴力扫哪边,这样子是 nlogn 的,这个可以用类似启发式合并的思想来理解。
于是就可以暴力固定一个左端点或者右端点,搞一搞前缀和,就变成了一段区间里面某个数出现个个数,这个随便做做就好了

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吧。。
考虑到能够出来的值不多。。
因为 8118=1458 918=162
因此直接DPf[i][a][b][tf]表示前i位,和是什么,平方和是什么,是否有限制就可以了
有两个小技巧:时间戳,还有对于没有限制的不清0,直接记忆化就可以过
一开始 nm 没有开 LL ,不知道在想什么。。

1667 概率好题

很棒的一个题啊,我是看题解哒
题解

1040 最大公约数之和

直接枚举公因数x,然后乘上 phi(n/x) 就可以了,不解释了

正式进军51NOD啦(虽然不知道以后会不会来),但怎么说我的号也已经有AC记录啦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值