2 条题解

  • 0
    @ 2026-9-7 14:26:40

    事先在洛谷上做过这道题目。 我们设计两个变量 a,ba,b,让 a=0,b=1a=0,b=-1,我们遇到一个操作,我们就让这两个数都干这种操作,最后我们从 303011 枚举,每一次我们让 ii 取反,注意,如果取反后的 i=0i=0,直接终止循环即可。如果 a>>i&1 我们就让答案加上 1<<i1<<i,还有一种情况:b>>i&1 而且 (1<<i)<=l(1<<i)<=l 时,我们可以让答案加上 1<<i1<<i,让 ll 减去 1<<i1<<i,但是我们优先选择第一种,我们只选其中的一个即可,具体可以看代码。 Code:

    #include<bits/stdc++.h>
    #define int long long
    #define I_love_ch ios::sync_with_stdio(0)
    #define China cin.tie(0)
    #define France cout.tie(0)
    #define ch_France return 0
    using namespace std;
    int n,l,x,a=0,b=-1;
    char ch;
    signed main(){
    	I_love_ch;
    	China;
    	France;
    	cin>>n>>l;
    	while(n--){
    		cin>>ch>>x;
    		if(ch=='&'){
    			a&=x;
    			b&=x;
    		}
    		if(ch=='|'){
    			a|=x;
    			b|=x;
    		}
    		if(ch=='^'){
    			a^=x;
    			b^=x;
    		}
    	}
    	int ans=0;
    	for(int i=30;~i;i--){
    		if(a>>i&1) ans=ans+(1<<i);
    		else if((b>>i&1)&&(1<<i)<=l){
    			ans=ans+(1<<i);
    			l=l-(1<<i);
    		}
    	}
    	cout<<ans<<"\n";
    	ch_France;
    }
    

    可能有些地方说的不是很准确

    • @ 2026-9-7 14:41:31

      注:洛谷题号P2144 题目起床困难综合征 (改一点就能过)

  • 0
    @ 2025-12-4 10:42:55

    我们把每位是 00 和每位是 11 的数扔进去算一遍。

    然后对于每位贪心的选择:

    • 如果第 ii 位填 00 ,但结果为 11,那就填 00

    • 否则,如果第 ii 位填 11 ,但结果为 11,那就填 11

    • 如果都不是,那就填 00

    • 1

    信息

    ID
    601
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    (无)
    递交数
    29
    已通过
    9
    上传者