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 题目起床困难综合征 (改一点就能过)

信息

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