Saturday, June 25, 2022 at 22:35UTC+8
gyh20是巴蜀的OIer,也是此次的两位出题人之一,出了1/8。
- NIT,切肉刀,在城里是新的!成千上万的人排队抢他。为了让他的 orzer 玩得开心,NIT 决定让他们解决以下与 orz 相关的问题。你也能解决这个问题吗? 给定一个由 n 个整数、a 和一个整数 z 组成的 1 索引数组。您可以任意次数(可能为零)执行以下操作: 选择一个正整数 i,使得 1≤i≤n。然后,同时将 ai 设置为 (aiorz) 并将 z 设置为 (aiandz)。换句话说,设 x 和 y 分别是 ai 和 z 的当前值。然后将 ai 设置为 (xory) 并将 z 设置为 (xandy)。 这里 or 和 and 分别表示按位运算 OR 和 AND。 在任意次数(可能为零)的操作之后找到最大值的最大可能值。 输入 每个测试包含多个测试用例。第一行包含测试用例的数量 t (1≤t≤100)。测试用例的描述如下。 每个测试用例的第一行包含两个整数 n 和 z (1≤n≤2000, 0≤z<230)。 每个测试用例的第二行包含 n 个整数 a1,a2,…,an (0≤ai<230)。 保证所有测试用例的 n 总和不超过 104。 输出 对于每个测试用例,打印一个整数——问题的答案。
这道题的实质是求max(ai or z)。and操作只会让z越来越小,而z越大,对于ai去or起来是越有利的。所以你一开始先去和那些小的(ai or z)进行操作,最后无论如何都不会有特别大的(ai or z),因为你那些小的他们大不起来,然后z的值又被浪费了。所以就直接求max(ai or z)就行了。
#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
using namespace std;
int t,n;
long long z,a[2010];
void solve(){
long long ans=-1;
for(int i=1;i<=n;i++)ans=max(ans,a[i]|z);
cout<<ans<<endl;
}
int main(){
cin>>t;
for(int i=1;i<=t;i++){
cin>>n>>z;
memset(a,0,sizeof(a));
for(int j=1;j<=n;j++)cin>>a[j];
solve();
}
return 0;
}
这次圆满地爆零了,人生第一次掉rating。
不过如果没有大佬们的帮助,我也不会第二天一大早起来就AC第一题。还是非常感谢有这么几个好朋友。
至于比赛时情况如何嘛。。。我前两个小时都去颓废了,根本什么都想不到。我一个人打,也没有什么动力。但是后来我发了一个说说,被一个人很好的网友看见了,来问我第一题过了没。我说没有,然后就一直截图给他看代码,一直按他说的修改(我就是个废物没错了)我感觉最后那十分钟激情澎湃。最后实在没办法样例过不了,他发来了他python的码让我先交着,我真的至今记得当时还有4秒钟,然后提交的网页还没加载出来就contest over了,之后就点不起了。。。
第二天起来把我的码发给一个巨佬debug,他一眼就看出来是cin错了,cin>>a[j]打成a[i]了
总之,打cf还是很有意思的。后来跟他闲聊时问他,rating高了之后是不是每次打都怕掉,他说是,就像赌博一样。
其实,比赌博好玩多了。特别是,有些人的陪伴,打cf是一件很幸福的事。
p.s.最近要期末了事情有点多。现在已经一个星期过去了,把这点博客补完。