社区讨论

求助广大谷民

学术版参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mhz4itkp
此快照首次捕获于
2025/11/15 01:20
3 个月前
此快照最后确认于
2025/11/16 14:02
3 个月前
查看原帖
今天上午的模拟赛T1爆零了,我的代码如下。
CPP
//为什么要攀登?因为山就在那里。
#include<bits/stdc++.h>
#define mrx 0x3f3f3f3f3f3f3f3f
#define int __int128
using namespace std;
inline int read(){
    int num=0,flag=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') flag=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        num=(num<<3)+(num<<1)+(ch^48);
        ch=getchar();
    }
    return num*flag;
}
char wshthxdsdg[40];
inline void write(int num){
	int flag=0;
	if(!num) return putchar('0'),void();
	if(num<0) putchar('-'),num=-num;
	while(num){
		wshthxdsdg[++flag]=(num%10)^48;
		num/=10;
	}
	for(int j=flag;j;j--) putchar(wshthxdsdg[j]);
}
inline void print(int num){
    write(num);
    putchar('\n');
}
inline void out(int num){
    write(num);
    putchar(' ');
}
inline int ksm(int a,int b){
	int ans=1;
	while(b){
		if(b&1) ans=ans*a;
		a=a*a,b>>=1;
	}
	return ans;
}
int n;
int a[500010];
int ans;
int vis[40];
int ass[40];
void add(int num){
	memset(ass,0,sizeof(ass));
	int now=0;
	while(num){
		if(num&1) ass[now]=1;
		num>>=1; 
		now++;
	}
	for(int i=0;i<=35;i++) ass[i]=!ass[i];
	for(int i=0;i<=35;i++) vis[i]+=ass[i];
}
int solve(int num){
	memset(ass,0,sizeof(ass));
	int now=0;
	while(num){
		if(num&1) ass[now]=1;
		num>>=1; 
		now++;
	}
	int res=0;
	for(int i=0;i<=35;i++){
		if(ass[i]&&vis[i]) res+=ksm(2,i)*vis[i];
	}
	for(int i=0;i<=35;i++) ass[i]=!ass[i];
	for(int i=0;i<=35;i++) vis[i]-=ass[i];
	return res;
}
signed main(){
//	freopen("andnot.in","r",stdin);
//	freopen("andnot.out","w",stdout);
	n=read();
	for(int i=1;i<=n;i++) a[i]=read();
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++) add(a[i]);
	for(int i=1;i<=n;i++) ans+=solve(a[i]);
	write(ans);
    return 0;
}
/*

*/
输出一直是0,但是吧memset改成for循环就是对的,把int128改成long long也是对的,有没有人知道是什么问题

回复

2 条回复,欢迎继续交流。

正在加载回复...