2023年多校联训NOIP层测试5
2023年多校联训NOIP层测试5

T1 糖果 \(10pts\)


- 首先考虑一些异或的性质:
- 归零率:\(a \bigoplus a=0\)
- 恒等律:\(a \bigoplus 0=a\)
- 交换律:\(a \bigoplus b=b \bigoplus a\)
- 结合律: \(a \bigoplus b \bigoplus c=a \bigoplus (b \bigoplus c)=(a \bigoplus b) \bigoplus c\)
- 自反性(异或的逆运算为它本身): \(a \bigoplus b \bigoplus b=a\)
 
- 令 \(sum[i]= \bigoplus \limits_{j=1}^i a_j\) ,进行前缀和优化,然后进行分类讨论:
- 若 \(sum[n]=0\) ,利用归零率,说明一定可以把这些糖果分成两段,使得每段糖果的美味度相同。
- 若 \(sum[n] \ne 0\) ,利用归零率和恒等率,若存在一个 \(l,r\) ,满足 \(1\le l<r \le n\) ,且 \(sum[l]=sum[n],sum[r]=0\) ,即 \(\bigoplus \limits_{i=1}^l a_i= \bigoplus \limits_{i=l+1}^r a_i= \bigoplus \limits_{i=r+1}^n a_i\) ,说明可以把这些糖果分成 \([1,l],[l+1,r],[r+1,n]\) 三段,使得每段糖果的美味度相同。
 
- 枚举即可,复杂度 \(O(Tn)\) 。#include<bits/stdc++.h> using namespace std; #define ll long long #define sort stable_sort #define endl '\n' int a[100010],sum[100010]; int main() { int t,n,i,j,k,l,r; cin>>t; for(i=1;i<=t;i++) { cin>>n; l=r=0;//初始化 for(j=1;j<=n;j++) { cin>>a[j]; sum[j]=sum[j-1]^a[j]; } if(sum[n]==0) { cout<<"YES"<<endl; } else { for(j=1;j<=n;j++) { if(sum[j]==sum[n]) { l=j; break; } } for(j=n;j>=1;j--) { if(sum[j]==0) { r=j; break; } } if(l!=0&&r!=0&&l<r) { cout<<"YES"<<endl; } else { cout<<"NO"<<endl; } } } return 0; }
T2 魔法仪式 \(0pts\)

- 没听懂讲评,暂时咕了。
T3 独特的数组 \(0pts\)

- 没听懂讲评,暂时咕了。
T4 约会 \(5pts\)

- 没听懂讲评,暂时咕了。
后记
今天下发的题解写了跟写了似的。
本文来自博客园,作者:hzoi_Shadow,原文链接:https://www.cnblogs.com/The-Shadow-Dragon/p/17611633.html,未经允许严禁转载。
版权声明:本作品采用 「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0) 进行许可。

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号