由於博主水平及智商不足,所以暫時只能放出下列的題目的題解。
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 }
