https://ac.nowcoder.com/acm/contest/86428#question
A简单异或
题意就是求一个x,使得区间内每一个元素与x异或后的总和最大,先考虑单个元素与x异或后最大,根据异或的性质容易得到x应该和a 的每一位都相反,才能使得异或值最大。
贪心的考虑x的每一位 l-r中的i位1多时x取零否则取1
# include <bits/stdc++.h>
using namespace std;
const int N=1e5+01;
int a[N][32],sum[N][32];
int n,q;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i][0];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=31;j++)
{
a[i][j]=a[i][0]>>(j-1)&1;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=31;j++)
{
sum[i][j]=sum[i-1][j]+a[i][j];
}
}
cin>>q;
while(q--)
{
int l,r,x=0;
int ans;
cin>>l>>r;
for(int i=1;i<=31;i++)
{
ans=sum[r][i]-sum[l-1][i];
if(ans<r-l+1-ans)
x+=1<<(i-1);
}
cout<<x<<endl;
}
return 0;
}
D买饼干的小Y
二分答案
两个坑
m等于n特殊情况
二分中值为1时则一直为1直接判断 否则会超时
# include <bits/stdc++.h>
using namespace std;
double n,m;
typedef long long ll;
bool check(int mid)
{
int sum=m;
double t=m;
int l=n;int tt;
for(int i=1;i<=mid;i++)
{
sum+=ceil(t/2);
t=ceil(t/2);
if(sum>=l)
return true;
}
return false ;
}
int main()
{
cin>>n>>m;
if(m==n){cout<<"0";return 0;}
int l=0,r=1e9+10;
while(l<r)
{
int mid=l+r>>1;
if(check(mid))r=mid;
else l=mid+1;
}
cout<<l;
return 0;
}