社区讨论
求助广大谷民
学术版参与者 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 条回复,欢迎继续交流。
正在加载回复...