第一次評測后 是第二,而且分數 奇低,不想說了。感覺和昨天的數學一樣悲劇了~
然后發現各種問題,第二題全場爆零,第四題數據是原設計的10倍,標程只能過一個點。。。
糾正了這些后復測:300+,勉強比汪同學高一點。
話說麻同學來上課了,于是吵了很多,但大家發揮都不錯,
汪同學300+,吳天舒279,陸瑾聰200。。后面的普遍100左右。
我們發現是學c的人多了。。。。。然后又慫恿了兩個人轉c。。。。
說說題目,
第一題:忽略了全是0的情況。。。。90
第二題:flood-fill,(題目描述的就是flood。。。)AC
第三題:數學題,因式基本定理及其推論。。AC
第四題:求逆序對數,經典分治就不說了,于是想標新立異。
一上來想到平衡樹,SBT不會寫,SPLAY又覺得太長了。于是想線段樹,好像用不起來。
最后剩下時間不多了,忽然蒙出了樹狀數組,于是狂寫。
本來題目設計的是兩種方法都能過的,由于復測時,數據沒改(原設計的10倍),所以只能拿一半分。。。。
后來發現經典分治1.08s ,樹狀數組2.73s(最大點),其實也不是很大的差距。

試題
1、最大數和最小數
(maxmin.pas/c/cpp; 時限:1s; 64MB)
【問題描述】
輸入一個數(不超過200位),將其重新排列后組成一個最大數和一個最小數。
【輸入格式】
第1行:一個整數N,不超過200位。
【輸出格式】
分兩行輸出一個最大整數和一個最小整數(去除前導零)。
【輸入樣例】
56214841966300510687
【輸出樣例】
98876666554432111000
11123445566667889
2. 安全區域(已修改)
(area.pas/c/cpp; 時限:1s; 64MB)
【問題描述】
Dark船長帶領船員駕駛潛水艇在深海執行科考任務,不幸的是,潛水艇觸礁進水。潛水艇內部有些重要區域有密封艙門,用*號表示,對于一個封閉的*號區域水是進不去的。Dark船長急需知道沒進水的重要區域(用”0”表示)有多少?
【輸入格式】
第一行:是兩個整數,x和y(x,y≤500)
第二行開始是一個由*和0組成的x*y的圖。
【輸出格式】
輸出沒被水淹沒的“0”的數量。
【輸入樣例1】
4 5
00000
00*00
0*0*0
00*00
【輸出樣例1】
1
【輸入樣例2】
5 5
*****
*0*0*
**0**
*0*0*
*****
【輸出樣例2】
5
3. 探險家
(explorer.pas/c/cpp; 時限:1s; 64MB)
【問題描述】
十個數學家乘氣球飛行在太平洋上空。當橫越赤道時,他們決定慶祝一下這一壯舉。于是他們開了一瓶香檳。不幸的是,軟木塞在氣球上打了一個洞,氫氣泄漏,氣球開始下降,眼看就要落入海中,所有人將要被鯊魚吃掉。
但是尚有一線生機--若其中一人犧牲自己跳下去的話,那他的朋友們還能多活一會兒。但仍然有一個問題存在--誰跳下去?所以他們想了一個非常公平的辦法來解決這個問題--首先,每人寫一個整數ai(1≤ai≤10000);然后計算出a1×a2×a3×a4×……×a10的積的約數的個數N。例如,6的約數有4個(1、2、3、6),則N為4。這位犧牲自己的英雄將由N的個位數來決定(編號為N的個位數加1的人要跳下去)。你的任務是求出N。
【輸入格式】
十個整數(用一個空格隔開)
【輸出格式】
N的個位數
【輸入樣例】
1
2
6
1
3
1
1
1
1
1
【輸出樣例】
9
【注釋】
1×2×6×1×3×1×1×1×1×1=36,約數有1,2,3,4,6,9,12,18,36,共9個。
4、逆序對
(negsort.pas/c/cpp; 時限:1s; 64MB)
【問題描述】
NEG公司是一家專門提供數據服務的公司,其中數據排序工作是他們非常重要的一項業務。他們的工作是通過一系列移動,將某些物品按順序擺好。他們的服務是通過工作量來計算的,即移動東西的次數。所以,在工作前必須先調查數據處理的工作量,以便向用戶提出合理的收費價格。
排序數據前,大部分用戶都是憑感覺來認定這一列物品的混亂程度,實際上不需要知道精確的移動次數。而NEG公司往往是根據“逆序對”的數目多少來判斷這一序列的混亂程度。假設我們將序列中第i件物品的參數定義為Ai,那么排序就是指將Ai,…,An從小到大排序。若i<j且Ai>Aj,則<i,j>就為一個“逆序對”。
例如,數組(3,1,4,5,2)的“逆序對”有<3,1>,<3,2>,<4,2>,<5,2>,共4個。
NEG公司請你寫一個程序,在盡量短的時間內,統計出“逆序對”的數目。
【輸入格式】
n,A1,…,An,1<n<1000000,Ai為小于1000000的正整數。
【輸出格式】
數列A1,…,An的“逆序對”數目,即“逆序數”。
【輸入樣例】
5 3 1 4 5 2
【輸出樣例】
4
maxmin
1 #include<cstdio>
2
3 #include<cstring>
4
5 #include<iostream>
6
7 char c[255];
8
9 int main(){
10
11 freopen("maxmin.in","r",stdin);
12
13 freopen("maxmin.out","w",stdout);
14
15 int l;
16
17 scanf("%s ",c);
18
19 l=strlen(c);
20
21 for(int i=0;i<=l-1;i++)
22
23 for(int j=i+1;j<=l-1;j++)
24
25 if(c[i]>c[j]){
26
27 c[i]^=c[j];
28
29 c[j]^=c[i];
30
31 c[i]^=c[j];
32
33 }
34
35 if(c[l-1]=='0')
36
37 {
38
39 printf("0\n0");
40
41 return 0;
42
43 }
44
45 for(int i=l-1;i>=0;i--)
46
47 printf("%c",c[i]);
48
49 printf("\n");
50
51 for(int i=0;i<=l-1;i++)
52
53 if(c[i]!='0')
54
55 printf("%c",c[i]);
56
57 return 0;
58
59 }
area
1 #include<cstdio>
2 #include<cstring>
3 #include<iostream>
4 char p[501][501];
5 int h[501][501];//1 flooded 2 rock 0;safe
6 int A[501*501],B[501*501],Head,Tail;
7 int x[4]={0,0,1,-1};
8 int y[4]={1,-1,0,0};
9 int count=0;
10 int main(){
11 freopen("area.in","r",stdin);
12 freopen("area.out","w",stdout);
13 int n,m;
14 memset(h,0,sizeof(h));
15 scanf("%d %d ",&n,&m);
16 for(int i=1;i<=n;i++)
17 for(int j=1;j<=m;j++){
18 scanf("%c ",&p[i][j]);
19 if(p[i][j]=='*')
20 h[i][j]=2;
21 }
22 for(int i=1;i<=m;i++){
23 if(!h[1][i]){
24 Head=Tail=1;
25 A[Head]=1;
26 B[Head]=i;
27 h[1][i]=1;
28 while(Head<=Tail){
29 for(int j=0;j<=3;j++)
30 if(!h[A[Head]+x[j]][B[Head]+y[j]])
31 if(A[Head]+x[j]>=1&&A[Head]+x[j]<=n)
32 if(B[Head]+y[j]>=1&&B[Head]+y[j]<=m){
33 Tail++;
34 A[Tail]=A[Head]+x[j];
35 B[Tail]=B[Head]+y[j];
36 h[A[Tail]][B[Tail]]=1;
37 }
38 Head++;
39 }
40 }
41 //
42 if(!h[n][i]){
43 Head=Tail=1;
44 A[Head]=n;
45 B[Head]=i;
46 h[n][i]=1;
47 while(Head<=Tail){
48 for(int j=0;j<=3;j++)
49 if(!h[A[Head]+x[j]][B[Head]+y[j]])
50 if(A[Head]+x[j]>=1&&A[Head]+x[j]<=n)
51 if(B[Head]+y[j]>=1&&B[Head]+y[j]<=m){
52 Tail++;
53 A[Tail]=A[Head]+x[j];
54 B[Tail]=B[Head]+y[j];
55 h[A[Tail]][B[Tail]]=1;
56 }
57 Head++;
58 }
59 }
60 }
61 for(int i=1;i<=n;i++){
62 if(!h[i][1]){
63 Head=Tail=1;
64 A[Head]=i;
65 B[Head]=1;
66 h[i][1]=1;
67 while(Head<=Tail){
68 for(int j=0;j<=3;j++)
69 if(!h[A[Head]+x[j]][B[Head]+y[j]])
70 if(A[Head]+x[j]>=1&&A[Head]+x[j]<=n)
71 if(B[Head]+y[j]>=1&&B[Head]+y[j]<=m){
72 Tail++;
73 A[Tail]=A[Head]+x[j];
74 B[Tail]=B[Head]+y[j];
75 h[A[Tail]][B[Tail]]=1;
76 }
77 Head++;
78 }
79 }
80 //
81 if(!h[i][m]){
82 Head=Tail=1;
83 A[Head]=i;
84 B[Head]=m;
85 h[i][m]=1;
86 while(Head<=Tail){
87 for(int j=0;j<=3;j++)
88 if(!h[A[Head]+x[j]][B[Head]+y[j]])
89 if(A[Head]+x[j]>=1&&A[Head]+x[j]<=n)
90 if(B[Head]+y[j]>=1&&B[Head]+y[j]<=m){
91 Tail++;
92 A[Tail]=A[Head]+x[j];
93 B[Tail]=B[Head]+y[j];
94 h[A[Tail]][B[Tail]]=1;
95 }
96 Head++;
97 }
98 }
99 }
100 for(int i=1;i<=n;i++)
101 for(int j=1;j<=m;j++)
102 if(!h[i][j])
103 count++;
104 printf("%d",count);
105 return 0;
106 }
107 
explorer(25行的壓縮版)
1 #include<cstdio>
2 #include<cstring>
3 #include<iostream>
4 bool p[10001];
5 int pp[10001],ph[10001],pt=0,t,count=1;
6 int main(){
7 freopen("explorer.in","r",stdin);
8 freopen("explorer.out","w",stdout);
9 memset(p,true,sizeof(p));
10 memset(ph,0,sizeof(ph));
11 p[0]=p[1]=false;
12 for(int i=2;i<=10000;i++)if(p[i])
13 for(int j=2*i;j<=10000;j+=i)p[j]=false;
14 for(int i=1;i<=10000;i++)if(p[i])
15 {pt++;pp[pt]=i;}
16 for(int i=1;i<=10;i++)
17 {scanf("%d",&t);
18 for(int j=1;j<=pt&&t>1;j++)
19 while(t%pp[j]==0&&t>1)
20 {t/=pp[j];ph[j]++;}}
21 for(int i=1;i<=pt;i++)
22 {count*=(ph[i]+1);count%=10;}
23 printf("%d",count);
24 return 0;
25 }
26 
negsort(AC,43行的基礎代碼)
1 #include<cstdio>
2 #include<cstring>
3 #include<iostream>
4 long long C=0;
5 long a[1000001];
6 long c[1000001];
7 int m;
8 void sort(int low,int high);
9 int main(){
10 freopen("negsort.in","r",stdin);
11 freopen("negsort.out","w",stdout);
12 scanf("%d",&m);
13 for(int i=1;i<=m;i++)
14 scanf("%d",&a[i]);
15 sort(1,m);
16 printf("%I64d",C);
17 return 0;
18 }
19 void sort(int low,int high)
20 {
21 if(low==high)
22 return ;
23 int t=(low+high)>>1;
24 int l=low,r=t+1;
25 sort(low,t);
26 sort(t+1,high);
27 for(int i=low;i<=high;i++)
28 {
29 if(l<=t&&(a[l]<=a[r]||r>high))
30 {
31 c[i]=a[l];
32 l++;
33 }
34 else
35 {
36 c[i]=a[r];
37 r++;
38 C+=t-l+1;
39 }
40 }
41 for(int i=low;i<=high;i++)
42 a[i]=c[i];
43 }
44 (最新,在linux下測得最大點時間0.604s,完全AC)

negsort(50,樹狀數組)
1 #include<cstdio>
2
3 #include<cstring>
4
5 #include<iostream>
6
7 long long C=0;
8
9 int c[1000005];
10
11 long long a[1000005];
12
13 int m,t;
14
15 int maxm=0;
16
17 int inline lowbit(int x){return x&-x;}
18
19 void add(int i);
20
21 long long sum(int i);
22
23 int main(){
24
25 freopen("negsort.in","r",stdin);
26
27 freopen("negsort.out","w",stdout);
28
29 memset(a,0,sizeof(a));
30
31 scanf("%d",&m);
32
33 for(int i=1;i<=m;i++)
34
35 {
36
37 scanf("%d",&c[i]);
38
39 if(c[i]>maxm)
40
41 maxm=c[i];
42
43 }
44
45 maxm++;
46
47 for(int i=1;i<=m;i++)
48
49 {
50
51 C+=sum(maxm-c[i]+1);
52
53 add(maxm-c[i]+2);
54
55 }
56
57 printf("%I64d",C);
58
59 return 0;
60
61 }
62
63 void add(int i)
64
65 {
66
67 while(i<=maxm)
68
69 {
70
71 a[i]++;
72
73 i+=lowbit(i);
74
75 }
76
77 }
78
79 long long sum(int i)
80
81 {
82
83 long long count=0;
84
85 while(i>=1)
86
87 {
88
89 count+=a[i];
90
91 i-=lowbit(i);
92
93 }
94
95 return count;
96
97 }(最新,在linux下測得最大點時間1.093s,還說的過去。)
最終結論:由于有重復相等的問題,所以SBT和SPLAY不能很好的解決這個問題