1. 程式人生 > >計蒜客NOIP2017提高組模擬賽(四)day1

計蒜客NOIP2017提高組模擬賽(四)day1

種類數 sca double 發的 ide %d ram 同時 需要

T1:小X的質數

小 X 是一位熱愛數學的男孩子,在茫茫的數字中,他對質數更有一種獨特的情感。小 X 認為,質數是一切自然數起源的地方。

在小 X 的認知裏,質數是除了本身和 1 以外,沒有其他因數的數字。

但由於小 X 對質數的熱愛超乎尋常,所以小 X 同樣喜歡那些雖然不是質數,但卻是由兩個質數相乘得來的數。

於是,我們定義,一個數是小 X 喜歡的數,當且僅當其是一個質數,或是兩個質數的乘積。

而現在,小 X 想要知道,在 L 到 R 之間,有多少數是他喜歡的數呢?

輸入格式

第一行輸入一個正整數 Q,表示詢問的組數。

接下來 Q行。包含兩個正整數 L 和 R。保證 L≤R

輸出格式

輸出 Q 行,每行一個整數,表示小 X 喜歡的數的個數。

數據範圍與約定

技術分享

樣例解釋 1

666 以內的質數有 2,3,5,而 4=2?2,6=2?3。因此 2,3,4,5,6 都是小 X 喜 歡的數,而 1 不是。

樣例輸入1

1
1 6

樣例輸出1

5

樣例輸入2

10
282 491
31 178
645 856
227 367
267 487
474 697
219 468
582 792
315 612
249 307

樣例輸出2

97
78
92
65
102
98
114
90
133
29

樣例輸入3

10
20513 96703
15236 86198
23185 78205
40687 48854
42390 95450
63915 76000
36793 92543
35347 53901
44188 76922
82177 90900

樣例輸出3

24413
23001
17784
2669
16785
3833
17712
6028
10442
2734

T2:小X的密室

小 X 正困在一個密室裏,他希望盡快逃出密室。

密室中有 N 個房間,初始時,小 X 在 1 號房間,而出口在 N 號房間。

密室的每一個房間中可能有著一些鑰匙和一些傳送門,一個傳送門會單向地創造一條從房間 X 到房間 Y 的通道。另外,想要通過某個傳送門,就必須具備一些種類的鑰匙(每種鑰匙都要有才能通過)。幸運的是,鑰匙在打開傳送門的封印後,並不會消失。

然而,通過密室的傳送門需要耗費大量的時間,因此,小 X 希望通過盡可能少的傳送門到達出口,你能告訴小 X 這個數值嗎?

另外,小 X 有可能不能逃出這個密室,如果是這樣,請輸出 "No Solution"

輸入格式

第一行三個整數 N,M,K,分別表示房間的數量、傳送門的數量以及鑰匙的種類數。

接下來 N 行,每行 K01,若第 iii 個數為 1,則表示該房間內有第 iii 種鑰匙,若第 iii 個數為 0,則表示該房間內沒有第 iii 種鑰匙。

接下來 M 行,每行先讀入兩個整數 X,Y,表示該傳送門是建立在 X 號房間,通向 Y 號房間的,再讀入 K01,若第 iii 個數為 1,則表示通過該傳送門需要 iii 種鑰匙,若第 iii 個數為0,則表示通過該傳送門不需要第 iii 種鑰匙。

輸出格式

輸出一行一個 "No Solution",或一個整數,表示最少通過的傳送門數。

數據規模與約定

技術分享

更多測試樣例

輸入樣例 4

輸出樣例 4

樣例輸入1

3 3 2
1 0
0 1
0 0
1 3 1 1
1 2 1 0
2 3 1 1

樣例輸出1

2

樣例輸入2

20 40 0
10 18 
18 14 
19 13 
4 14 
13 10 
5 18 
14 1 
13 13 
10 16 
19 11 
11 15 
10 18 
5 8 
12 19 
7 8 
18 6 
14 5 
9 5 
2 17 
13 14 
18 15 
8 18 
7 1 
13 5 
4 6 
17 4 
1 4 
10 10 
13 8 
19 2 
4 9 
3 3 
5 10 
17 5 
12 8 
19 11 
3 16 
17 10 
18 16 
13 13 

樣例輸出2

No Solution

樣例輸入3

20 50 0
8 10 
7 17 
5 11 
14 20 
20 16 
8 19 
12 11 
18 7 
17 5 
4 15 
16 11 
11 8 
10 12 
8 9 
16 8 
3 16 
1 6 
3 20 
6 10 
11 12 
6 8 
18 17 
14 17 
3 11 
4 19 
9 2 
8 6 
13 2 
5 2 
12 19 
8 10 
14 7 
6 12 
6 4 
13 2 
8 7 
13 19 
17 9 
3 14 
18 20 
2 14 
4 17 
20 15 
14 15 
2 15 
7 20 
12 12 
18 10 
15 9 
15 9 

樣例輸出3

4
T3:小X的佛光

小 X 是遠近聞名的學佛,平日裏最喜歡做的事就是蒸發學水。

小 X 所在的城市 X 城是一個含有 N 個節點的無向圖,同時,由於 X 國是一個發展中國家,為了節約城市建設的經費,X 國首相在建造 X 城時只建造 N – 1 條邊,使得城市的各個地點能夠相互到達。

小 X 計劃蒸發 Q 天的學水,每一天會有一名學水從 A 地走到 B 地,並在沿途各個地點留下一個水塘。此後,小 X 會從 C 地走到 B 地,並用佛光蒸發沿途的水塘。由於 X 城是一個學佛橫行的城市,學水留下的水塘即使沒有被小 X 蒸發,也會在第二天之前被其他學佛蒸發殆盡。

現在,小 X 想要知道,他每一天能夠蒸發多少水塘呢?

輸入格式

第一行三個整數 N,Q,num,分別表示 X 城地點的個數,小 X 蒸發學水的天數,以及測試點編號。註意,測試點編號是為了讓選手們更方便的獲得部分分,你可能不需要用到這則信息,在下發的樣例中,測試點編號的含義是該樣例滿足某一測試點限制。

接下來 N – 1 行,每行兩個整數 X,Y,表示 X 地與 Y 地之間有一條邊。

接下來 Q 行,每行三個整數 A,B,C,表示一天中,有一名學水從 A 地走到 B 地,而小 X 會從 C 地走到 B 地。

輸出格式

輸出 Q 行,每行一個整數,表示小 X 能夠蒸發的水塘數。

數據規模與約定

技術分享

特殊性質 1:第 i 條邊連接第 i 和第 i+1個地點。

特殊性質 2A=C

更多測試樣例

樣例輸入 2

樣例輸出 2

樣例輸入 3

樣例輸出 3

樣例輸入 4

樣例輸出 4




樣例輸入

3 3 1
1 2
2 3
1 2 3
1 1 3
3 1 3

樣例輸出

1
1
3

T1:
將線性篩數變形即可
可見線性篩數既可以篩質數,也可以順便判斷質數的一些情況

技術分享
 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<algorithm>
 4 #include<cstring>
 5 #define MAXN 10000001
 6 using namespace std;
 7 int prime[MAXN],cnt;
 8 bool b[MAXN];
 9 bool c[MAXN];
10 int f[MAXN];
11 int main()
12 {
13 //    freopen("data.in","r",stdin);
14     b[1]=1;
15     for(int i=2;i<MAXN;i++){
16         if(!b[i]){
17             prime[++cnt]=i;
18         }
19         for(int j=1;j<=cnt&&i*prime[j]<MAXN;j++){
20             b[i*prime[j]]=1;
21             c[i*prime[j]]+=(!b[i]);
22             if(i%prime[j]==0){
23                 break;
24             }
25         }
26     }
27     for(int i=1;i<MAXN;i++){
28         f[i]=f[i-1];
29         if(!b[i]||c[i]){
30             f[i]++;
31         }
32     }
33     int Q;
34     scanf("%d",&Q);
35     for(int i=1;i<=Q;i++){
36         int L,R;
37         scanf("%d%d",&L,&R);
38         printf("%d\n",f[R]-f[L-1]);
39     }
40     return 0;
41 }
Code1

T2:

由於每條邊的邊權都是1,寬搜即可

鑰匙用二進制存貯,然後可以預處理下子集即可高效判斷

技術分享
 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<vector>
 6 #define MAXN 5005
 7 #define MAXM 6005
 8 #define INF 0x7f7f7f7f
 9 using namespace std;
10 int qL[11000005],qK[11000005],L=1,R;
11 int d[MAXN][2050];
12 int n,m,k;
13 int key_room[MAXN];
14 int first[MAXN],Next[MAXM],to[MAXM],w[MAXM],cnt;
15 //single edge
16 int bel[2050][2050];
17 void Add(int x,int y,int key){
18     Next[++cnt]=first[x];first[x]=cnt;to[cnt]=y;w[cnt]=key;
19 }
20 void bfs(){
21     memset(d,0x7f,sizeof(d));
22     qL[++R]=1;
23     qK[R]=key_room[1];
24     d[qL[R]][qK[R]]=0;
25     while(L<=R){
26         int p=qL[L],key=qK[L];L++;
27         int D=d[p][key];
28         for(int i=first[p];i;i=Next[i]){
29             int j=to[i];
30             if(!bel[key][w[i]]) continue;
31             int dk=(key|key_room[j]);
32             if(d[j][dk]>D+1){
33                 d[j][dk]=D+1;
34                 qL[++R]=j;
35                 qK[R]=dk;
36                 if(n==j){
37                     printf("%d\n",d[j][dk]);
38                     return ;
39                 }
40               }
41         } 
42     }
43     printf("No Solution\n");
44 }
45 int main()
46 {
47 //    freopen("data.in","r",stdin);
48     scanf("%d%d%d",&n,&m,&k);
49     for(int i=1;i<=n;i++){
50         for(int j=0;j<k;j++){
51             int c;
52             scanf("%d",&c);
53             key_room[i]+=(c<<j);
54         }
55     }
56     for(int i=1;i<=m;i++){
57         int x=0,y=0,need=0;
58         scanf("%d%d",&x,&y);
59         for(int j=0;j<k;j++){
60             int c;
61             scanf("%d",&c);
62             need+=(c<<j);
63         }
64         Add(x,y,need);
65     }
66     bel[0][0]=1;
67     for(int i=1;i<(1<<k);i++){
68         for(int j=i;;j=i&j){
69             bel[i][j]=1;
70             j--;
71             if(j<0){
72                 break;
73             }
74         }
75     }
76     bfs();
77     return 0;
78 }
Code2

T3:

裸LCA

註意下分類討論

技術分享
 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<algorithm>
 4 #include<cstring>
 5 #define MAXN 200005
 6 #define LOG 21
 7 using namespace std;
 8 int n,num;
 9 int first[MAXN],Next[MAXN*2],to[MAXN*2],cnt;
10 int dep[MAXN];
11 int fa[LOG][MAXN];
12 //double edge
13 void Add(int x,int y){
14     Next[++cnt]=first[x];first[x]=cnt;to[cnt]=y;
15     Next[++cnt]=first[y];first[y]=cnt;to[cnt]=x;
16 }
17 void dfs(int x){
18     for(int e=first[x];e;e=Next[e]){
19         int y=to[e];
20         if(y==fa[0][x]){
21             continue;
22         }
23         fa[0][y]=x;
24         dep[y]=dep[x]+1;
25         dfs(y);
26     }
27 }
28 int lca(int x,int y){
29     if(dep[x]<dep[y]){
30         swap(x,y);
31     }
32     for(int i=dep[x]-dep[y],p=0;i;i>>=1,p++){
33         if(i&1){
34             x=fa[p][x];
35         }
36     }
37     if(x==y){
38         return x;
39     }
40     for(int k=LOG-1;k>=0;k--){
41         if(fa[k][x]!=fa[k][y]){
42             x=fa[k][x];
43             y=fa[k][y];
44         }
45     }
46     return fa[0][x];
47 }
48 int dist(int x,int y){
49     int LCA=lca(x,y);
50     return dep[x]-dep[LCA]+dep[y]-dep[LCA];
51 }
52 int main()
53 {
54     int T;
55     scanf("%d%d%d",&n,&T,&num);
56     for(int i=1;i<n;i++){
57         int x,y;
58         scanf("%d%d",&x,&y);
59         Add(x,y);
60     }
61     dfs(1);
62     for(int k=1;k<LOG;k++){
63         for(int i=1;i<=n;i++){
64             fa[k][i]=fa[k-1][fa[k-1][i]];
65         }
66     }
67     for(int i=1;i<=T;i++){
68         int A,B,C;
69         scanf("%d%d%d",&A,&B,&C);
70         printf("%d\n",(dist(B,A)+dist(B,C)-dist(A,C))/2+1);
71     }
72     return 0;
73 }
Code3

計蒜客NOIP2017提高組模擬賽(四)day1