5 条题解
-
2gaoj LV 10 @ 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。 -
12015-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大 -
02017-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); } }
-
02015-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;
}
快排。。。。。。 -
02015-01-25 20:52:44@
沙发~
xor运算可解此题
- 1