题解

5 条题解

  • 2
    @ 2015-02-01 17:35:10

    此题不同于P1939,倘若直接使用set来确保空间开销,虽然理论上对于iterator的erase是常数时间,但是仍然非常慢,最终后7个点都将TLE。

    【解法】
    开一个a[32][2]的数组。对于每个x,执行a[j][k]^=x,其中j=1..32,k的取值是x的二进制表示中从右往左的第j位的值。
    这样处理完N个数之后,对于一个a[j][0]和一个a[j][1],它们的取值分两类讨论:
    ①其中一个值为a^b,另一个值为0 ←这是a和b的第j位相同的结果
    ②其中一个值为a,另一个值为b ←这是a和b的第j位不同的结果
    找到一个j使得a[j][0]!=0,a[j][1]!=0,按顺序输出a[j][0]和a[j][1]即可。
    空间开销450KiB左右,时间开销<500ms。

  • 1
    @ 2015-07-04 20:49:06

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    int main()
    {
    int n;
    scanf( "%d",&n );
    unsigned int a[32][2]={0};
    for( int i = 0;i<n;i++ )
    {
    unsigned int t;
    scanf("%u",&t);
    for( int j = 0;j<32;j++ )
    a[j][(t<<(31-j))>>31]^=t;
    }
    for( int i = 0;i<32;i++ )
    if( a[i][0] != 0 && a[i][1] != 0 )
    {
    printf("%u %u",min(a[i][1],a[i][0]),max(a[i][1],a[i][0]));
    break;
    }
    return 0;
    }
    顺序不一定是0小1大

  • 0
    @ 2017-06-23 18:32:04

    一种奇怪的\(O(n)\)做法:取两个\(10^5\)级别的质数,拿两个桶存一下出现次数的奇偶性,注意到出现偶数次的数没有影响,于是枚举一下对应关系,CRT合并一下,用异或和check一下就行了。
    应该也可以推广到\(k\)张卡牌的情况,不过复杂度会变成\(O(n+k! \log {a_i})\),出错概率也会相应增大。

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    int read(){
        int val=0;
        char c=getchar();
        while(c<'0' || c>'9')
            c=getchar();
        while(c>='0' && c<='9')
            val=val*10+c-'0',c=getchar();
        return val;
    }
    typedef long long ll;
    void exgcd(ll a,ll b,ll& d,ll& x,ll& y){ //ax+by=d
        if (!b){
            d=a;
            x=1;
            y=0;
            return;
        }else{
            exgcd(b,a%b,d,y,x);
            y-=x*(a/b);
        }
    }
    ll crt(ll a,ll m,ll b,ll n){ //x=km+a=tn+b->km-tn=b-a
        ll d,k,t; 
        exgcd(m,n,d,k,t);
        ll tmp=m*n;
        return ((k*(b-a)*m+a)%tmp+tmp)%tmp;
    }
    const int p1=98869,p2=98873;
    bool cnt1[98869],cnt2[98873];
    int main(){
        int n=read(),xs=0;
        while(n--){
            int x=read();
            xs^=x;
            cnt1[x%p1]^=1;
            cnt2[x%p2]^=1;
        }
        ll a1,b1,a2,b2;
        bool flag=false;
        for(int i=0;i<p1;i++){
            if (!cnt1[i])
                continue;
            if (flag)
                b1=i;
            else a1=i,flag=true;
        }
        flag=false;
        for(int i=0;i<p2;i++){
            if (!cnt2[i])
                continue;
            if (flag)
                b2=i;
            else a2=i,flag=true;
        }
        ll w1=p1,w2=p2;
        ll a=crt(a1,w1,a2,w2),b=crt(b1,w1,b2,w2);
        if ((a^b)==xs){
            if (a>b)
                swap(a,b);
            printf("%lld %lld",a,b);
        }
        else{
            a=crt(a1,w1,b2,w2),b=crt(b1,w1,a2,w2);
            if (a>b)
                swap(a,b);
            printf("%lld %lld",a,b);
        }
    }
    
  • 0
    @ 2015-08-08 14:27:10

    测试数据 #0: Accepted, time = 0 ms, mem = 8316 KiB, score = 10
    测试数据 #1: Accepted, time = 2 ms, mem = 8312 KiB, score = 10
    测试数据 #2: Accepted, time = 0 ms, mem = 8312 KiB, score = 10
    测试数据 #3: Accepted, time = 515 ms, mem = 8316 KiB, score = 10
    测试数据 #4: Accepted, time = 531 ms, mem = 8316 KiB, score = 10
    测试数据 #5: Accepted, time = 531 ms, mem = 8316 KiB, score = 10
    测试数据 #6: Accepted, time = 500 ms, mem = 8316 KiB, score = 10
    测试数据 #7: Accepted, time = 515 ms, mem = 8312 KiB, score = 10
    测试数据 #8: Accepted, time = 531 ms, mem = 8316 KiB, score = 10
    测试数据 #9: Accepted, time = 531 ms, mem = 8316 KiB, score = 10
    Accepted, time = 3656 ms, mem = 8316 KiB, score = 100
    代码
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    long long a[1000000];
    int main()
    {
    long long n,i;
    scanf("%I64d",&n);
    for(i=1;i<=n;i++)scanf("%I64d",&a[i]);
    sort(a+1,a+n+1);
    for(i=1;i<=n;i++)
    {
    if(a[i]!=a[i-1] && a[i]!=a[i+1])printf("%d ",a[i]);
    }
    return 0;
    }
    快排。。。。。。

  • 0
    @ 2015-01-25 20:52:44

    沙发~
    xor运算可解此题

    • @ 2015-01-28 23:38:24

      内存怎么办呢?

  • 1

信息

ID
1918
难度
7
分类
其他 点击显示
标签
(无)
递交数
226
已通过
52
通过率
23%
被复制
2
上传者