2015 ACM-ICPC 北京賽區 網絡賽 部分 題解


由於博主水平及智商不足,所以暫時只能放出下列的題目的題解。

A B D F G H

需要其他題解請自行前往 http://talk.icpc-camp.org/

題目地址:hihocoder 1227-1236

A.  The Cats' Feeding Spots

題意:給出M個點,求以其中一個點為圓心,最小半徑的圓,使得這個圓里恰好有N個點。

(半徑一定要是整數,且點不能恰好在圓上)。

方法:暴力,稍微注意一下精度什么的就好了,1A。

 1 #include <bits/stdc++.h>
 2 #include <ext/hash_map>
 3 #include <ext/hash_set>
 4 #include <ext/pb_ds/assoc_container.hpp>
 5 #include <ext/pb_ds/tree_policy.hpp>
 6 #include <ext/pb_ds/priority_queue.hpp>
 7 using namespace std;
 8 using namespace __gnu_cxx;
 9 using namespace __gnu_pbds;
10 #define XINF INT_MAX
11 #define INF 0x3F3F3F3F
12 #define MP(X,Y) make_pair(X,Y)
13 #define PB(X) push_back(X)
14 #define REP(X,N) for(int X=0;X<N;X++)
15 #define REP2(X,L,R) for(int X=L;X<=R;X++)
16 #define DEP(X,R,L) for(int X=R;X>=L;X--)
17 #define CLR(A,X) memset(A,X,sizeof(A))
18 #define IT iterator
19 #define RIT reverse_iterator
20 typedef long long ll;
21 typedef unsigned long long ull;
22 typedef pair<int,int> PII;
23 typedef vector<PII> VII;
24 typedef vector<int> VI;
25 typedef tree<int, null_type, greater<int>, rb_tree_tag, tree_order_statistics_node_update > rb_tree_set;
26 typedef tree<int, int, greater<int>, rb_tree_tag, tree_order_statistics_node_update > rb_tree;
27 #define PQ std::priority_queue
28 #define HEAP __gnu_pbds::priority_queue
29 #define X first
30 #define Y second
31 #define lson(X) ((X)<<1)
32 #define rson(X) ((X)<<1|1)
33 
34 double x[100];
35 double y[100];
36 
37 double dist(int i, int j) {
38     return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
39 }
40 
41 int main()
42 {
43 #ifdef LOCAL
44     freopen("in.txt","r",stdin);
45 #endif // LOCAL
46     int t;
47     scanf("%d",&t);
48     while(t--) {
49         int n,k;
50         scanf("%d%d",&n,&k);
51         REP(i,n) {
52             scanf("%lf%lf", &x[i], &y[i]);
53         }
54         if(k>n) {
55             puts("-1");
56             continue;
57         }
58         int mx = INF;
59         REP(i,n) {
60             vector<double> v;
61             REP(j,n)
62                 v.PB(dist(i,j));
63             sort(v.begin(), v.end());
64             
65             double d = v[k-1];
66             int r = (d + 1e-8 + 1);
67             int ok = 1, cnt = 0;
68             REP(j,n) {
69                 if(fabs(v[j] - r) < 1e-8) ok = 0;
70                 if(v[j] < r) cnt++;
71             }
72             if(ok && cnt == k) {
73                 mx = min(mx, r);
74             }
75         }
76         printf("%d\n", mx==INF?-1:mx);
77     }
78     return 0;
79 }

 

B. Mission Impossible 6題意:典型的文本編輯模擬題。題意太長就不描述了。

解法:純模擬,需要注意的是該題有一個最大長度限制m,如果有操作使得長度超過m則忽視該操作。復制粘貼操作、以及覆蓋模式的時候需要注意一些細節。

比賽的時候以為直接模擬會T,於是用鏈表做了,1A。

然而賽后發現其他人用string暴力都過了,后來算了一下的確復雜度不會高(智商捉急)。

  1 #include <bits/stdc++.h>
  2 #include <ext/hash_map>
  3 #include <ext/hash_set>
  4 #include <ext/pb_ds/assoc_container.hpp>
  5 #include <ext/pb_ds/tree_policy.hpp>
  6 #include <ext/pb_ds/priority_queue.hpp>
  7 using namespace std;
  8 using namespace __gnu_cxx;
  9 using namespace __gnu_pbds;
 10 #define XINF INT_MAX
 11 #define INF 0x3F3F3F3F
 12 #define MP(X,Y) make_pair(X,Y)
 13 #define PB(X) push_back(X)
 14 #define REP(X,N) for(int X=0;X<N;X++)
 15 #define REP2(X,L,R) for(int X=L;X<=R;X++)
 16 #define DEP(X,R,L) for(int X=R;X>=L;X--)
 17 #define CLR(A,X) memset(A,X,sizeof(A))
 18 #define IT iterator
 19 #define RIT reverse_iterator
 20 typedef long long ll;
 21 typedef unsigned long long ull;
 22 typedef pair<int,int> PII;
 23 typedef vector<PII> VII;
 24 typedef vector<int> VI;
 25 typedef tree<int, null_type, greater<int>, rb_tree_tag, tree_order_statistics_node_update > rb_tree_set;
 26 typedef tree<int, int, greater<int>, rb_tree_tag, tree_order_statistics_node_update > rb_tree;
 27 #define PQ std::priority_queue
 28 #define HEAP __gnu_pbds::priority_queue
 29 #define X first
 30 #define Y second
 31 #define lson(X) ((X)<<1)
 32 #define rson(X) ((X)<<1|1)
 33 
 34 char s[10010];
 35 
 36 int S = 0;
 37 int tot;
 38 
 39 int L[100100], R[100100];
 40 char c[100100];
 41 
 42 #define INSERT_MODE 0
 43 #define OVERWITE_MODE 1
 44 
 45 char clip[10010];
 46 
 47 int main()
 48 {
 49 #ifdef LOCAL
 50     freopen("in.txt","r",stdin);
 51 #endif // LOCAL
 52     int t;
 53     scanf("%d",&t);
 54     while(t--) {
 55         int m;
 56         scanf("%d%s", &m, s);
 57         L[S] = NULL;
 58         R[S] = NULL;
 59         c[S] = '-';
 60         tot = 1;
 61         int pos = S;
 62         int mode = INSERT_MODE;
 63         int start = -1;
 64         int length = 0;
 65         int left = 0;
 66         int sel_length = 0;
 67         int clip_length = 0;
 68         for(int i = 0; s[i]; i++) {
 69             if(s[i] == 'L') {
 70                 if(pos != S) {
 71                     pos = L[pos];
 72                     left--;
 73                     if(start != -1) sel_length--;
 74                 }
 75             }else if(s[i] == 'R'){
 76                 if(R[pos] != NULL) {
 77                     pos = R[pos];
 78                     left++;
 79                     if(start != -1) sel_length++;
 80                 }
 81             }else if(s[i] == 'S'){
 82                 mode = 1 - mode;
 83             }else if(s[i] == 'D'){
 84                 if(start == -1) {
 85                     if(R[pos] != NULL) {
 86                         L[R[pos] = R[R[pos]]] = pos;
 87                         length--;
 88                     }
 89                 }else{
 90                     if(pos != start) {
 91                         if(sel_length < 0) {
 92                             L[R[pos] = R[start]] = pos;
 93                         }else{
 94                             L[R[start] = R[pos]] = start;
 95                         }
 96                         length -= abs(sel_length);
 97                     }
 98                     start = -1;
 99                 }
100             }else if(s[i] == 'B'){
101                 if(pos != S) {
102                     left--;
103                     pos = L[pos];
104                     L[R[pos] = R[R[pos]]] = pos;
105                     length--;
106                 }
107             }else if(s[i] == 'C'){
108                 if(start == -1) {
109                     start = pos;
110                     sel_length = 0;
111                 }else{
112                     clip_length = 0;
113                     int st = start, ed = pos;
114                     if(sel_length < 0) swap(st, ed);
115                     for(int j = st; j != ed; j = R[j]) {
116                         clip[clip_length++] = c[R[j]];
117                     }
118                     start = -1;
119                 }
120             }else if(s[i] == 'V'){
121                 if(mode == INSERT_MODE) {
122                     if(clip_length + length <= m) {
123                         REP(j,clip_length) {
124                             L[R[tot] = R[pos]] = tot;
125                             L[R[pos] = tot] = pos;
126                             c[tot] = clip[j];
127                             pos = tot++;
128                             left++;
129                             length++;
130                         }
131                     }
132                 }else if(mode == OVERWITE_MODE) {
133                     if(clip_length + left <= m) {
134                         REP(j,clip_length) {
135                             if(R[pos] != NULL) {
136                                 L[R[pos] = R[R[pos]]] = pos;
137                                 length--;
138                             }
139                             L[R[tot] = R[pos]] = tot;
140                             L[R[pos] = tot] = pos;
141                             c[tot] = clip[j];
142                             pos = tot++;
143                             left++;
144                             length++;
145                         }
146                     }
147                 }
148             }else{
149                 if(mode == INSERT_MODE && 1 + length <= m) {
150                     L[R[tot] = R[pos]] = tot;
151                     L[R[pos] = tot] = pos;
152                     c[tot] = s[i];
153                     pos = tot++;
154                     left++;
155                     length++;
156                 }else if(mode == OVERWITE_MODE && 1 + left <= m) {
157                     if(R[pos] != NULL) {
158                         L[R[pos] = R[R[pos]]] = pos;
159                         length--;
160                     }
161                     L[R[tot] = R[pos]] = tot;
162                     L[R[pos] = tot] = pos;
163                     c[tot] = s[i];
164                     pos = tot++;
165                     left++;
166                     length++;
167                 }
168             }
169             if(s[i] != 'L' && s[i] != 'R' && s[i] != 'C') start = -1;
170         }
171         if(R[S] == NULL) {
172             puts("NOTHING");
173         }else{
174             for(int i = S; R[i] != NULL; i = R[i]) {
175                 putchar(c[R[i]]);
176             }
177             putchar('\n');
178         }
179     }
180     return 0;
181 }

 

D. The Celebration of Rabbits

題意:有2*n+1個人,第一遍給每個人先發 [0,m]中任意值的錢,第二遍再給每個人發x元,x的范圍為[L,R]。問有多少種第一遍發錢的方法使得:存在x使得這些人的錢的異或值在第二遍發完之后為0。解法:首先暴力打表發現如果某一方案可行,則第二遍發錢的值x一定唯一。(並不會證,但發現2*n+1為奇數時有該性質)

然后就可以轉化為:先枚舉x,然后求給每個人發[x, x+m]元錢,使得他們異或值為0的方案數。

這個問題可以參照TC SRM 518, 1000的題解。鏈接

(或參照CF 259 div1 D)

直接枚舉x之后使用快速沃爾什變換fwt即可。

注意模數是1e9+7,而fwt逆變換之后需要除掉2n,所以模數要改為(1e9+7) * 2n,導致乘法可能會超long long。如果用快速乘太慢,可以參照下面的寫法。

復雜度O((R-L)*M*(logM+logN))

比賽的時候寫了一下發現本地大數據跑的有點慢,但是交上去就直接過了。

(聽說本題有一個O(N*M)復雜度的算法,並不能想到,orz)

 

  1 #include <bits/stdc++.h>
  2 #include <ext/hash_map>
  3 #include <ext/hash_set>
  4 #include <ext/pb_ds/assoc_container.hpp>
  5 #include <ext/pb_ds/tree_policy.hpp>
  6 #include <ext/pb_ds/priority_queue.hpp>
  7 using namespace std;
  8 using namespace __gnu_cxx;
  9 using namespace __gnu_pbds;
 10 #define XINF INT_MAX
 11 #define INF 0x3F3F3F3F
 12 #define MP(X,Y) make_pair(X,Y)
 13 #define PB(X) push_back(X)
 14 #define REP(X,N) for(int X=0;X<N;X++)
 15 #define REP2(X,L,R) for(int X=L;X<=R;X++)
 16 #define DEP(X,R,L) for(int X=R;X>=L;X--)
 17 #define CLR(A,X) memset(A,X,sizeof(A))
 18 #define IT iterator
 19 #define RIT reverse_iterator
 20 typedef long long ll;
 21 typedef unsigned long long ull;
 22 typedef pair<int,int> PII;
 23 typedef vector<PII> VII;
 24 typedef vector<int> VI;
 25 typedef tree<int, null_type, greater<int>, rb_tree_tag, tree_order_statistics_node_update > rb_tree_set;
 26 typedef tree<int, int, greater<int>, rb_tree_tag, tree_order_statistics_node_update > rb_tree;
 27 #define PQ std::priority_queue
 28 #define HEAP __gnu_pbds::priority_queue
 29 #define X first
 30 #define Y second
 31 #define lson(X) ((X)<<1)
 32 #define rson(X) ((X)<<1|1)
 33 
 34 ll mo;
 35 
 36 ll mul(ll a,ll b){
 37     return ((a*b-ll(((long double)a)/mo*b+1e-3)*mo)%mo+mo)%mo;
 38 }
 39 ll pow_mod(ll a, ll n) {
 40     a%=mo;
 41     ll r = 1;
 42     while(n) {
 43         if(n&1) r = mul(r,a);
 44         a=mul(a,a);
 45         n>>=1;
 46     }
 47     return r;
 48 }
 49 void fwt(ll *a,int l,int r){
 50      if(l!=r){ 
 51                int mid=l+r>>1,len=mid-l+1;
 52               fwt(a,l,mid);
 53               fwt(a,mid+1,r);             
 54               for (int i=l;i<=mid;i++){
 55                   ll u=a[i],v=a[i+len];
 56                   a[i]=(u+v)%mo;
 57                   a[i+len]=(u-v)%mo;
 58               }
 59      }
 60 } 
 61 void ifwt(ll *a,int l,int r){
 62      if(l!=r){              
 63               int mid=l+r>>1,len=mid-l+1;
 64               for (int i=l;i<=mid;i++){
 65                   ll u=a[i],v=a[i+len];
 66                   a[i]=(u+v)%mo;
 67                   a[i+len]=(u-v)%mo;
 68               }
 69               ifwt(a,l,mid);
 70               ifwt(a,mid+1,r);
 71      }
 72 } 
 73 
 74 const int M = 1000000007;
 75 int N = 2048;
 76 
 77 ll a[2048];
 78 
 79 ll gao(int L, int R, int n) {
 80     N = 1;
 81     while(N<=R) N*=2;
 82     mo = 1LL * M * N;
 83     ll res = 0;
 84     REP(i,N) a[i] = i<=R&&i>=L?1:0;
 85     fwt(a,0,N-1);
 86     REP(i,N) a[i] = pow_mod(a[i], n);
 87     ifwt(a,0,N-1);
 88     REP(i,N) a[i] = (a[i]+mo)%mo/N;
 89     return (a[0]+M)%M;
 90 }
 91 
 92 int main()
 93 {
 94 #ifdef LOCAL
 95     freopen("in.txt","r",stdin);
 96 #endif // LOCAL
 97     int n,m,L,R;
 98     while(~scanf("%d%d%d%d",&n,&m,&L,&R)) {
 99         n = n*2+1;
100         ll ans = 0;
101         REP2(i,L,R) {
102             ans+=gao(i,m+i,n);
103             ans%=M;
104         }
105         printf("%d\n", (int)ans);
106     }
107     return 0;
108 }

 

F. Couple Trees

題意:給出兩顆大小為N的樹A和B,節點標號分別為1..n,且標號小的元素比標號大的元素深度淺。

之后給出Q次查詢x, y,要求查詢標號最大的點k,使得在A樹中k是x的祖先,B樹中k是y的祖先。(題目強制在線)

N,M <=100000

解法:先考慮離線解法,則我們對A樹dfs,每遍歷到一個點就在B樹中將這個點標記,回溯的時候將這個標記刪除,然后我們在遍歷到A樹中的x點時,就可以通過維護B樹的根到y點的鏈上所有標記過的點的最大值來計算題意中的查詢了。這個方法可以通過樹鏈剖分等完成。

發現這個方法難以拓展為在線算法,於是我們將標記點的做法轉化為對這個點的子樹中所有點更新一個最大值,然后就可以單點查詢B樹中點y上方的最大標記點。於是我們發現通過維護B樹的dfs序列即可把轉化為區間更新最大值,單點查詢的簡單問題。

之后用主席樹(可持久化線段樹)就可以輕易轉化為在線算法。

復雜度O((N+M)*log(N))

表示本人智商比較捉急,比賽時只能想到樹分塊的復雜度非常高的算法,沒有敢寫。

賽后寫了一下發現還是比想象中的簡單。

 

  1 #include <bits/stdc++.h>
  2 #include <ext/hash_map>
  3 #include <ext/hash_set>
  4 #include <ext/pb_ds/assoc_container.hpp>
  5 #include <ext/pb_ds/tree_policy.hpp>
  6 #include <ext/pb_ds/priority_queue.hpp>
  7 using namespace std;
  8 using namespace __gnu_cxx;
  9 using namespace __gnu_pbds;
 10 #define XINF INT_MAX
 11 #define INF 0x3F3F3F3F
 12 #define MP(X,Y) make_pair(X,Y)
 13 #define PB(X) push_back(X)
 14 #define REP(X,N) for(int X=0;X<N;X++)
 15 #define REP2(X,L,R) for(int X=L;X<=R;X++)
 16 #define DEP(X,R,L) for(int X=R;X>=L;X--)
 17 #define CLR(A,X) memset(A,X,sizeof(A))
 18 #define IT iterator
 19 #define RIT reverse_iterator
 20 typedef long long ll;
 21 typedef unsigned long long ull;
 22 typedef pair<int,int> PII;
 23 typedef vector<PII> VII;
 24 typedef vector<int> VI;
 25 typedef tree<int, null_type, greater<int>, rb_tree_tag, tree_order_statistics_node_update > rb_tree_set;
 26 typedef tree<int, int, greater<int>, rb_tree_tag, tree_order_statistics_node_update > rb_tree;
 27 #define PQ std::priority_queue
 28 #define HEAP __gnu_pbds::priority_queue
 29 #define X first
 30 #define Y second
 31 #define lson(X) ((X)<<1)
 32 #define rson(X) ((X)<<1|1)
 33 
 34 #define MAXN 100010
 35 #define MAXT (MAXN*80)
 36 int n;
 37 
 38 VI Map1[MAXN];
 39 VI Map2[MAXN];
 40 int dep1[MAXN];
 41 int dep2[MAXN];
 42 
 43 int T[MAXN];
 44 int ls[MAXT];
 45 int rs[MAXT];
 46 int mx[MAXT];
 47 int tot = 0;
 48 
 49 int ins(int i, int L, int R, int l, int r, int x) {
 50     l = max(l,L);
 51     r = min(r,R);
 52     if(l>r) return i;
 53     ls[tot] = ls[i];
 54     rs[tot] = rs[i];
 55     mx[tot] = mx[i];
 56     i = tot++;
 57     int M = (L+R)>>1;
 58     
 59     if(L == l && R == r) {
 60         mx[i] = max(mx[i], x);
 61         return i;
 62     }
 63     ls[i] = ins(ls[i], L, M, l, r, x);
 64     rs[i] = ins(rs[i], M+1, R, l, r, x);
 65     return i;
 66 }
 67 
 68 int query(int i, int L, int R, int x) {
 69     int M = (L+R)>>1;
 70     int r = mx[i];
 71     if(L == R) return r;
 72     if(x<=M)
 73         r = max(mx[i], query(ls[i], L, M, x));
 74     else
 75         r = max(mx[i], query(rs[i], M+1, R, x));
 76     return r;
 77 }
 78 
 79 int s[MAXN];
 80 int e[MAXN];
 81 int dfn = 0;
 82 
 83 void dfs2(int u, int fa = -1) {
 84     s[u] = dfn++;
 85     REP(i,Map2[u].size()) {
 86         int v = Map2[u][i];
 87         if(v == fa) continue;
 88         dep2[v] = dep2[u] + 1;
 89         dfs2(v, u);
 90     }
 91     e[u] = dfn-1;
 92 }
 93 
 94 void dfs(int u, int fa = -1) {
 95     REP(i,Map1[u].size()) {
 96         int v = Map1[u][i];
 97         if(v == fa) continue;
 98         T[v] = ins(T[u], 0, n-1, s[v], e[v], v);
 99         dep1[v] = dep1[u] + 1;
100         dfs(v, u);
101     }
102 }
103 
104 int main()
105 {
106 #ifdef LOCAL
107     freopen("in.txt","r",stdin);
108 #endif // LOCAL
109     int m;
110     while(~scanf("%d%d",&n,&m)) {
111         REP(i,n) Map1[i].clear();
112         REP(i,n) Map2[i].clear();
113         REP(i,n-1) {
114             int f;
115             scanf("%d",&f);
116             f--;
117             Map1[f].PB(i+1);
118             Map1[i+1].PB(f);
119         }
120         REP(i,n-1) {
121             int f;
122             scanf("%d",&f);
123             f--;
124             Map2[f].PB(i+1);
125             Map2[i+1].PB(f);
126         }
127         dfn = 0;
128         dfs2(0);
129         
130         T[0] = 0;
131         ls[0] = rs[0] = 0;
132         mx[0] = 0;
133         tot = 1;
134         
135         dfs(0);
136         int last = 0;
137         REP(i,m) {
138             int x,y;
139             scanf("%d%d",&x,&y);
140             x=(x+last)%n;
141             y=(y+last)%n;
142             last = query(T[x],0,n-1,s[y]);
143             printf("%d %d %d\n", last+1, dep1[x]-dep1[last]+1, dep2[y]-dep2[last]+1);
144             last++;
145         }
146     }
147     return 0;
148 }

 

G. Boxes

題意:給出n個盒子放成一排,每個盒子大小不同,小的盒子只能疊在大的盒子上面,即按照漢諾塔的規則移動這些盒子,使得最后將這些盒子排成從小到大的一排。求最少步數。

N<=7

解法:暴力bfs搜索打表,狀態只有NN種,即每個盒子有N個位置可以放,轉移的時候大膽地寫O(N*N)的也是沒有問題的。本地跑出來1秒多,交上去還是200ms+就過了。

這次在hihocoder上,本地跑得慢直接交表的方法也是可以的。這題N=7的時候也只需要一個5040大小的表。

比賽的時候隊友狀態表示比較復雜,用long long表示狀態,答案存在hashmap里,神奇地卡過了。

orz..Java三倍時限跑了2s多

 

  1 #include <bits/stdc++.h>
  2 #include <ext/hash_map>
  3 #include <ext/hash_set>
  4 #include <ext/pb_ds/assoc_container.hpp>
  5 #include <ext/pb_ds/tree_policy.hpp>
  6 #include <ext/pb_ds/priority_queue.hpp>
  7 using namespace std;
  8 using namespace __gnu_cxx;
  9 using namespace __gnu_pbds;
 10 #define XINF INT_MAX
 11 #define INF 0x3F3F3F3F
 12 #define MP(X,Y) make_pair(X,Y)
 13 #define PB(X) push_back(X)
 14 #define REP(X,N) for(int X=0;X<N;X++)
 15 #define REP2(X,L,R) for(int X=L;X<=R;X++)
 16 #define DEP(X,R,L) for(int X=R;X>=L;X--)
 17 #define CLR(A,X) memset(A,X,sizeof(A))
 18 #define IT iterator
 19 #define RIT reverse_iterator
 20 typedef long long ll;
 21 typedef unsigned long long ull;
 22 typedef pair<int,int> PII;
 23 typedef vector<PII> VII;
 24 typedef vector<int> VI;
 25 typedef tree<int, null_type, greater<int>, rb_tree_tag, tree_order_statistics_node_update > rb_tree_set;
 26 typedef tree<int, int, greater<int>, rb_tree_tag, tree_order_statistics_node_update > rb_tree;
 27 #define PQ std::priority_queue
 28 #define HEAP __gnu_pbds::priority_queue
 29 #define X first
 30 #define Y second
 31 #define lson(X) ((X)<<1)
 32 #define rson(X) ((X)<<1|1)
 33 
 34 int a[10]; PII b[10];
 35 
 36 vector<int> mp[10];
 37 
 38 #define lowbit(x) ((x)&-(x))
 39 
 40 void gao(int n) {
 41     int sz = 1;
 42     REP(i,n) sz*=n;
 43     mp[n].resize(sz);
 44     REP(i,sz) mp[n][i] = -1;
 45     
 46     int s = 0;
 47     REP(i,n)
 48         s = s * n + i;
 49     mp[n][s] = 0;
 50     int p[10];
 51     int mn[10];
 52     
 53     queue<int> q;
 54     q.push(s);
 55     int cnt = 0;
 56     while(!q.empty()) {
 57         int x = q.front();
 58         int stp = mp[n][x];
 59         q.pop();
 60         int tx = x;
 61         REP(i,n) {
 62             p[i] = tx%n;
 63             tx /= n;
 64         }
 65         reverse(p, p+n);
 66         REP(i,n) mn[i] = 10;
 67         REP(i,n) {
 68             mn[p[i]] = min(mn[p[i]], i);
 69         }
 70         REP(i,n) if(mn[p[i]] == i) {
 71             if(p[i] > 0 && mn[p[i]-1] > i) {
 72                 int xx = 0;
 73                 REP(j,n) {
 74                     xx = xx * n + (i==j?p[j]-1:p[j]);
 75                 }
 76                 if(mp[n][xx] == -1) {
 77                     mp[n][xx] = stp+1;
 78                     q.push(xx);
 79                     cnt++;
 80                 }
 81             }
 82             if(p[i] < n-1 && mn[p[i]+1] > i) {
 83                 int xx = 0;
 84                 REP(j,n) {
 85                     xx = xx * n + (i==j?p[j]+1:p[j]);
 86                 }
 87                 if(mp[n][xx] == -1) {
 88                     mp[n][xx] = stp+1;
 89                     q.push(xx);
 90                     cnt++;
 91                 }
 92             }
 93         }
 94     }
 95 }
 96 
 97 int main()
 98 {
 99 #ifdef LOCAL
100     freopen("in.txt","r",stdin);
101 #endif // LOCAL
102     REP2(i,1,7) gao(i);
103     int t;
104     scanf("%d",&t);
105     while(t--) {
106         int n;
107         scanf("%d", &n);
108         REP(i,n) scanf("%d",&a[i]);
109         REP(i,n) b[i] = MP(a[i],i);
110         sort(b, b+n);
111         int r = 0;
112         REP(i,n) {
113             r = r * n + (b[i].Y);
114         }
115         printf("%d\n", mp[n][r]);
116     }
117     return 0;
118 }

 

H. Fractal

題意:看圖,就是一個1*1的正方形,里面每個線段中點連線再連成一個正方形,不斷進行這個操作,然后要求查詢與這個正方形的一邊平行且距離該邊距離為x時,和這個圖形有多少個交點。無窮個則輸出-1。

0<=x<0.5,  x精確到1e-8

解法:直接暴力算個50次就差不多精度小於1e-8了。然后對於每次查詢暴力即可。

注意精度問題,比賽時用1e-9的精度沒有過。。另外還傻呵呵地去特判了x=0.5的情況。

 

 1 #include <bits/stdc++.h>
 2 #include <ext/hash_map>
 3 #include <ext/hash_set>
 4 #include <ext/pb_ds/assoc_container.hpp>
 5 #include <ext/pb_ds/tree_policy.hpp>
 6 #include <ext/pb_ds/priority_queue.hpp>
 7 using namespace std;
 8 using namespace __gnu_cxx;
 9 using namespace __gnu_pbds;
10 #define XINF INT_MAX
11 #define INF 0x3F3F3F3F
12 #define MP(X,Y) make_pair(X,Y)
13 #define PB(X) push_back(X)
14 #define REP(X,N) for(int X=0;X<N;X++)
15 #define REP2(X,L,R) for(int X=L;X<=R;X++)
16 #define DEP(X,R,L) for(int X=R;X>=L;X--)
17 #define CLR(A,X) memset(A,X,sizeof(A))
18 #define IT iterator
19 #define RIT reverse_iterator
20 typedef long long ll;
21 typedef unsigned long long ull;
22 typedef pair<int,int> PII;
23 typedef vector<PII> VII;
24 typedef vector<int> VI;
25 typedef tree<int, null_type, greater<int>, rb_tree_tag, tree_order_statistics_node_update > rb_tree_set;
26 typedef tree<int, int, greater<int>, rb_tree_tag, tree_order_statistics_node_update > rb_tree;
27 #define PQ std::priority_queue
28 #define HEAP __gnu_pbds::priority_queue
29 #define X first
30 #define Y second
31 #define lson(X) ((X)<<1)
32 #define rson(X) ((X)<<1|1)
33 
34 double x[100];
35 double y[100];
36 
37 double dist(int i, int j) {
38     return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
39 }
40 
41 vector<pair<double, double> > v;
42 
43 int main()
44 {
45 #ifdef LOCAL
46     freopen("in.txt","r",stdin);
47 #endif // LOCAL
48     double a = 0.25;
49     double d = 0;
50     REP(i, 50) {
51         v.PB(MP(d,1-d));
52         d+=a;
53         a/=2;
54     }
55     
56     int t;
57     scanf("%d",&t);
58     while(t--) {
59         double x;
60         scanf("%lf", &x);
61         if(fabs(x-0.5)<1e-10) {
62             puts("1002");
63             continue;
64         }
65         int infinite = 0;
66         int ans = 0;
67         REP(i,v.size()) {
68             auto p = v[i];
69             if(x>=p.X && x<=p.Y) ans+=4;
70             if(fabs(v[i].X-x)<1e-10 || fabs(v[i].Y-x)<1e-10) {
71                 infinite = 1;
72             }
73         }
74         printf("%d\n", infinite?-1:ans);
75     }
76     return 0;
77 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM