首页 > 其他分享 >8.31 上午 becoder 模拟赛总结 & 题解

8.31 上午 becoder 模拟赛总结 & 题解

时间:2024-09-03 19:37:49浏览次数:7  
标签:tmp int 题解 30 一位 枚举 becoder 8.31

T1 四个质数的和

赛场亲测搜索+小剪枝可以得到 70pts。

考虑 $O(p(V)^2)$枚举任意两个质数的和,其中 $p(V)$ 表示 $V$ 以内质数的个数。

然后开个数组记录下对于每种和的记录有多少种情况,查询时 for 循环扫一遍即可,详见代码。

复杂度去掉质数筛 $O(p(V)^2+tn)$,代码贴在下面(100pts):

#define N 100005
int t,n,cnt,pr[N];
long long ans,prs[N<<1];
int main(){
   //pr 存储的是 V 以内的质数
   for(int i=1;i<=cnt;i++)
        for(int j=1;j<=cnt;j++)
            prs[pr[i]+pr[j]]++;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n),ans=0;
        for(int i=1;i<n;i++)  ans+=prs[i]*prs[n-i];
        printf("%lld\n",ans);
    }
}

T2 匹配最大异或

位运算的题我们考虑分离二进制下的每一位,这道题使用的是分治。

分治从 $[0,2^{m-1})$ 开始,这样我们可以保证当前枚举的这一层前面的二进制位都是相同的。

所以我们考虑当前枚举到的这一位中的两种情况:

第一种,$a$ 数组的这一位上的值都相同,此时这一位就无法对答案产生影响。

这个时候就要求对于这一位分别是 $0,1$ 且其它位相同的两个数所选定的 $p$ 值必须相同,才能保证这两个数都能取得最大取值。

第二种,$a$ 数组的这一位上的值有 $0$ 也有 $1$这个时候这一位上是 $0$ 就必须选 $1$,反之亦然。

这个时候就要求对于这一位分别是 $0,1$ 且其它位相同的两个数所选定的 $p$ 值必须不同,才能保证这两个数都能取得最大取值。

以上两种情况已经涵盖了全部,所以中途出现的其它情况直接返回 $0$ 即可。

时间复杂度 $O(n \log n)$,代码如下(100pts):

long long solve(int l,int r){
    if(l==r)  return 1;
    int cnt=0,mid=(l+r)>>1;
    for(int i=l;i<=mid;i++)  cnt+=(p[i]==p[i+mid-l+1]);
    if(cnt==mid-l+1)  return (solve(l,mid)<<1)%mod;
    if(!cnt)  return (solve(l,mid)*solve(mid+1,r))%mod;
    return 0;
}
int main(){solve(1,(1<<m)-1);}

T3 虫食算

我代码在洛谷交是 AC 的,但是交 becoder 卡了好久死活 90pts 过不去。

这道题其实有高斯消元的正解,但是我们不管,考虑搜索+剪枝。

正常的搜索大家都会,直接 $O(n!)$ 枚举每一位上的数即可,这样就已经可以过掉 30pts 的数据了,然后我们考虑怎么剪枝。

搜索的时候我们选择从最低位开始进行搜索,因为这样我们能在搜索中直接把进位给算出来,就可以少考虑很多情况。

对于每一位我们直接枚举三个字母对应值,原本有就跳过,然后如果三个字母加上进位满足条件,就带着这个值往下搜索。

枚举字母值的时候我们则选择从大到小枚举,因为最高位是不能进位的,所以能进位的就优先放到低位。

通过如上代码就可以在洛谷的评测环境通过了,但是 becoder 的评测机不行,还要剪枝,但我不会了,希望来两个好心人帮我剪

代码如下(becoder 90pts,Luogu 100pts):

char a[30],b[30],c[30];
int n,f[30],go[30],s[100];
int gmod(int x,int &y){return x>=n?(y=1,x-n):(y=0,x);}
void dfs(int x){
    if(!x){
        for(int i=0;i<n;i++)  printf("%d ",s['A'+i]);
        exit(0);
    }
    for(int i=n-1,fl1=0;i>=0;i--){
        if(s[a[x]]!=-1)  fl1=1;
        else if(f[i])  continue;
        if(!fl1)  f[i]=1,s[a[x]]=i;
        for(int j=n-1,fl2=0;j>=0;j--){
            if(s[b[x]]!=-1)  fl2=1;
            else if(f[j])  continue;
            if(!fl2)  f[j]=1,s[b[x]]=j;
            int tmp=gmod(s[a[x]]+s[b[x]]+go[x+1],go[x]);
            if(s[c[x]]!=-1&&tmp==s[c[x]])  dfs(x-1);
            if(s[c[x]]==-1&&!f[tmp])  s[c[x]]=tmp,f[tmp]=1,dfs(x-1),f[tmp]=0,s[c[x]]=-1;
            if(fl2)  break;f[j]=0,s[b[x]]=-1;
        }
        if(fl1)  break;f[i]=0,s[a[x]]=-1;
    }
}
int main(){scanf("%d%s%s%s",&n,a+1,b+1,c+1),fill(s,s+100,-1),dfs(n);}

T4 染色相邻的边

NOIP 巩固练习 5,NOI2011 轻重边。

只不过输出的时候换成了用两点间的路径长减去原来的 ans 值而已,没啥好说的,跳过吧。

标签:tmp,int,题解,30,一位,枚举,becoder,8.31
From: https://www.cnblogs.com/tkdqmx/p/18395265

相关文章

  • 8.31 下午 梦熊联盟 NOIP 模拟赛总结 & 题解
    T1北极星一个比较好想到的点是从后往前枚举数,计算得出它需要的操作次数,然后给所有前面的数都加上这个操作次数,这样就把每个数独立出来了。所以这道题就变成了如何快速通过这些操作得到一个指定的数。观察大样例的输出,发现每一个数都是11?1?1?的形式,其中问号为+或c,我们可......
  • 9.1 上午 becoder 模拟赛总结 & 题解
    T1货车运输Kruskal重构树模板,没什么好说的,不会的把自己重构了算了,跳过。T2Slagalica可以发现拼图1和2、3拼起来还是拼图1,拼图4和2、3拼起来也还是拼图4,这两种拼图还都不能和自己拼,所以我们可以看作只有拼图1和拼图4来做。对于边界拼图分别是5、7的情况,只有......
  • 8.31 晚上 ABC369 总结 & 题解
    打了一天的比赛。ABCD太水了,直接放代码链接得了,点字母就能看对应代码。E-SightseeingTour看范围$N$只有$400$,所以我们可以先用floyd搞出任意两点间的距离。对于每次询问,发现$K_i$只有$5$,所以可以直接深搜应该走哪座桥,和应该走到哪一端。时间复杂度$O(N3+QK_i......
  • 9.2 上午 becoder 模拟赛总结 & 题解
    T1加法最开始看了好久没想出来,先做T2去了,然后回来想了一会儿发现自己可能智商有点问题。看到求最小值最大,第一反应肯定是二分,那我们怎么应该怎么check呢?考虑顺次枚举序列$A$中的每一个数,然后如果这个数没有达到mid的要求,我们肯定是要添加区间的。那么我们怎么添加区......
  • 9.3 上午 becoder 模拟赛总结 & 题解
    T1能量获取简单的树形DP,设$dp_{i,j}$表示向$i$节点传递了$j$点能量并全部花费完后能激活的封印石的数量。显然有:$ans=\sum\max_{j=0}^{j\leqW_i}{dp_{i,j}}(i\inson_0)$,转移的初始状态为$dp_{i,E_i}=E_i$。设当前枚举到的节点为$x$,子节点为$y$,有经典树上背包转......
  • 算法专项—第十五届蓝桥杯程序设计题解
    前三道属于签到题目;后面才是有难度的!一、读书一本书共n页,小明计划第一天看x页,此后每一天都要比前一天多看y页,请问小明几天可以看完这本书?输入格式一行输入三个整数n,x,y(20≤n≤5000),(1≤x,y≤20),分别表示书的总页数、计划第一天看的页数以及此后每天都要比前一天多看的页数,整......
  • 『主席树』疯狂的颜色序列 题解
    又又又好久没写题解了青花-周传雄三月走过柳絮散落恋人们匆匆我的爱情闻风不动翻阅昨日仍有温度蒙尘的心事恍恍惚惚已经隔世遗憾无法说惊觉心一缩紧紧握着青花信物信守着承诺离别总在失意中度过记忆油膏反复涂抹无法愈合的伤口你的回头划伤了沉默那夜重......
  • SP1843 LEONARDO - Leonardo Notebook 题解
    题目传送锚点博客园食用更佳前置知识1前置知识2首先是判断有无解。先疯狂寻找完所有的环,然后判断是否是偶环,最后如果都是偶环,且偶环的路径数成双成对地出现,或全是奇环,就输出Yes,不然就直接pass掉,输出No。然后我们发现:这里竟然出现了置换群!!!为什么它是置换群呢?我们从群的定......
  • P10878 [JRKSJ R9] 在相思树下 III 题解
    Description给定一个长为\(n\)的序列\(a_{1\dotsn}\),需要对它进行两种操作共\(n-1\)次。对一个长度为\(l\)的序列\(b_{1\dotsl}\)进行一次操作将会把序列变为一个长为\(l-1\)的序列\(c_{1\dotsl-1}\):操作一中,\(\foralli\in[1,l),c_i=\max(b_i,b_{i+1})\);操作......
  • C#/.NET/.NET Core技术前沿周刊 | 第 3 期(2024年8.26-8.31)
    前言C#/.NET/.NETCore技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NETCore领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。欢迎投稿,推荐或自荐优质文章/项目/学习资源等。每周一定期发......