起床困难综合症

起床困难综合症

https://ac.nowcoder.com/acm/problem/17857

分析

由于每一位之间的计算是独立的
并且最后选择每个位上的数时
一定是贪心取0而后取1
所以我们可以对于每一位取1或0进行操作
但这样的话复杂度比较高
我们直接考虑用一个全1的二进制数(-1)和全0的二进制数(0)进行所有操作
最后贪心取0或1即可
时间复杂度:
期望得分:100分
温馨提示:注意细节,需要判到32位,不然只有90。。。

代码

//P2114
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>

#define LL long long
#define Cl(X,Y) memset((X),(Y),sizeof(X))
#define FOR(i,A,B) for(LL i=A;i<=B;i++)
#define BOR(i,A,B) for(LL i=A;i>=B;i--)
#define De(X) cerr<<#X<<" = "<<X<<endl
#define Lowbit(X) (X & (-X))
#define Skip cout<<endl;
#define INF 0x3f3f3f3f3f3f3f3f
#define Mod 998244353
#define Rson (X<<1|1)
#define Lson (X<<1)
using namespace std;

LL Limit,Total;
LL A=-1,B=0,Val;
char Opt[5];

inline void File() {
    freopen(".in","r",stdin);
    freopen(".out","w",stdout);
}

signed main() {
    // File();
    // ios::sync_with_stdio(false);
    scanf("%lld %lld",&Total,&Limit);
    FOR(i,1,Total) {
        scanf("%s",Opt+1);
        scanf("%lld",&Val);
        if(Opt[1]=='A') { A &= Val; B &= Val; }
        else if(Opt[1]=='O') { A |= Val; B |= Val; }
        else { A ^= Val; B ^= Val; }
    }
    LL Temp=0,Ans=0;
    BOR(i,32,0) {
        if((B>>i) & 1ll) { Ans+=(1ll<<i); }
        else if((A>>i) & 1ll) { if(Temp+(1ll<<i)<=Limit) { Ans+=(1ll<<i); Temp+=(1ll<<i); } }
    }
    printf("%lld\n",Ans);
    // fclose(stdin);
    // fclose(stdout);
    system("pause");
    return 0;
}
全部评论

相关推荐

炫哥_:哥们项目描述里面vector和mysql之类的都要写吗,直接开头技术栈巴拉巴拉就行了,完全不是技术点啊
点赞 评论 收藏
分享
笑死&nbsp;不是哥们离校了我真要睡街了&nbsp;加上还有几w的贷款&nbsp;不接受我准备去当三和大神
梦想是成为七海千秋:没事,hr这下就有底气了,下次遇到一个不接受的就说,你看,人家这学历都接受了,你凭什么不接受
点赞 评论 收藏
分享
评论
6
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务