1.【LGR-150-Div.2】洛谷 8 月月赛 I & RiOI Round 2
【LGR-150-Div.2】洛谷 8 月月赛 I & RiOI Round 2
T1 P9496 「RiOI-2」hacker
题目描述
有两种操作,
- 水题,但是一开始用
输入 没有用 "%lld" 然后 了两个点。- 将
和 转化为二进制,用两个数组分别存起来,再枚举。 - 若
表示为 , 表示为1,则进行 操作。 - 若
表示为 , 表示为0,则进行 操作。
- 将
#include<bits/stdc++.h> using namespace std; long long int n,sum=0; long long int x,y; long long int a[100],b[100]; int main() { long long int i,j,m,t; scanf("%lld",&t); while(t--) { sum=0; scanf("%lld%lld",&n,&m);//scanf输入long long需要 "%lld" if(n==m) { printf("%d\n",0); continue; } memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); int cnt=0,res=0; int cn=0,cm=0; x=n,y=m; while(x) { a[++cnt]=x%2; x/=2; } while(y) { b[++res]=y%2; y/=2; } for(i=1;i<=max(cnt,res);i++) { if(a[i]==1&&b[i]==0)cn=1; if(a[i]==0&&b[i]==1)cm=1; } printf("%d\n",cn+cm); } }
- 听机房大佬说,其实有一个
算法,如果 ,就输出 ,如果 或者 输出 ,如果都不符合,输出 。 - 如
表示为 , 表示为 ,此时使 按位或 ,结果为 ,等于 。 - 如
表示为 , 表示为 ,此时使 按位或 ,结果为 ,等于 。 - 如
表示为 , 表示为 ,此时使 按位或 ,结果为 。等于 - 如
表示为 , 表示为 ,此时使 按位或 ,结果为 ,等于 。 - 当
表示为 , 表示为 时,此时使 按位或 ,结果为 ,不等于 ,也不等于 ,此时需要用两种操作。 - 即当按位或后,若
与 有不同的位,如有一位 是 , 是 。并且如果有一位 是 , 是 ,也就是 不等于 也不等于 。则需要进行两次操作。
#include<bits/stdc++.h> int main() { long long int t,n,m; scanf("%ld",&t); while(t--) { scanf("%ld%ld",&n,&m); if(n==m) printf("0\n"); else if((n|m)==m||(n|m)==n) printf("1\n"); //位运算优先级较低,需要用括号括起来。 else printf("2\n"); } }
T2 P9497 「RiOI-2」weight
题目描述
给定一个
有
询问之间相互独立。换言之,每次询问前可以重新排列。
- 还是水题,将二维矩阵压成一位数组,输入后再从大到小
一遍,每次询问时,从 到 中寻找第一个小于 的数,如果都大于等于 则,输出 。- 一开始没看懂题目,以为是把每行从大到小排列。没看到最大化每排的最大值。
- 改过来之后,发现输出都是
,但没想太多就交上去了,但是竟然 了,才想起来电脑是 位, 显示为 。
#include<bits/stdc++.h> using namespace std; long long int n,q,a[1010001]; long long int maxx[1001]; bool cmp(long long int x,long long int y) { return x>y; } int main() { int i,j; cin>>n>>q; for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%ld",&a[(i-1)*n+j]); stable_sort(a+1,a+1+n*n,cmp); for(i=1;i<=n;i++)maxx[i]=a[i]; long long int w; for(i=1;i<=q;i++) { int flag=0; scanf("%ld",&w); for(j=1;j<=n;j++) { if(maxx[j]<w) { printf("%ld\n",j-1); flag=1; break; } } if(!flag)printf("%ld\n",n); } }
T3 P9498 「RiOI-2」equals
题目描述
给定一棵
你需要给每个结点黑白染色,满足黑色结点的深度和等于白色结点的深度和。设
若无解,仅输出一行一个整数
- 一开始打算用邻接矩阵存边,但是...
数据规模与约定
分值 | 特殊性质 | ||
---|---|---|---|
/ | |||
/ | |||
/ | |||
/ | |||
/ | 树为菊花图(不保证根为菊花中心) | ||
/ | 树为一条链(不保证根为链的端点) | ||
/ | / |
斜杠表示这一栏无特殊限制。
对于
- 由于
,所以改用链式前向星存边。 一遍得出深度,由于黑点、白点的深度和要相等,所以想到前几天做的分钱,于是用 判断是否有解。- 但是如果有解需要输出点的状态,而本蒟蒻不会记录路径,因此放弃了
。 - 放弃了
,考虑爆搜,打搜索。因为爆搜超时,开始一分没骗到,然后剪枝得了
之后想到折半搜索,但是本蒟蒻只会折半,因此分了两个 循环,第一个从 循环到
第二个从 循环到 。(但应该不是正解)。然后 了......
(出题人的数据怎么如此之氵,把爆搜都放过去了)...
#include<bits/stdc++.h> using namespace std; long long int dep[6000001],vis[6000001]; long long int n,sum=0; struct ee { int next,to; }e[6000001]; int head[6000001],cnt=0; void add(int u,int v) { e[++cnt]={head[u],v}; head[u]=cnt; } void dfs(int x) { int i; vis[x]=1; for(i=head[x];i;i=e[i].next) { int v=e[i].to; if(!vis[v]) dep[v]=dep[x]+1,dfs(v); } } bool pd[6000001]; void search(int x,long long int s) { int i,j; if(s==(sum/2)) { for(j=1;j<=n;j++) { if(pd[j])printf("%d ",1); else printf("%d ",0); } exit(0); } for(i=x;i<=(n+1)/2;++i) { if(!pd[i]&&s+dep[i]<=(sum/2)) { pd[i]=1; if(s+dep[i]==(sum/2)) { for(j=1;j<=n;j++) { if(pd[j])printf("%d ",1); else printf("%d ",0); } exit(0); } if(s+dep[i]<(sum/2)) search(i+1,s+dep[i]); pd[i]=0; } } for(i=(n+1)/2;i<=n;++i) { if(!pd[i]&&s+dep[i]<=(sum/2)) { pd[i]=1; if(s+dep[i]==(sum/2)) { for(j=1;j<=n;j++) { if(pd[j])printf("%d ",1); else printf("%d ",0); } exit(0); } if(s+dep[i]<(sum/2)) search(i+1,s+dep[i]); pd[i]=0; } } } int main() { int i,j,m,x,y; scanf("%d",&n); for(i=1;i<n;i++)scanf("%d%d",&x,&y),add(x,y),add(y,x); dep[1]=1; dfs(1); for(i=1;i<=n;++i)sum+=dep[i]; if(sum%2==1) { printf("%d",-1); return 0; } search(1,0); printf("%d",-1); }
T4 P9499 「RiOI-2」change
- 本蒟蒻不会打,骗了20分。。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】