8/11

2016 Multi-University Training Contest 1

官方题解

老年选手历险记

最小生成树+线性期望 A Abandoned country(BH)

题意:

  1. 求最小生成树 2. 求在某一棵最小生成树任意两点的最小距离的期望值。

思路:

  首先题目说了边权值都是不同的,所以最小生成树唯一。那么只要统计出最小生成树的每一条边在“任意两点走经过它“的情况下所贡献的值,发现在一棵树里,一条边所贡献的次数为,sz[v]表示v子树包括节点v的个数。如下图所示,红边所贡献的次数即为”选一个蓝点再选一个绿点“的方案数。

代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long ll;
  5. const int N = 1e5 + 5;
  6. const int M = 1e6 + 5;
  7.  
  8. struct Edge {
  9. int u, v, w;
  10. bool operator < (const Edge &rhs) const {
  11. return w < rhs.w;
  12. }
  13. }edges[M];
  14.  
  15. int n, m;
  16.  
  17. vector<pair<int, int> > edge[N];
  18.  
  19. void init_edge() {
  20. for (int i=1; i<=n; ++i) {
  21. edge[i].clear ();
  22. }
  23. }
  24.  
  25. int rt[N];
  26.  
  27. void init_DSU() {
  28. for (int i=1; i<=n; ++i) {
  29. rt[i] = i;
  30. }
  31. }
  32.  
  33. int Find(int x) {
  34. return rt[x] == x ? x : rt[x] = Find (rt[x]);
  35. }
  36.  
  37. int sz[N];
  38.  
  39. ll sumw;
  40.  
  41. void DFS2(int u, int fa) {
  42. for (auto t: edge[u]) {
  43. int v = t.first, w = t.second;
  44. if (v == fa) continue;
  45. sumw += (ll) w * (n - sz[v]) * sz[v];
  46. DFS2 (v, u);
  47. }
  48. }
  49.  
  50. void DFS(int u, int fa) {
  51. sz[u] = 1;
  52. for (auto t: edge[u]) {
  53. int v = t.first, w = t.second;
  54. if (v == fa) continue;
  55. DFS (v, u);
  56. sz[u] += sz[v];
  57. }
  58. }
  59.  
  60. double solve() {
  61. memset (sz, 0, sizeof (sz));
  62. sumw = 0;
  63. DFS (1, 0);
  64. DFS2 (1, 0);
  65. return ((double) sumw * 2 / n / (n - 1));
  66. }
  67.  
  68. int main() {
  69. int T;
  70. scanf ("%d", &T);
  71. while (T--) {
  72. scanf ("%d%d", &n, &m);
  73. init_DSU ();
  74. int tot = 0;
  75. for (int i=1; i<=m; ++i) {
  76. int u, v, w;
  77. scanf ("%d%d%d", &u, &v, &w);
  78. edges[tot++] = (Edge) {u, v, w};
  79. }
  80. std::sort (edges, edges+tot);
  81.  
  82. init_edge ();
  83. ll sum = 0;
  84. for (int i=0; i<tot; ++i) {
  85. int u = edges[i].u, v = edges[i].v, w = edges[i].w;
  86. int fu = Find (u), fv = Find (v);
  87. if (fu == fv) continue;
  88. sum += w;
  89. rt[fv] = fu;
  90. edge[u].push_back ({v, w});
  91. edge[v].push_back ({u, w});
  92. }
  93. printf ("%I64d %.2f\n", sum, solve ());
  94. }
  95. return 0;
  96. }

状态压缩+博弈 B Chess(BH) 

题意:

  有n*20的格子,某些格子上有棋子,A和B轮流操作,可以一个棋子放到右边第一个空位置,不能操作者输,A先操作,问输赢。

思路:

  这是简单的Nim问题,状态压缩,算出所有状态的sg值。看完训练指南的内容再结合代码应该能懂了吧。

代码:

  1. #include <bits/stdc++.h>
  2.  
  3. int a[1005];
  4. int sg[(1<<20)+5];
  5. int vis[25];
  6.  
  7. int mex(int u) {
  8. memset (vis, 0, sizeof (vis));
  9. for (int i=0; i<20; ++i) {
  10. if (u & (1<<i)) {
  11. int j = i - 1;
  12. while (j >= 0 && (u & (1<<j))) j--;
  13. if (j >= 0) {
  14. int v = u ^ (1<<i) ^ (1<<j);
  15. vis[sg[v]] = 1;
  16. }
  17. }
  18. }
  19. for (int i=0; ; ++i) {
  20. if (!vis[i]) return i;
  21. }
  22. }
  23.  
  24. void init() {
  25. memset (sg, -1, sizeof (sg));
  26. int x = 0;
  27. sg[0] = 0;
  28. //预处理对于所有必输态赋值为0
  29. for (int i=0; i<20; ++i) {
  30. x |= (1<<i);
  31. sg[x] = 0;
  32. }
  33. for (int i=1; i<(1<<20); ++i) {
  34. if (sg[i] == -1) sg[i] = mex (i);
  35. }
  36. }
  37.  
  38. int main() {
  39. init ();
  40. int T;
  41. scanf ("%d", &T);
  42. while (T--) {
  43. int n;
  44. scanf ("%d", &n);
  45. int ans = 0;
  46. for (int i=1; i<=n; ++i) {
  47. int m;
  48. scanf ("%d", &m);
  49. int tmp = 0;
  50. for (int j=1; j<=m; ++j) {
  51. int x;
  52. scanf ("%d", &x);
  53. //为了从小到大递推,和计算机二进制数方向相同
  54. tmp |= (1<<(20-x));
  55. }
  56. ans ^= sg[tmp];
  57. }
  58. printf ("%s\n", ans > 0 ? "YES" : "NO");
  59. }
  60. return 0;
  61. }

最短路?搜索?不会 C Game

数论(区间GCD问题)D GCD(BH)

题意:

  1. 区间[l, r]的GCD值 2. 问有多少个区间的GCD值为gcd

思路:

  第一个操作线段树或者ST都可以做,第二个问题的关键点是

  简单来说,就是固定右端点R,然后左端点往左边移动,查询GCD,如果相同就跳到这个GCD所对应的区间的左端点(并且维护这个gcd现在的区间的两端点的位置),因为一个数的质因数最多有log(x)个,而且求GCD是递减的过程,所以跳跃的次数是log级的。

本场比赛就因为这题坑了好久,GCD的性质不够了解。学习资料

代码:

  1. #include <bits/stdc++.h>
  2.  
  3. const int N = 1e5 + 5;
  4. int a[N];
  5.  
  6. int GCD(int a, int b) {
  7. return b ? GCD (b, a % b) : a;
  8. }
  9.  
  10. #define lson l, mid, o << 1
  11. #define rson mid + 1, r, o << 1 | 1
  12.  
  13. int val[N<<2];
  14.  
  15. void push_up(int o) {
  16. val[o] = GCD (val[o<<1], val[o<<1|1]);
  17. }
  18.  
  19. void build(int l, int r, int o) {
  20. if (l == r) {
  21. val[o] = a[l];
  22. return ;
  23. }
  24. int mid = l + r >> 1;
  25. build (lson);
  26. build (rson);
  27. push_up (o);
  28. }
  29.  
  30. int query(int ql, int qr, int l, int r, int o) {
  31. if (ql <= l && r <= qr) {
  32. return val[o];
  33. }
  34. int mid = l + r >> 1, ret = 0;
  35. if (ql <= mid) ret = GCD (ret, query (ql, qr, lson));
  36. if (qr > mid) ret = GCD (ret, query (ql, qr, rson));
  37. return ret;
  38. }
  39.  
  40. int n;
  41.  
  42. std::map<int, long long> mp;
  43. int pre[N];
  44.  
  45. void init() {
  46. for (int i=1; i<=n; ++i) {
  47. pre[i] = i;
  48. }
  49. mp.clear ();
  50. }
  51.  
  52. void prepare() {
  53. build (1, n, 1);
  54. for (int i=1; i<=n; ++i) {
  55. int L = i, g = a[i];
  56. while (L > 0) {
  57. int R = L;
  58. g = GCD (g, a[L]);
  59. while (L > 1 && GCD (g, a[L-1]) == g) {
  60. L = pre[L-1];
  61. pre[R] = L;
  62. }
  63. mp[g] += (R - L + 1);
  64. L--;
  65. }
  66. }
  67. }
  68.  
  69. int main() {
  70. int T;
  71. scanf ("%d", &T);
  72. for (int cas=1; cas<=T; ++cas) {
  73. scanf ("%d", &n);
  74. init ();
  75.  
  76. for (int i=1; i<=n; ++i) {
  77. scanf ("%d", &a[i]);
  78. }
  79.  
  80. prepare ();
  81.  
  82. int q;
  83. scanf ("%d", &q);
  84. printf ("Case #%d:\n", cas);
  85. while (q--) {
  86. int ql, qr;
  87. scanf ("%d%d", &ql, &qr);
  88. int g = query (ql, qr, 1, n, 1);
  89. printf ("%d %I64d\n", g, mp[g]);
  90. }
  91. }
  92. return 0;
  93. }

二分图匹配(匈牙利算法)E Necklace(BH)

题意:

  有n颗阳属性的珠子和n颗阴属性的珠子,给了m条规则,就是某些阳珠子和阴珠子不能相邻,问2*n颗串成项链后最少几颗会违反规则。

思路:

  先枚举阴珠子的排列顺序(固定第一个不动,因为是环)。然后对于某一个排列,问题可以转换为”阳珠子如何插如使得不违反规则的珠子最多“,这个用匈牙利算法解决,时间复杂度为。卿学姐DFS剪个枝也能过?数据水了吧

代码:

  1. #include <bits/stdc++.h>
  2.  
  3. int n, m;
  4.  
  5. std::vector<int> edges[10];
  6. bool no[10][10];
  7. int lk[10];
  8. bool vis[10];
  9.  
  10. bool DFS(int u) {
  11. for (auto v: edges[u]) {
  12. if (!vis[v]) {
  13. vis[v] = true;
  14. if (lk[v] == -1 || DFS (lk[v])) {
  15. lk[v] = u;
  16. return true;
  17. }
  18. }
  19. }
  20. return false;
  21. }
  22.  
  23. int hungary() {
  24. int ret = 0;
  25. memset (lk, -1, sizeof (lk));
  26. for (int i=1; i<=n; ++i) {
  27. memset (vis, false, sizeof (vis));
  28. if (DFS (i)) ret++;
  29. }
  30. return ret;
  31. }
  32.  
  33. int id[10];
  34.  
  35. int solve() {
  36. for (int i=1; i<=n; ++i) {
  37. id[i] = i;
  38. }
  39. int ret = 0;
  40. do {
  41. for (int i=1; i<=n; ++i) edges[i].clear ();
  42. for (int i=1; i<=n; ++i) {
  43. for (int j=1; j<=n; ++j) {
  44. if (!no[i][id[j]] && !no[i][id[(j+1>n?1:j+1)]]) {
  45. edges[i].push_back (j);
  46. }
  47. }
  48. }
  49. ret = std::max (ret, hungary ());
  50. } while (std::next_permutation (id+2, id+1+n)); //[2,n]全排列
  51. return ret;
  52. }
  53.  
  54. int main() {
  55. while (scanf ("%d%d", &n, &m) == 2) {
  56. if (n == 0) {
  57. puts ("0");
  58. continue;
  59. }
  60. memset (no, false, sizeof (no));
  61. for (int i=1; i<=m; ++i) {
  62. int x, y;
  63. scanf ("%d%d", &x, &y);
  64. no[x][y] = true;
  65. }
  66. printf ("%d\n", n - solve ());
  67. }
  68. return 0;
  69. }

数论 G PowMod(CYD)

2016多校训练一 PowMod,hdu5728(欧拉函数+指数循环节)

题意:

  求  时,ans= mod p,ans的值,其中n的每个素因子的幂次都是1,欧拉函数

思路:

解题分两部分完成,第一部分首先求出k,有公式

  (素数p是n的一个质因子)

由此可以递归求出k的值,f(n,m)=(p的欧拉值)*f(n/p,m)+f(n,m/p)。

第二部分的无限次幂,由公式

不断求欧拉值最终使值变得有限。

代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int M=1000000007;
  5. const int N=1e7+5;
  6. typedef long long ll;
  7.  
  8. int pri[N],phi[N],tot;
  9. bool vis[N];
  10. ll sum[N];
  11.  
  12. void init()
  13. {
  14. int n=N;
  15. tot=0;
  16. memset(vis,false,sizeof vis);
  17. phi[1]=1;
  18. for(int i=2;i<n;i++)
  19. {
  20. if(!vis[i])
  21. {
  22. pri[tot++]=i;
  23. phi[i]=i-1;
  24. }
  25. for(int j=0;j<tot && i*pri[j]<n;j++)
  26. {
  27. vis[i*pri[j]]=true;
  28. if(i%pri[j]==0)
  29. {
  30. phi[i*pri[j]]=phi[i]*pri[j];
  31. break;
  32. }
  33. else
  34. phi[i*pri[j]]=phi[i]*(pri[j]-1);
  35. }
  36. }
  37. sum[0]=0;
  38. for(int i=1;i<N;i++)
  39. sum[i]=(sum[i-1]+phi[i])%M;
  40. }
  41.  
  42. ll Pow(ll a,ll n,ll mod)
  43. {
  44. ll ans=1;
  45. while(n)
  46. {
  47. if(n&1)
  48. {
  49. ans=ans*a%mod;
  50. }
  51. a=a*a%mod;
  52. n>>=1;
  53. }
  54. if(ans==0)
  55. ans+=mod;
  56. return ans;
  57. }
  58. ll solve(ll k,ll mod)
  59. {
  60. if(mod==1)
  61. return mod;
  62. ll tmp=phi[mod];
  63. ll up=solve(k,tmp);
  64. ll ans=Pow(k,up,mod);
  65. return ans;
  66. }
  67.  
  68. int rear;
  69. int a[15];
  70.  
  71. void resolve(ll n)
  72. {
  73. for(int i=0;i<tot;i++)
  74. {
  75. if(!vis[n])
  76. {
  77. a[rear++]=n;
  78. break;
  79. }
  80. if(n%pri[i]==0)
  81. {
  82. a[rear++]=pri[i];
  83. n/=pri[i];
  84. }
  85. }
  86. }
  87.  
  88. ll f(int pos,ll n,ll m)
  89. {
  90. if(n==1)
  91. return sum[m];
  92. if(m==0)
  93. return 0;
  94. return ((a[pos]-1)*f(pos-1,n/a[pos],m)%M+f(pos,n,m/a[pos]))%M;
  95. }
  96.  
  97. int main()
  98. {
  99. init();
  100. ll n,m,p;
  101. while(scanf("%I64d%I64d%I64d",&n,&m,&p)!=EOF)
  102. {
  103. rear=0;
  104. resolve(n);
  105. ll k=f(rear-1,n,m);
  106. ll ans=solve(k,p);
  107. printf("%I64d\n",ans%p);
  108. }
  109. return 0;
  110. }

UPD:二分图连通图计数 不会 H Rigid Frameworks (BH)(51Nod原题)

题意:

  给n*m的格子,可以加上斜线,问有多少种方案使得整个格子不能倾斜,也就是不能像下图一样:

思路:

  网上写的不错的解题报告。问题的关键点是模型转换成二分图的连通计数,然后就是所有方案减去不符合的方案数。

代码:

  1. #include <bits/stdc++.h>
  2.  
  3. typedef long long ll;
  4. const int MOD = 1e9 + 7;
  5.  
  6. ll dp[15][15][105];
  7. ll pow_two[105];
  8. ll C[105][105];
  9.  
  10. ll f(int a, int b, int c) {
  11. if (a >= b) return dp[a][b][c];
  12. return dp[b][a][c];
  13. }
  14.  
  15. void init() {
  16. pow_two[0] = 1;
  17. for (int i=1; i<=100; ++i) pow_two[i] = pow_two[i-1] * 2 % MOD;
  18.  
  19. C[0][0] = 1;
  20. for (int i=1; i<=100; ++i) {
  21. C[i][0] = C[i][i] = 1;
  22. for (int j=1; j<i; ++j) {
  23. C[i][j] = (C[i-1][j-1] + C[i-1][j]) % MOD;
  24. }
  25. }

  26.   //dp[n][m][k]表示n行m列取k个斜线
  27. for (int i=1; i<=10; ++i) {
  28. dp[i][0][0] = i == 1 ? 1 : 0;
  29. for (int j=1; j<=i; ++j) {
  30. for (int k=1; k<=i*j; ++k) {
  31. dp[i][j][k] = C[i*j][k];
  32. for (int ii=1; ii<=i; ++ii) {
  33. for (int jj=0; jj<=j; ++jj) {
  34. int kb = std::min (k, ii * jj);
  35. for (int kk=0; kk<=kb; ++kk) {
  36. if (f (ii, jj, kk) && (i-ii)*(j-jj)>=k-kk) {
  37. if (i == ii && j == jj) break;
  38. dp[i][j][k] = (dp[i][j][k] - C[i-1][ii-1] * C[j][jj] * f (ii, jj, kk) * C[(i-ii)*(j-jj)][k-kk] + MOD) % MOD;
  39. }
  40. }
  41. }
  42. }
  43. }
  44. }
  45. }
  46. }
  47.  
  48. int main() {
  49. init ();
  50. int n, m;
  51. while (scanf ("%d%d", &n, &m) == 2) {
  52. if (n < m) std::swap (n, m);
  53. ll ans = 0;
  54. for (int i=1; i<=n*m; ++i) {
  55. ans = (ans + dp[n][m][i] * pow_two[i]) % MOD;
  56. }
  57. printf ("%I64d\n", ans);
  58. }
  59.  
  60. return 0;
  61. }

FFT 不会 I Shell Necklace
UPD2: 轮廓线DP+容斥原理 不会 I Solid Dominoes Tilings(BH)(51Nod原题)

题意:

  有n*m的格子用1*2的小格子填充,问全部填充且不能完整分割的方案数。

思路:

  轮廓线DP先求全部填充的方案数(训练指南P383),再用容斥原理减去完整分割的方案数。当时觉得容斥不好做,其实容斥只要依照“奇数减,偶数加”的原则算,这是关于列的主容斥,那么对于行就把全部不符合的都减去。

代码:

  1. #include <bits/stdc++.h>
  2.  
  3. typedef long long ll;
  4. const int MOD = 1e9 + 7;
  5. const int N = 16;
  6. int dp[2][1<<N];
  7. int f[N+1][N+1], g[N+1][N+1][1<<N], ans[N+1][N+1];
  8.  
  9. void add_mod(int &a, int b) {
  10. a += b;
  11. if (a >= MOD) a -= MOD;
  12. if (a < 0) a += MOD;
  13. }
  14.  
  15. void init() {
  16. for (int n=1; n<=N; ++n) {
  17. for (int m=1; m<=N; ++m) {
  18. //预处理n*m格子填满的方案数,轮廓线DP
  19. int cur = 1;
  20. memset (dp[cur], 0, sizeof (dp[cur]));
  21. int limit = 1 << m;
  22. dp[cur][limit-1] = 1;
  23. for (int i=0; i<n; ++i) {
  24. for (int j=0; j<m; ++j) {
  25. cur ^= 1;
  26. memset (dp[cur], 0, sizeof (dp[cur]));
  27. for (int s=0; s<limit; ++s) {
  28. if (dp[cur^1][s] == 0) continue;
  29. //s状态第j位是已填
  30. if (s & (1<<j)) {
  31. if (j && !(s&(1<<(j-1)))) {
  32. //往左放
  33. add_mod (dp[cur][s^(1<<(j-1))], dp[cur^1][s]);
  34. }
  35. //不放
  36. add_mod (dp[cur][s^(1<<j)], dp[cur^1][s]);
  37. } else {
  38. //往上放
  39. add_mod (dp[cur][s^(1<<j)], dp[cur^1][s]);
  40. }
  41. }
  42. }
  43. }
  44. //保存方案数
  45. f[n][m] = dp[cur][limit-1];
  46. }
  47. }
  48.  
  49. //容斥原理,乘法原理
  50. std::vector<int> lens;
  51. for (int n=1; n<=N; ++n) {
  52. for (int m=1; m<=N; ++m) {
           //主容斥列
  53. //竖线最多m-1条
  54. int limit = 1 << (m-1);
  55. for (int s=0; s<limit; ++s) {
  56. lens.clear ();
  57. int last = -1, num = 0;
  58. for (int i=0; i<m-1; ++i) {
  59. if (s & (1<<i)) {
  60. lens.push_back (i-last);
  61. last = i;
  62. num++;
  63. }
  64. }
  65. lens.push_back (m-1-last);
  66. int &now = g[n][m][s]; //f[n][len1]*f[n][len2]*...
  67. now = 1;
  68. for (int i=0; i<lens.size (); ++i) {
  69. int len = lens[i];
  70. now = (ll) now * f[n][len] % MOD;
  71. }
             //如果有横分割线,一定减去
  72. for (int i=1; i<n; ++i) {
  73. ll up = g[i][m][s];
  74. ll down = 1; //g[n-i][m][s]
  75. for (int j=0; j<lens.size (); ++j) {
  76. int len = lens[j];
  77. down = (ll) down * f[n-i][len] % MOD;
  78. }
  79. add_mod (now, -(ll) up * down % MOD);
  80. }
  81. if (num & 1) add_mod (ans[n][m], -now);
  82. else add_mod (ans[n][m], now);
  83. }
  84. }
  85. }
  86. }
  87.  
  88. int main() {
  89. init ();
  90. int n, m;
  91. while (scanf ("%d%d", &n, &m) == 2) {
  92. if (n < m) std::swap (n, m);
  93. printf ("%d\n", ans[n][m]);
  94. }
  95. return 0;
  96. }

树的同构判断 不会 J Subway

三维计算几何 K tetrahedron(BH,CYD)

题意:

  求四面体的内切圆的坐标和半径。

思路:

  求半径公式:,体积和三角形面积有函数可以算。

  求圆心坐标公式:,三个坐标系分开算就可以了。

代码:

  1. #include <bits/stdc++.h>
  2.  
  3. const double EPS = 1e-10;
  4.  
  5. int dcmp(double x) {
  6. return fabs (x) < EPS ? 0 : x < 0 ? -1 : 1;
  7. }
  8.  
  9. struct Point3 {
  10. double x, y, z;
  11. Point3(double x=0, double y=0, double z=0) : x(x), y(y), z(z) {}
  12. };
  13.  
  14. typedef Point3 Vector3;
  15.  
  16. Vector3 operator - (Point3 A, Point3 B) {
  17. return Vector3 (A.x-B.x, A.y-B.y, A.z-B.z);
  18. }
  19.  
  20. //叉积
  21. Vector3 Cross(Vector3 A, Vector3 B) {
  22. return Vector3 (A.y*B.z-A.z*B.y, A.z*B.x-A.x*B.z, A.x*B.y-A.y*B.x);
  23. }
  24.  
  25. double Dot(Vector3 A, Vector3 B) {
  26. return A.x*B.x+A.y*B.y+A.z*B.z;
  27. }
  28.  
  29. double Volume6(Point3 A, Point3 B, Point3 C, Point3 D) {
  30. return Dot (D-A, Cross (B-A, C-A));
  31. }
  32.  
  33. double Length(Vector3 A) {
  34. return sqrt (Dot (A, A));
  35. }
  36.  
  37. Point3 A, B, C, D;
  38.  
  39. void solve() {
  40. double v6 = Volume6 (A, B, C, D);
  41. Vector3 BC = C - B, BD = D - B, BA = A - B, CA = A - C, CD = D - C;
  42. Vector3 n = Cross (BC, BD);
  43. if (dcmp (Dot (BA, n)) == 0) {
  44. puts ("O O O O");
  45. return ;
  46. }
  47. v6 = fabs (v6);
  48. double SABC = Length (Cross (BA, BC)) * 0.5;
  49. double SBAD = Length (Cross (BA, BD)) * 0.5;
  50. double SBCD = Length (Cross (BC, BD)) * 0.5;
  51. double SCAD = Length (Cross (CD, CA)) * 0.5;
  52. double SS = SABC + SBAD + SBCD + SCAD;
  53. //V = SS * R * (1/3)
  54. double R = v6 / 2 / SS; //(1/3)
  55.  
  56. Point3 O;
  57. O.x = (A.x*SBCD + B.x*SCAD + C.x*SBAD + D.x*SABC) / SS;
  58. O.y = (A.y*SBCD + B.y*SCAD + C.y*SBAD + D.y*SABC) / SS;
  59. O.z = (A.z*SBCD + B.z*SCAD + C.z*SBAD + D.z*SABC) / SS;
  60.  
  61. printf ("%.4f %.4f %.4f %.4f\n", O.x, O.y, O.z, R);
  62. }
  63.  
  64. int main() {
  65. while (scanf ("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf", &A.x, &A.y, &A.z, &B.x, &B.y, &B.z, &C.x, &C.y, &C.z, &D.x, &D.y, &D.z) == 12) {
  66. solve ();
  67. }
  68. return 0;
  69. }

  

2016 Multi-University Training Contest 1的更多相关文章

  1. 2016 Al-Baath University Training Camp Contest-1

    2016 Al-Baath University Training Camp Contest-1 A题:http://codeforces.com/gym/101028/problem/A 题意:比赛 ...

  2. 2016 Al-Baath University Training Camp Contest-1 E

    Description ACM-SCPC-2017 is approaching every university is trying to do its best in order to be th ...

  3. 2016 Al-Baath University Training Camp Contest-1 A

    Description Tourist likes competitive programming and he has his own Codeforces account. He particip ...

  4. 2016 Al-Baath University Training Camp Contest-1 J

    Description X is fighting beasts in the forest, in order to have a better chance to survive he's gon ...

  5. 2016 Al-Baath University Training Camp Contest-1 I

    Description It is raining again! Youssef really forgot that there is a chance of rain in March, so h ...

  6. 2016 Al-Baath University Training Camp Contest-1 H

     Description You've possibly heard about 'The Endless River'. However, if not, we are introducing it ...

  7. 2016 Al-Baath University Training Camp Contest-1 G

    Description The forces of evil are about to disappear since our hero is now on top on the tower of e ...

  8. 2016 Al-Baath University Training Camp Contest-1 F

    Description Zaid has two words, a of length between 4 and 1000 and b of length 4 exactly. The word a ...

  9. 2016 Al-Baath University Training Camp Contest-1 D

    Description X is well known artist, no one knows the secrete behind the beautiful paintings of X exc ...

  10. 2016 Al-Baath University Training Camp Contest-1 C

    Description Rami went back from school and he had an easy homework about bitwise operations (and,or, ...

随机推荐

  1. PostgreSQL Apt Repository

    PostgreSQL Apt Repository If the version included in your version of Ubuntu is not the one you want, ...

  2. Echart的简单例子

    [转载自:http://echarts.baidu.com/echarts2/doc/start.html] <%@ page language="java" content ...

  3. cnblog中添加数学公式支持

    在博客中使用数学公式,是一件相对麻烦的事儿,大量的截图和插入图片不仅耗费极大的精力,而且影响写作体验. 虽然对于公式显示已经有多种解决办法,但大多数需要安装插件.而MathML这一雄心勃勃的网页数学语 ...

  4. centos 下测试网速

    wget https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py chmod a+rx speedtest. ...

  5. eclipse中 linked resource的使用

    一.关于linked resource   eclipse 中的linkded resources 是指存放在项目所在位置以外某个地方的文件或者文件夹:这些特定的资源必须有一个项目作为他们的父资源.l ...

  6. CSS高效开发实战:CSS 3、LESS、SASS、Bootstrap、Foundation --读书笔记(1)设定背景图

    技术的新发展,除计算机可以接入互联网之外,平板电脑.智能手机.智能电视等其他设备均可访问互联网.在多设备时代,构建多屏体验也不是听说的那么难. 但是这也增加了学习CSS的难度?不知道如何上手,只懂一点 ...

  7. 07OC之KVC、KVO

    在OC中,有着很多动态的特性,今天我们着重讲讲OC中的键值编码(KVC)和键值监听(KVO)特性. 一.键值编码(KVC) 在C#中,我们可以通过反射的方式动态去读写一个对象,有时候很方便,因为可以利 ...

  8. angularjs 笔记(1) -- 引导

    首先: 1,引入angularJS文件,<script type="text/javascript" src="angularjs.min.js"> ...

  9. delphi xe4 ini文件不能读取的解决方法

    今天发现用inifiles下 tinifile.readstring方法突然不能读数据了,结果把ini文件格式由utf-8改成unicode后就能正常读取了.

  10. C#创建socket服务

    1.新建windows服务,名称(WebSendMsgSocket,注意检查属性-版本号)  双击Service1.cs打开设计视图,在设计视图中右键,选择添加安装程序   安装serviceProc ...