2023年多校联训NOIP层测试4+洛谷 8 月月赛 I & RiOI Round 2
2023年多校联训NOIP层测试4
爆零了
T1 幸运数字 \(0pts\)
- 首先考虑一个结论: \(4\) 的倍数一定满足最后两位能被 \(4\) 整除。
- 从 \(1\) 进行输入,方便处理。若枚举到 \(i\) 位的位置,判断第 \(i-1\) 位和当前位组成的数( \(10×(s[i-1]-'0')+s[i]-'0'\) )即能否被 \(4\) 整除,如果可以,方案总数加上 \(i-1\) 。
- 额外加上 \(0,4,8\) 的个数。
#include<bits/stdc++.h> using namespace std; #define ll long long #define sort stable_sort #define endl '\n' char s[3000010]; int main() { ll ans=0,len,i; cin>>(s+1); len=strlen(s+1); s[0]='0'; for(i=1;i<=len;i++) { if((10*(s[i-1]-'0')+s[i]-'0')%4==0) { ans+=i-1; } if((s[i]-'0')%4==0)//在这里挂了100pts,if打成了else if,结果minecraft418直接出了个hack { ans++; } } cout<<ans<<endl; return 0; }
T2 密码 \(0pts\)
- 没做到,咕了。
T3 小X和他的朋友们 \(0pts\)
- 没做到,咕了。
T4 树上询问 \(0pts\)
- 没做到,咕了。
【LGR-150-Div.2】洛谷 8 月月赛 I & RiOI Round 2
比赛时间又重了, \(4.5h\) 打三场比赛。
T1 luoguP9496 「RiOI-2」hacker \(100pts\)
-
赛场上读假题了,以为是按位或上一个操作形成的数字,觉得是不可做题,跳到了T2。
- 解法一:将 \(n,m\) 分别转成二进制,易知答案结果只有 \(0,1,2\) ,然后进行分类讨论:
- 若转出二进制后第 \(i\) 位 \(n\)的值为 \(1\) ,\(m\)的值为 \(0\) ,需要进行 「ACCEPT」操作。
- 若转出二进制后第 \(i\) 位 \(n\)的值为 \(0\) ,\(m\)的值为 \(1\) ,需要进行 「BOTH」操作。
//转二进制模拟 #include<bits/stdc++.h> using namespace std; #define ll long long #define sort stable_sort #define endl '\n' ll aa[100],bb[100]; int main() { ll n,i,j,a,b,la,lb,sum1,sum2;//十年OI一场空,不开 long long见祖宗 cin>>n; for(i=1;i<=n;i++) { cin>>a>>b; if(a==b) { cout<<"0"<<endl; } else { la=lb=sum1=sum2=0; while(a>0)//转二进制,倒序储存,方便处理 { la++; aa[la]=a%2; a/=2; } while(b>0) { lb++; bb[lb]=b%2; b/=2; } if(la>lb) { for(j=lb+1;j<=la;j++)//空位补零,下同 { bb[j]=0; } lb=la; } if(la<lb) { for(j=la+1;j<=lb;j++) { aa[j]=0; } la=lb; } for(j=1;j<=la;j++) { if(aa[j]==1&&bb[j]==0) { sum1=1; } if(aa[j]==0&&bb[j]==1) { sum2=1; } } cout<<sum1+sum2<<endl; } } return 0; }
- 解法二:利用位运算进行分类讨论:
- 若\(a==b\) ,易知不需要进行操作。
- 若 \((a|b)==a\) ,说明 \(b\) 在二进制下与 \(a\) 同一位不同时存在一种情况( \(1和0\) 或 \(0和1\) ) ;若 \((a|b)==b\) ,同理。
- 若\((a|b)\ne a \ne b\),说明 \(b\) 在二进制下与 \(a\) 同一位不同时存在两种情况( \(1和0\) 和 \(0和1\) )
//位运算 #include<bits/stdc++.h> using namespace std; #define ll long long #define sort stable_sort #define endl '\n' ll aa[100],bb[100]; int main() { ll n,i,j,a,b,la,lb,sum1,sum2; cin>>n; for(i=1;i<=n;i++) { cin>>a>>b; if(a==b) { cout<<"0"<<endl; } else { if(((a|b)==a)||((a|b)==b)) { cout<<"1"<<endl; } else { cout<<"2"<<endl; } } } return 0; }
- 解法一:将 \(n,m\) 分别转成二进制,易知答案结果只有 \(0,1,2\) ,然后进行分类讨论:
T2 luoguP9497 「RiOI-2」weight \(100pts\)
-
赛场上又双叒叕读假题了,觉得是不可做题,跳到了T3。
-
正解:将矩阵压缩成一维, \(sort\) 一遍+二分查找即可。
#include<bits/stdc++.h> using namespace std; #define ll long long #define sort stable_sort #define endl '\n' int a[20000000]; int main() { int n,q,i,j,x,num; cin>>n>>q; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { cin>>a[j+(i-1)*n]; } } sort(a+1,a+1+n*n); for(i=1;i<=q;i++) { cin>>x; num=n*n-(lower_bound(a+1,a+1+n*n,x)-a)+1; cout<<min(n,num)<<endl;//记得和 n 取min } return 0; }
T3 luoguP9498 「RiOI-2」equals \(55pts\)
- 直接从T3开写,起初爆搜骗到了 \(40pts\) ,优化到 \(55pts\) ,才去打的T1和T2。
- \(DFS\) 求深度不做讲解。
- 部分分: 爆搜(C++大法好,先剪枝后爆搜)
- \(45pts\)
- 跑一遍luoguP7535 [COCI2016-2017#4] Kas的滚动数组优化,判断是否有解,接着爆搜。
- \(55pts\)
- luoguP7535 [COCI2016-2017#4] Kas的滚动数组优化毫无用处。
- 隔壁wkh卡到了 \(95pts\),minecraft418爆搜AC了,但是我这个才 \(55pts\)。
- \(95pts\)
- wkh教我的对 \(memset\) 的优化 ,记一个 \(g\) 记录第 \(g\) 次进行搜索,那么当\(vis[x]\ne g\) 则等价于用 \(memset\) 初始化全 \(0\) 的情况。
- 可以特判一下链的情况,估计能过(口胡)。
- \(45pts\)
- 正解:贪心
- 发现一个性质,当深度之和为奇数时一定无解,为偶数时一定有解。
- 证明:当深度之和为偶数时,此处与luoguP7535 [COCI2016-2017#4] Kas 不同,因为一条链上的深度具有单调递增性,即若存在深度为 \(x(x>1)\) 的点,则一定存在深度为\(x-1\) 的点,用后者代替前者,则导致 \(\sum\limits_{ans_i=1}^{} dep_i\) 或者 \(\sum\limits_{ans_i=0}^{} dep_i\) 减小1,这样就保证了这样贪心不会错过任何一个实际能取到的值,故一定有解。
#include<bits/stdc++.h> using namespace std; #define ll long long #define sort stable_sort #define endl '\n' struct node { ll to,next; }e[20000001]; struct equals { ll dep,val; }c[20000001]; ll head[20000001],ans[20000001],cnt=0; bool cmp(equals p,equals q) { return p.dep>q.dep; } void add(ll u,ll v) { cnt++; e[cnt].next=head[u]; e[cnt].to=v; head[u]=cnt; } void dfs(ll x,ll fa) { ll i; c[x].dep=c[fa].dep+1; c[x].val=x; for(i=head[x];i;i=e[i].next) { if(e[i].to!=fa) { dfs(e[i].to,x); } } } int main() { ll n,i,j,u,v,sum=0; cin>>n; for(i=1;i<n;i++) { cin>>u>>v; add(u,v); add(v,u); } dfs(1,0); for(i=1;i<=n;i++) { sum+=c[i].dep; } if(sum%2==0) { sum/=2; sort(c+1,c+1+n,cmp); for(i=1;i<=n;i++) { if(c[i].dep<=sum) { sum-=c[i].dep; ans[c[i].val]=1; } } for(i=1;i<=n;i++) { cout<<ans[i]<<" "; } } else { cout<<"-1"; } return 0; }
- 发现一个性质,当深度之和为奇数时一定无解,为偶数时一定有解。
T4 luoguP9499 「RiOI-2」change \(0pts\)
- 没做到,咕了。
【LGR-150-Div.1】洛谷 8 月月赛 I & RiOI Round 2
T1 luoguP9498 「RiOI-2」equals \(55pts\)
- 同 \(2C\) 。
T2 luoguP9499 「RiOI-2」change \(0pts\)
- 没做到,咕了。
T3 luoguP9500 「RiOI-2」tnelat \(0pts\)
- 没做到,咕了。
T4 luoguP9501 「RiOI-2」likely \(0pts\)
- 没做到,咕了。
总结
-
当你觉得题很难时,请重读题面,看是不是读假题了。
-
当你觉得题很简单时,请重读题面,看是不是读假题了。
本文来自博客园,作者:hzoi_Shadow,原文链接:https://www.cnblogs.com/The-Shadow-Dragon/p/17608638.html,未经允许严禁转载。
版权声明:本作品采用 「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0) 进行许可。