1. 程式人生 > >洛谷八連測2017R5-whzzt-Confidence

洛谷八連測2017R5-whzzt-Confidence

blank splay cst 方法 sed name lose 空間限制 -m

傳送門

題目描述

題目難度不一定按照題目順序遞增

請註意本題的空間限制為2333-2500KB!(前三個測試點的空間限制為2500KB)

給定兩個長度相同的序列,這兩個序列至多有 1 處不同。你的任務是找出這處不同。

輸入輸出格式

輸入格式:

第一行包含一個數據組數 TT。每組數據的格式如下:

第一行一個整數 nn 表示序列的長度。

接下來兩行表示兩個長度均為 nn 的序列 AA 和 BB,保證所有數字均為小於 2^32 的非負整數,這些數字可以看做是隨機的。

輸出格式:

輸出共 TT 行,每行第一個數 m1 表示不同的數目。接下來 mm 個數表示兩個序列中不同的位置。

輸入輸出樣例

輸入樣例#1: 復制
2
4
2 3 3 3
2 3 6 3
8
9 1 6 2 8 0 7 1
9 1 6 2 0 0 7 1
輸出樣例#1: 復制
1 3
1 5
技術分享

數據量較大,建議不要使用 cin / cout 輸入輸出。

為了防止不必要的MLE等情況出現,經過測試,下面的代碼使用的空間在2300KB左右浮動。註意頭文件所占用的空間也計入程序實際運行所占用的空間內。如在下面的代碼中自行使用占用空間更大的數組,不能保證程序能夠正常運行。

#include <stdio.h>
using namespace std;

unsigned int a[150005];
int main(){

    return 0;
}


這題可以用異或做

思路是把數字看成一個個的二進制1,然後打上相應的位置的標記,

對於相同的數字異或之後什麽的都沒有了,而不同的會有位置的標記找到即可

空間復雜度是32int,很不錯的方法

技術分享
 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<map>
 7 #include<set>
 8 #include<queue>
 9 #include<vector>
10 #define INF 0x7f7f7f7f
11 #define pii pair<int,int>
12
#define ll long long 13 #define MAXN 100005 14 using namespace std; 15 int n; 16 ll f[33]; 17 ll read(){ 18 ll x=0;char ch=getchar(); 19 while(ch<0||ch>9){ch=getchar();} 20 while(ch>=0&&ch<=9){x=x*10+ch-0;ch=getchar();} 21 return x; 22 } 23 int main() 24 { 25 int T; 26 scanf("%d",&T); 27 while(T--){ 28 memset(f,0,sizeof(f)); 29 ll a=0; 30 scanf("%d",&n); 31 for(int i=1;i<=n;i++){ 32 ll t=read(); 33 a^=t; 34 int cnt=0; 35 while(t){ 36 if(t&1)f[cnt]^=i; 37 cnt++; 38 t>>=1; 39 } 40 } 41 for(int i=1;i<=n;i++){ 42 ll t=read(); 43 a^=t; 44 int cnt=0; 45 while(t){ 46 if(t&1)f[cnt]^=i; 47 cnt++; 48 t>>=1; 49 } 50 } 51 if(a){ 52 int cnt=0; 53 while(a){ 54 if(a&1){ 55 printf("1 %d\n",f[cnt]); 56 break; 57 } 58 cnt++; 59 a>>=1; 60 } 61 } 62 else{ 63 printf("0\n"); 64 } 65 } 66 67 return 0; 68 }
Code1

還可以分別求出∑i*(ai-bi)以及∑i*i*(ai-bi),減掉之後如果等於0,那麽肯定是相同的

否則的話肯定是只剩下j*(aj-bj)和j*j*(aj-bj),除掉即可求得j

但是考慮溢出,我們模一下P,然後求出P意義下的逆元即可

技術分享
 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<map>
 7 #include<set>
 8 #include<queue>
 9 #include<vector>
10 #define INF 0x7f7f7f7f
11 #define pii pair<int,int>
12 #define ll long long
13 #define uint unsigned int
14 #define P 1000003
15 using namespace std;
16 int ni(ll a){
17     int b=P-2;
18     int ret=1;
19     while(b){
20         if(b&1){
21             ret=1LL*ret*a%P;
22         }
23         a=a*a%P;
24         b>>=1;
25     }
26     return ret;
27 }
28 int n;
29 ll a,b;
30 int main()
31 {
32 //    freopen("data.in","r",stdin);
33     int T;scanf("%d",&T);
34     while(T--){
35         a=0,b=0;
36         int n;scanf("%d",&n);
37         for(int i=1;i<=n;i++){
38             ll t;scanf("%lld",&t);
39             a+=1LL*i*t%P;
40             b+=1LL*i*i%P*t%P;
41         }
42         for(int i=1;i<=n;i++){
43             ll t;scanf("%lld",&t);
44             a-=1LL*i*t%P;if(a<0)a+=P;
45             b-=1LL*i*i%P*t%P;if(b<0)b+=P;
46         }
47         if(!a){
48             printf("0\n");
49         }
50         else{
51             printf("1 %d\n",b*ni(a)%P);
52         }
53     }
54     return 0;
55 }
Code2

洛谷八連測2017R5-whzzt-Confidence