把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

AGC035 A - XOR Circle【分析】

题目传送门

题意简述:

 

 

 (就是连环的意思)

唔,这道题考场上写了个什么神仙做法,数据太水了居然过了:

复制代码
//
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
#define MAXN 10005
#define LL long long
#define INF 0x3f3f3f3f 
int n,a,ans;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a);
        ans^=a;
    }
    if(ans==0) printf("Yes\n");
    else printf("No\n");
    return 0;
} 
复制代码

反例还是很容易构造的吧,比如n不能被3整除的情况(看了下面的分析就可以轻而易举地举出好多反例来了)

 

分析:

1.左右两个数的异或值等于中间的数,那么任意相邻三个数的异或和一定为0

2.考虑一般情况,设序列的前3个数为xyz,且x^y^z==0,那么如果要满足任意三个相邻的数的异或和都为0,则下一个数只能为x,因为要满足y^z^这个数==0,依次推下去,可以发现n时,比如xyzxyz在连成环的情况下可以符合要求,反之不能,比如xyzxy。也就是这三个数的个数一定要是相等,且均为n/3

2.考虑特殊情况,上一种情况中的xyz中有2个数相等的时候,剩下那一个数只能为0,也就是0的个数为n/3,另一个数的个数为n/32

3.最最特殊的情况,就是全部都是0的情况,这种情况不需要判断n

 

但是,

做这道题的时候该犯的错误,不该犯的错误都犯到位了。

1.没有开ll

2.多组数据不清零(线下考试的时候由于AT数据过于水,重造了数据,没有绑点,但是多组数据)

3.在找不一样的数的时候,用的下面的式子判断,但是,要记得赋a[0]=1INF,否则在第一个数是0的时候会炸掉。

复制代码
 1 //不开ll见祖宗 
 2 #include<iostream>
 3 #include<string>
 4 #include<cstdio>
 5 #include<cstring>
 6 #include<map>
 7 #include<algorithm>
 8 using namespace std;
 9 #define N 100005
10 #define ll long long
11 #define MOD 1000000007
12 #define INF 0x3f3f3f3f
13 int n;
14 ll a[N],num[10];
15 int cnt[10],tot;
16 int main()
17 {
18     //freopen("circle.in","r",stdin);
19     //freopen("circle.out","w",stdout);
20     int T;scanf("%d",&T);
21     while(T--)
22     {
23         //f**k多组数据不清零
24         tot=0;
25         cnt[1]=cnt[2]=cnt[3]=0;
26         num[1]=num[2]=num[3]=0; 
27         bool f=0;
28         scanf("%d",&n);
29         for(int i=1;i<=n;i++)
30         {
31             scanf("%lld",&a[i]);
32             if(a[i]!=0) f=1;
33         }
34         if(f==0)
35         {//全部都是0 
36             puts("Yes");
37             continue;
38         }
39         sort(a+1,a+n+1);
40         a[0]=INF;
41         for(int i=1;i<=n;i++)
42         {
43             if(a[i]!=a[i-1])
44                 cnt[++tot]++,num[tot]=a[i];
45             else cnt[tot]++;
46             if(tot>3)
47             {
48                 puts("No");
49                 f=0;//混用变量
50                 break; 
51             }
52         } 
53         if(f==0) continue;
54         if(n%3==0)
55         {
56             if(tot==3&&(num[1]^num[2]^num[3])==0&&cnt[1]==n/3&&cnt[2]==n/3&&cnt[3]==n/3)
57             {
58                 puts("Yes");
59                 continue;
60             }
61             if(tot==2&&num[1]==0&&cnt[1]==n/3&&cnt[2]==n/3*2)
62             {
63                 puts("Yes");
64                 continue;
65             }
66         }
67         puts("No");
68     }
69     return 0;
70 }
Code
复制代码

 

posted @   Starlight_Glimmer  阅读(288)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
浏览器标题切换
浏览器标题切换end
点击右上角即可分享
微信分享提示