A : Rescue The Princess

题意:

给你平面上的两个点A,B,求点C使得A,B,C逆时针成等边三角形。

思路:

http://www.cnblogs.com/E-star/archive/2013/06/11/3131563.html   向量的旋转。

直接套公式就行,或者我们可以找到等式解一个二元一次方程然后向量判断方向即可。我比较懒,就写了向量旋转的。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <vector>
  5. #include <cstring>
  6. #include <algorithm>
  7. #include <string>
  8. #include <set>
  9. #include <functional>
  10. #include <numeric>
  11. #include <sstream>
  12. #include <stack>
  13. #include <map>
  14. #include <queue>
  15.  
  16. #define CL(arr, val) memset(arr, val, sizeof(arr))
  17.  
  18. #define lc l,m,rt<<1
  19. #define rc m + 1,r,rt<<1|1
  20. #define pi acos(-1.0)
  21. #define ll __int64
  22. #define L(x) (x) << 1
  23. #define R(x) (x) << 1 | 1
  24. #define MID(l, r) (l + r) >> 1
  25. #define Min(x, y) (x) < (y) ? (x) : (y)
  26. #define Max(x, y) (x) < (y) ? (y) : (x)
  27. #define E(x) (1 << (x))
  28. #define iabs(x) (x) < 0 ? -(x) : (x)
  29. #define OUT(x) printf("%I64d\n", x)
  30. #define lowbit(x) (x)&(-x)
  31. #define Read() freopen("din.txt", "r", stdin)
  32. #define Write() freopen("dout.txt", "w", stdout);
  33.  
  34. #define M 137
  35. #define N 22
  36.  
  37. using namespace std;
  38.  
  39. const int inf = 0x7f7f7f7f;
  40. const int mod = ;
  41.  
  42. double xx1,yy1,xx2,yy2;
  43.  
  44. int main()
  45. {
  46. // Read();
  47. int T;
  48. scanf("%d",&T);
  49. while (T--)
  50. {
  51. scanf("%lf%lf%lf%lf",&xx1,&yy1,&xx2,&yy2);
  52. // printf("%.3lf %.3lf %.3lf %.3lf\n",xx1,yy1,xx2,yy2);
  53. double tx = xx2 - xx1;
  54. double ty = yy2 - yy1;
  55.  
  56. double x = tx*(1.0/2.0) - ty*(sqrt(3.0)/2.0) + xx1;
  57. double y = ty*(1.0/2.0) + tx*(sqrt(3.0)/2.0) + yy1;
  58. printf("(%.2lf,%.2lf)\n",x,y);
  59. }
  60. return ;
  61. }

B: Thrall’s Dream

题意:

给定n个点,m条有向边,求解任意两点是否可达。

思路:

比赛时直接枚举每一个点,然后bfs判断就行,时间复杂度为O(n +m) , 这题tarjan缩点然后判断是否为链就行O(n + m)

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <vector>
  5. #include <cstring>
  6. #include <algorithm>
  7. #include <string>
  8. #include <set>
  9. #include <functional>
  10. #include <numeric>
  11. #include <sstream>
  12. #include <stack>
  13. #include <map>
  14. #include <queue>
  15.  
  16. #define CL(arr, val) memset(arr, val, sizeof(arr))
  17.  
  18. #define lc l,m,rt<<1
  19. #define rc m + 1,r,rt<<1|1
  20. #define pi acos(-1.0)
  21. #define ll __int64
  22. #define L(x) (x) << 1
  23. #define R(x) (x) << 1 | 1
  24. #define MID(l, r) (l + r) >> 1
  25. #define Min(x, y) (x) < (y) ? (x) : (y)
  26. #define Max(x, y) (x) < (y) ? (y) : (x)
  27. #define E(x) (1 << (x))
  28. #define iabs(x) (x) < 0 ? -(x) : (x)
  29. #define OUT(x) printf("%I64d\n", x)
  30. #define lowbit(x) (x)&(-x)
  31. #define Read() freopen("din.txt", "r", stdin)
  32. #define Write() freopen("dout.txt", "w", stdout);
  33.  
  34. #define M 10007
  35. #define N 2007
  36.  
  37. using namespace std;
  38.  
  39. const int inf = 0x7f7f7f7f;
  40. const int mod = ;
  41.  
  42. struct node
  43. {
  44. int v;
  45. int next;
  46. }g[M];
  47. int head[N],ct;
  48. bool ok[N][N];
  49. bool vt[N];
  50. int n,m;
  51.  
  52. void add(int u,int v)
  53. {
  54. g[ct].v = v;
  55. g[ct].next = head[u];
  56. head[u] = ct++;
  57. }
  58. void bfs(int s)
  59. {
  60. int i;
  61. for (i = ; i <= n; ++i) vt[i] = false;
  62. vt[s] = true;
  63. queue<int> Q;
  64. Q.push(s);
  65. while (!Q.empty())
  66. {
  67. int u = Q.front(); Q.pop();
  68. for (i = head[u]; i != -; i = g[i].next)
  69. {
  70. int v = g[i].v;
  71. if (!vt[v])
  72. {
  73. vt[v] = true;
  74. ok[s][v] = true;
  75. Q.push(v);
  76. }
  77. }
  78. }
  79. }
  80. int main()
  81. {
  82. // Read();
  83. int T;
  84. int i,j;
  85. scanf("%d",&T);
  86. int cas = ;
  87. while (T--)
  88. {
  89. scanf("%d%d",&n,&m);
  90. CL(head,-); ct = ;
  91. int x,y;
  92. for (i = ; i < m; ++i)
  93. {
  94. scanf("%d%d",&x,&y);
  95. add(x,y);
  96. }
  97. CL(ok,false);
  98. for (i = ; i <= n; ++i) ok[i][i] = true;
  99. for (i = ; i <= n; ++i) bfs(i);
  100.  
  101. bool flag = false;
  102. for (i = ; i <= n && !flag; ++i)
  103. {
  104. for (j = ; j <= n && !flag; ++j)
  105. {
  106. if (ok[i][j] || ok[j][i]) continue;
  107. else
  108. {
  109. flag = true;
  110. break;
  111. }
  112. }
  113. }
  114. if (!flag) printf("Case %d: Kalimdor is just ahead\n",cas++);
  115. else printf("Case %d: The Burning Shadow consume us all\n",cas++);
  116. }
  117. return ;
  118. }

C: A^X mod P

题意:

题意很简单,看题就知道。

思路:

在求A^X 幂时,快速幂求的话,是O(10^6*log(n)*40) = O(10^9) 肯定会超时,

我们将X转化成 x = i*k + j。这样先在数组可以表示的范围内找到一个k,然后保存A^(1---k)的值,然后再将求出(A^k)^i 保存在数组里,这样每次求A^x,便可以通过这两个数组在O(1)的时间复杂度内求出来,这样时间复杂度就变成了O(10^6*40) = O(4*10^7)了

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <vector>
  5. #include <cstring>
  6. #include <algorithm>
  7. #include <string>
  8. #include <set>
  9. #include <functional>
  10. #include <numeric>
  11. #include <sstream>
  12. #include <stack>
  13. #include <map>
  14. #include <queue>
  15.  
  16. #define CL(arr, val) memset(arr, val, sizeof(arr))
  17.  
  18. #define lc l,m,rt<<1
  19. #define rc m + 1,r,rt<<1|1
  20. #define pi acos(-1.0)
  21. #define ll long long
  22. #define L(x) (x) << 1
  23. #define R(x) (x) << 1 | 1
  24. #define MID(l, r) (l + r) >> 1
  25. #define Min(x, y) (x) < (y) ? (x) : (y)
  26. #define Max(x, y) (x) < (y) ? (y) : (x)
  27. #define E(x) (1 << (x))
  28. #define iabs(x) (x) < 0 ? -(x) : (x)
  29. #define OUT(x) printf("%I64d\n", x)
  30. #define lowbit(x) (x)&(-x)
  31. #define Read() freopen("din.txt", "r", stdin)
  32. #define Write() freopen("dout.txt", "w", stdout);
  33.  
  34. #define M 33333
  35. #define N 31622
  36. using namespace std;
  37. const int mod = ;
  38.  
  39. ll powB[M + ];
  40. ll powA[N + ];
  41.  
  42. ll n, A, K, a, b, m, P;
  43.  
  44. void init()
  45. {
  46. powA[] = ;
  47. for (int i = ; i <= N; ++i)
  48. {
  49. powA[i] = powA[i - ]*A%P;
  50. }
  51. ll tmp = powA[N];
  52. powB[] = ;
  53. for (int i = ; i <= M; ++i)
  54. {
  55. powB[i] = powB[i - ]*tmp%P;
  56. }
  57. }
  58. void solve(int cas)
  59. {
  60. ll fx = K;
  61. ll ans = ;
  62. for (int i = ; i <= n; ++i)
  63. {
  64. ans = (ans + powB[fx/N]*powA[fx%N]%P)%P;
  65. fx = (a*fx + b)%m;
  66. }
  67. printf("Case #%d: %lld\n",cas++,ans);
  68. }
  69. int main()
  70. {
  71. int T;
  72. int cas = ;
  73. scanf("%d",&T);
  74.  
  75. while (T--)
  76. {
  77. cin>>n>>A>>K>>a>>b>>m>>P;
  78. init();
  79. solve(cas++);
  80. }
  81. return ;
  82. }

D: Rubik’s cube

好像是个模拟题,还没写

E: Mountain Subsequences

题意:

给你一个长度为m的字符串仅由小写英文字母组成,求满足a1 < ...< ai < ai+1 < Amax > aj > aj+1 > ... > an的子串的个数

思路:
首先它仅包含26个英文字母,我们只要枚举每一个位置,然后记录每个位置左边满足条件的个数,右边满足条件的个数,最后乘起来就是了,那么我们怎么记录左边,右边满足的个数的呢?

dp[c]表示以字符c结尾的满足情况的个数,dl[i]表示第i个位置左边满足条件的个数,dr[i]表示第i个位置右边满足条件的个数,

dp[c] = (dl[i] + 1);  s[i] = c; 1表示的s[i]单独一个时满足的情况,dl[i]表示他左边的满足的各种情况+s[i] 后满足情况的。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <vector>
  5. #include <cstring>
  6. #include <algorithm>
  7. #include <string>
  8. #include <set>
  9. #include <functional>
  10. #include <numeric>
  11. #include <sstream>
  12. #include <stack>
  13. #include <map>
  14. #include <queue>
  15.  
  16. #define CL(arr, val) memset(arr, val, sizeof(arr))
  17.  
  18. #define lc l,m,rt<<1
  19. #define rc m + 1,r,rt<<1|1
  20. #define pi acos(-1.0)
  21. #define ll long long
  22. #define L(x) (x) << 1
  23. #define R(x) (x) << 1 | 1
  24. #define MID(l, r) (l + r) >> 1
  25. #define Min(x, y) (x) < (y) ? (x) : (y)
  26. #define Max(x, y) (x) < (y) ? (y) : (x)
  27. #define E(x) (1 << (x))
  28. #define iabs(x) (x) < 0 ? -(x) : (x)
  29. #define OUT(x) printf("%I64d\n", x)
  30. #define lowbit(x) (x)&(-x)
  31. #define Read() freopen("data.in", "r", stdin)
  32. #define Write() freopen("d.out", "w", stdout)
  33.  
  34. #define M 100007
  35. #define N 100007
  36.  
  37. using namespace std;
  38.  
  39. const int inf = 0x7f7f7f7f;
  40. const int mod = ;
  41. int dp[],dl[N],dr[N];
  42. int n;
  43. char ts[N];
  44. int s[N];
  45.  
  46. int main()
  47. {
  48. // Read();
  49. int i,j;
  50. while (~scanf("%d",&n))
  51. {
  52. scanf("%s",ts);
  53. for (i = ; i < n; ++i) s[i] = ts[i] - 'a';
  54.  
  55. CL(dp,); CL(dl,); CL(dr,);
  56.  
  57. for (i = ; i < n; ++i)
  58. {
  59. for (j = ; j < s[i]; ++j) dl[i] += dp[j];
  60.  
  61. dl[i] %= ;
  62. dp[s[i]] += (dl[i] + );
  63. dp[s[i]] %= ;
  64. }
  65.  
  66. CL(dp,);
  67. for (i = n - ; i >= ; --i)
  68. {
  69. for (j = ; j < s[i]; ++j) dr[i] += dp[j];
  70.  
  71. dr[i] %= ;
  72. dp[s[i]] += (dr[i] + );
  73. dp[s[i]] %= ;
  74. }
  75. int ans = ;
  76. for (i = ; i < n; ++i)
  77. {
  78. ans += dl[i]*dr[i];
  79. ans %= ;
  80. }
  81. printf("%d\n",ans);
  82. }
  83. return ;
  84. }

F: Alice and Bob

题意:

给出一个多项式:(a0*x^(2^0)+1) * (a1 * x^(2^1)+1)*.......*(an-1 * x^(2^(n-1))+1)

输入P,求X^p 前边的系数。

思路:

首先P肯定是一个二进制表示的数,并且唯一。我们只要将p转化成二进制数,然后乘上系数就好了。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <vector>
  5. #include <cstring>
  6. #include <algorithm>
  7. #include <string>
  8. #include <set>
  9. #include <functional>
  10. #include <numeric>
  11. #include <sstream>
  12. #include <stack>
  13. #include <map>
  14. #include <queue>
  15.  
  16. #define CL(arr, val) memset(arr, val, sizeof(arr))
  17.  
  18. #define lc l,m,rt<<1
  19. #define rc m + 1,r,rt<<1|1
  20. #define pi acos(-1.0)
  21. #define ll long long
  22. #define L(x) (x) << 1
  23. #define R(x) (x) << 1 | 1
  24. #define MID(l, r) (l + r) >> 1
  25. #define Min(x, y) (x) < (y) ? (x) : (y)
  26. #define Max(x, y) (x) < (y) ? (y) : (x)
  27. #define E(x) (1 << (x))
  28. #define iabs(x) (x) < 0 ? -(x) : (x)
  29. #define OUT(x) printf("%I64d\n", x)
  30. #define lowbit(x) (x)&(-x)
  31. #define Read() freopen("din.txt", "r", stdin)
  32. #define Write() freopen("dout.txt", "w", stdout);
  33.  
  34. #define M 137
  35. #define N 55
  36.  
  37. using namespace std;
  38.  
  39. const int inf = 0x7f7f7f7f;
  40. const int mod = ;
  41.  
  42. int a[N],b[];
  43.  
  44. int main()
  45. {
  46. int T,i;
  47. int n,m;
  48. scanf("%d",&T);
  49. while (T--)
  50. {
  51. scanf("%d",&n);
  52. CL(a,);
  53. for (i = ; i < n; ++i) scanf("%d",&a[i]);
  54.  
  55. scanf("%d",&m);
  56. int top;
  57. ll p;
  58. while (m--)
  59. {
  60. cin>>p; top = ;
  61. if (p == )
  62. {
  63. printf("1\n");
  64. continue;
  65. }
  66. while (p)
  67. {
  68. b[top++] = p%;
  69. p /= ;
  70. }
  71. int ans = ;
  72. for (i = ; i < top; ++i)
  73. {
  74. if (b[i]) ans = ans*a[i]%;
  75. }
  76.  
  77. printf("%d\n",ans);
  78. }
  79. }
  80. return ;
  81. }

G: A-Number and B-Number

题意:
给出Anum的定义,包含7或者能被7整除的数,

然后给出Bnum的定义,a[i] = Anum 表示i不是Anum

输入n输出第n个Bnum

思路:

二分 + 数位DP

首先我们二分一个数mid,找到<=mid的mid最小的区间满足等于n个Bnum的数,那么这个数肯定是Bnum。

关键是如何求区间内Bnum的数量,我们转化为先求一下Anum的数量,然后对Anum数量这个区间再求Anum数量就得到了这个区间Bnum的数量了。在求Anum数量时就用到了数位DP

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <vector>
  5. #include <cstring>
  6. #include <algorithm>
  7. #include <string>
  8. #include <set>
  9. #include <functional>
  10. #include <numeric>
  11. #include <sstream>
  12. #include <stack>
  13. #include <map>
  14. #include <queue>
  15.  
  16. #define CL(arr, val) memset(arr, val, sizeof(arr))
  17.  
  18. #define lc l,m,rt<<1
  19. #define rc m + 1,r,rt<<1|1
  20. #define pi acos(-1.0)
  21. #define L(x) (x) << 1
  22. #define R(x) (x) << 1 | 1
  23. #define MID(l, r) (l + r) >> 1
  24. #define Min(x, y) (x) < (y) ? (x) : (y)
  25. #define Max(x, y) (x) < (y) ? (y) : (x)
  26. #define E(x) (1 << (x))
  27. #define iabs(x) (x) < 0 ? -(x) : (x)
  28. #define OUT(x) printf("%I64d\n", x)
  29. #define lowbit(x) (x)&(-x)
  30. #define Read() freopen("data.in", "r", stdin)
  31. #define Write() freopen("d.out", "w", stdout)
  32. #define ll unsigned long long
  33.  
  34. #define M 100007
  35. #define N 100007
  36.  
  37. using namespace std;
  38.  
  39. const int inf = 0x7f7f7f7f;
  40. const int mod = ;
  41.  
  42. const ll R = ((1uLL<<) - );
  43.  
  44. ll dp[][][];
  45. int bit[];
  46. ll n;
  47.  
  48. ll dfs(int len,int pre,int flag,int limit)
  49. {
  50. if (len == -) return flag||pre == ;
  51. if (!limit && dp[len][pre][flag] != -1uLL) return dp[len][pre][flag];
  52.  
  53. int up = limit?bit[len]:;
  54. ll ans = ;
  55. for (int i = ; i <= up; ++i)
  56. {
  57. int tpre = (pre* + i)%;
  58. int tflag = (flag || i == );
  59. int tlimit = (limit && i == up);
  60. ans += dfs(len - ,tpre,tflag,tlimit);
  61. }
  62. if (!limit) dp[len][pre][flag] = ans;
  63. return ans;
  64. }
  65. ll getR(ll m)
  66. {
  67. int len = ;
  68. while (m)
  69. {
  70. bit[len++] = m%;
  71. m /= ;
  72. }
  73. return dfs(len - ,,,) - ;
  74. }
  75. ll solve(ll m)
  76. {
  77. ll cnt1 = getR(m);
  78. ll cnt2 = cnt1 - getR(cnt1);
  79. return cnt2;
  80. }
  81. int main()
  82. {
  83. // Read();
  84. while (~scanf("%lld",&n))
  85. {
  86. CL(dp,-);
  87. ll l = ,r = R;
  88. ll ans = ;
  89. while (l <= r)
  90. {
  91. ll mid = (l + r)>>;
  92. if (solve(mid) < n) l = mid + ;
  93. else
  94. {
  95. ans = mid;
  96. r = mid - ;
  97. }
  98. }
  99. printf("%lld\n",ans);
  100. }
  101. return ;
  102. }

H: Boring Counting

题意:

给你n个数,m个询问(N and M (1 <= N, M <= 50000)),询问包含四个数L,R,A,B 求区间[L,R]里面在区间[A,B]的数的个数。

思路:

首先想到的是二维树状数组,或者二维线段树处理,因为数据量太大。但是二维这个维数也不能表示,因为离散化之后50000*50000是不能表示的,那怎么办呢?

划分树,我们只要二分枚举该区间的最小的第几大大于等于A,以及最小的大于B的第几大,然后他们的差值就区间满足条件的个数。时间复杂度为O(nlog(n)*log(n));

这里求区间第几大用到了划分树。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <vector>
  5. #include <cstring>
  6. #include <algorithm>
  7. #include <string>
  8. #include <set>
  9. #include <functional>
  10. #include <numeric>
  11. #include <sstream>
  12. #include <stack>
  13. #include <map>
  14. #include <queue>
  15.  
  16. #define CL(arr, val) memset(arr, val, sizeof(arr))
  17.  
  18. #define lc l,m,rt<<1
  19. #define rc m + 1,r,rt<<1|1
  20. #define pi acos(-1.0)
  21. #define ll __int64
  22. #define L(x) (x) << 1
  23. #define R(x) (x) << 1 | 1
  24. #define MID(l, r) (l + r) >> 1
  25. #define Min(x, y) (x) < (y) ? (x) : (y)
  26. #define Max(x, y) (x) < (y) ? (y) : (x)
  27. #define E(x) (1 << (x))
  28. #define iabs(x) (x) < 0 ? -(x) : (x)
  29. #define OUT(x) printf("%I64d\n", x)
  30. #define Read() freopen("din.txt", "r", stdin)
  31. #define Write() freopen("dout.in", "w", stdout);
  32.  
  33. #define M 50007
  34. #define N 50007
  35.  
  36. using namespace std;
  37.  
  38. const int inf = 0x7f7f7f7f;
  39.  
  40. struct node{
  41. int l,r;
  42. int mid(){
  43. return (l + r)>>;
  44. }
  45. }tt[N<<];
  46. int toLeft[][N];
  47. int val[][N],sorted[N];
  48. int n,q,m;
  49.  
  50. void build(int l,int r,int rt,int d){
  51. int i;
  52. tt[rt].l = l;
  53. tt[rt].r = r;
  54. if (l == r) return ;
  55. int m = tt[rt].mid();
  56. int lsame = m - l + ;
  57.  
  58. for (i = l; i <= r; ++i){
  59. if (val[d][i] < sorted[m]) lsame--;
  60. }
  61.  
  62. int lpos = l;
  63. int rpos = m + ;
  64. int same = ;
  65.  
  66. for (i = l; i <= r; ++i){
  67. if (i == l) toLeft[d][i] = ;
  68. else toLeft[d][i] = toLeft[d][i - ];
  69.  
  70. if (val[d][i] < sorted[m]){
  71. toLeft[d][i]++;
  72. val[d + ][lpos++] = val[d][i];
  73. }
  74. else if (val[d][i] > sorted[m]){
  75. val[d + ][rpos++] = val[d][i];
  76. }
  77. else{
  78. if (same < lsame){
  79. toLeft[d][i]++;
  80. val[d + ][lpos++] = val[d][i];
  81. same++;
  82. }
  83. else{
  84. val[d + ][rpos++] = val[d][i];
  85. }
  86. }
  87. }
  88. build(lc,d + );
  89. build(rc,d + );
  90. }
  91.  
  92. int query(int L,int R,int k,int d,int rt){
  93. if (L == R){
  94. return val[d][L];
  95. }
  96. int s = ;
  97. int ss = ;
  98. if (L == tt[rt].l){
  99. ss = ;
  100. s = toLeft[d][R];
  101. }
  102. else{
  103. ss = toLeft[d][L - ];
  104. s = toLeft[d][R] - toLeft[d][L - ];
  105. }
  106. if (k <= s){
  107. int newl = tt[rt].l + ss;
  108. int newr = newl + s - ;
  109. return query(newl,newr,k,d + ,rt<<);
  110. }
  111. else{
  112. int m = tt[rt].mid();
  113. int bb = L - tt[rt].l - ss;
  114. int b = R - L + - s;
  115. int newl = m + bb + ;
  116. int newr = newl + b - ;
  117. return query(newl,newr,k - s,d + ,rt<<|);
  118. }
  119. }
  120. int BS1(int L,int R,int l,int r,int A)
  121. {
  122. int ans = -;
  123. while (l <= r)
  124. {
  125. int mid = (l + r)>>;
  126. int res = query(L,R,mid,,);
  127. if (res >= A)
  128. {
  129. ans = mid;
  130. r = mid - ;
  131. }
  132. else l = mid + ;
  133. }
  134. return ans;
  135. }
  136. int BS2(int L,int R,int l,int r,int B)
  137. {
  138. int ans = ;
  139. while (l <= r)
  140. {
  141. int mid = (l + r)>>;
  142. int res = query(L,R,mid,,);
  143. if (res > B)
  144. {
  145. ans = mid;
  146. r = mid - ;
  147. }
  148. else l = mid + ;
  149. }
  150. if (ans == ) return r;
  151. else return ans - ;
  152. }
  153. int main()
  154. {
  155. // Read();
  156.  
  157. int T,i;
  158. int cas = ;
  159. scanf("%d",&T);
  160. while (T--)
  161. {
  162. scanf("%d%d",&n,&m);
  163. for (i = ; i <= n; ++i)
  164. {
  165. scanf("%d",&val[][i]);
  166. sorted[i] = val[][i];
  167. }
  168. sort(sorted + ,sorted + + n);
  169. build(,n,,);
  170.  
  171. printf("Case #%d:\n",cas++);
  172. int x,y,A,B;
  173. while (m--)
  174. {
  175. scanf("%d%d%d%d",&x,&y,&A,&B);
  176.  
  177. int l = ;
  178. int r = y - x + ;
  179. int cnt1 = BS1(x,y,l,r,A);
  180. int cnt2 = BS2(x,y,l,r,B);
  181. // printf(">>>>%d %d %d %d %d %d\n",x,y,A,B,cnt1,cnt2);
  182. if (cnt1 == -)
  183. {
  184. printf("0\n");
  185. continue;
  186. }
  187. printf("%d\n",cnt2 - cnt1 + );
  188. }
  189. }
  190. return ;
  191. }

有没有更优的解法,当然有。  我们回到二维树状数组,如果我们求一个矩阵内的和的话,需要知道四个点到源点的的和,然后根据简单的容斥弄出来。这里我们将每个询问离线处理,转化成四个点,然后将点按x轴(表示[l,R])排序,y轴呢则表示[A,B]这样没当插入一点的时候我们就将小于x的所有的给定序列的值查到纵轴所标的区间内,纵轴用一个一维的树状数组即可,然后每当遇到四个点中的所要求的点的时候,计算就行,因为这样保证了纵轴上的点肯定是在[L,R]范围内的,然后我们在根据[A,B]来求一维的值即可。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <vector>
  5. #include <cstring>
  6. #include <algorithm>
  7. #include <string>
  8. #include <set>
  9. #include <functional>
  10. #include <numeric>
  11. #include <sstream>
  12. #include <stack>
  13. #include <map>
  14. #include <queue>
  15.  
  16. #define CL(arr, val) memset(arr, val, sizeof(arr))
  17.  
  18. #define lc l,m,rt<<1
  19. #define rc m + 1,r,rt<<1|1
  20. #define pi acos(-1.0)
  21. #define ll __int64
  22. #define L(x) (x) << 1
  23. #define R(x) (x) << 1 | 1
  24. #define MID(l, r) (l + r) >> 1
  25. #define Min(x, y) (x) < (y) ? (x) : (y)
  26. #define Max(x, y) (x) < (y) ? (y) : (x)
  27. #define E(x) (1 << (x))
  28. #define iabs(x) (x) < 0 ? -(x) : (x)
  29. #define OUT(x) printf("%I64d\n", x)
  30. #define Read() freopen("din.txt", "r", stdin)
  31. #define Write() freopen("dout.in", "w", stdout);
  32.  
  33. #define M 50007
  34. #define N 50007
  35.  
  36. using namespace std;
  37.  
  38. const int inf = 0x7f7f7f7f;
  39.  
  40. struct point
  41. {
  42. int x,y;
  43. int id;
  44. int no;
  45. }pt[*N];
  46. int SM[*N];
  47.  
  48. int n,m;
  49. int c[*N],a[N],b[*N];
  50. int of[N*][];
  51. int ans[N];
  52.  
  53. int nn;
  54.  
  55. int lowbit(int x)
  56. {
  57. return (x&(-x));
  58. }
  59. void modify(int pos,int val)
  60. {
  61. while (pos <= nn)
  62. {
  63. c[pos] += val;
  64. pos += lowbit(pos);
  65. }
  66. }
  67. int getsum(int pos)
  68. {
  69. int sum = ;
  70. while (pos > )
  71. {
  72. sum += c[pos];
  73. pos -= lowbit(pos);
  74. }
  75. return sum;
  76. }
  77. int BS(int l,int r,int val)
  78. {
  79. while (l <= r)
  80. {
  81. int mid = (l + r)/;
  82. if (b[mid] == val) return mid;
  83. else if (b[mid] < val) l = mid + ;
  84. else r = mid - ;
  85. }
  86. return -;
  87. }
  88. int cmp(int x,int y)
  89. {
  90. return x < y;
  91. }
  92. int cmpPt(point a,point b)
  93. {
  94. if (a.x != b.x) return a.x < b.x;
  95. else return a.y < b.y;
  96. }
  97. int main()
  98. {
  99. // Read();
  100. // Write();
  101. int T,i;
  102. int cas = ;
  103. scanf("%d",&T);
  104. while (T--)
  105. {
  106. scanf("%d%d",&n,&m);
  107. int k = ;
  108. for (i = ; i <= n; ++i)
  109. {
  110. scanf("%d",&a[i]);
  111. b[++k] = a[i];
  112. }
  113.  
  114. int pl = ;
  115. int x1,y1,x2,y2;
  116. for (i = ; i <= m; ++i)
  117. {
  118. scanf("%d%d%d%d",&x1,&x2,&y1,&y2);
  119. b[++k] = y1 - ; b[++k] = y2;
  120.  
  121. pt[pl].x = x1 - , pt[pl].y = y1 - ;
  122. pt[pl].id = i,pt[pl++].no = ;
  123.  
  124. pt[pl].x = x1 - , pt[pl].y = y2;
  125. pt[pl].id = i,pt[pl++].no = ;
  126.  
  127. pt[pl].x = x2, pt[pl].y = y1 - ;
  128. pt[pl].id = i,pt[pl++].no = ;
  129.  
  130. pt[pl].x = x2, pt[pl].y = y2;
  131. pt[pl].id = i,pt[pl++].no = ;
  132. }
  133.  
  134. sort(b + ,b + + k,cmp); nn = ;
  135. for (i = ; i <= k; ++i) if (b[i] != b[i - ]) b[++nn] = b[i];
  136.  
  137. sort(pt,pt + pl,cmpPt);
  138. for (i = ; i < pl; ++i) of[pt[i].id][pt[i].no] = i;
  139.  
  140. CL(c,); CL(ans,);
  141. int s = ;
  142. for (i = ; i < pl; ++i)
  143. {
  144. int x = pt[i].x;
  145. int y = pt[i].y;
  146. for (; s <= x; ++s)
  147. {
  148. int pos = BS(,nn,a[s]);
  149. modify(pos,);
  150. }
  151. int p = BS(,nn,y);
  152. SM[i] = getsum(p);
  153. if (pt[i].no == )
  154. {
  155. int id = pt[i].id;
  156. ans[id] = SM[i] - SM[of[id][]] - SM[of[id][]] + SM[of[id][]];
  157. }
  158. }
  159. printf("Case #%d:\n",cas++);
  160. for (i = ; i <= m; ++i) printf("%d\n",ans[i]);
  161. }
  162. return ;
  163. }

I:The number of steps

题意:

迷宫是由一个如下的图形组成

1

2 3

4 5 6

7 8 9 10

...

起始点在1,规定只能望左,左下,右下走,如果不存在左边的点的话,那么往左下,右下的概率为a,b,如果三个点都存在的话,那么往左,左下,右下的概率分别为e,c,d, 如果仅存在左边的点的话,那么走左边点的概率为1

求到达最底层的左下角的点的所用步数的概率。

思路:

很简单的一个概率DP的题目,和置筛子的题目类似。 一定要明白为什么倒着推

学习链接:http://kicd.blog.163.com/blog/static/126961911200910168335852/

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <vector>
  5. #include <cstring>
  6. #include <algorithm>
  7. #include <string>
  8. #include <set>
  9. #include <functional>
  10. #include <numeric>
  11. #include <sstream>
  12. #include <stack>
  13. #include <map>
  14. #include <queue>
  15.  
  16. #define CL(arr, val) memset(arr, val, sizeof(arr))
  17.  
  18. #define lc l,m,rt<<1
  19. #define rc m + 1,r,rt<<1|1
  20. #define pi acos(-1.0)
  21. #define ll long long
  22. #define L(x) (x) << 1
  23. #define R(x) (x) << 1 | 1
  24. #define MID(l, r) (l + r) >> 1
  25. #define Min(x, y) (x) < (y) ? (x) : (y)
  26. #define Max(x, y) (x) < (y) ? (y) : (x)
  27. #define E(x) (1 << (x))
  28. #define iabs(x) (x) < 0 ? -(x) : (x)
  29. #define OUT(x) printf("%I64d\n", x)
  30. #define lowbit(x) (x)&(-x)
  31. #define Read() freopen("data.in", "r", stdin)
  32. #define Write() freopen("d.out", "w", stdout)
  33.  
  34. #define M 100007
  35. #define N 57
  36.  
  37. using namespace std;
  38.  
  39. const int inf = 0x7f7f7f7f;
  40. const int mod = ;
  41.  
  42. double dp[N][N];
  43. double a, b, c, d, e;
  44.  
  45. int main()
  46. {
  47. // Read();
  48. int n;
  49. while (~scanf("%d",&n))
  50. {
  51. if (!n) break;
  52. cin>>a>>b>>c>>d>>e;
  53. CL(dp,);
  54. dp[n][] = ;
  55. for (int i = ; i <= n - ; ++i)
  56. {
  57. dp[n][i + ] += (dp[n][i] + );
  58. }
  59.  
  60. for (int i = n - ; i >= ; --i)
  61. {
  62. dp[i][] += (dp[i + ][] + )*a + (dp[i + ][] + )*b;
  63. for (int j = ; j <= i; ++j)
  64. {
  65. dp[i][j] += (dp[i + ][j] + )*c + (dp[i + ][j + ] + )*d + (dp[i][j - ] + )*e;
  66. }
  67. }
  68.  
  69. printf("%.2lf\n",dp[][]);
  70. }
  71. return ;
  72. }

J:Contest Print Server

坑爹的大水题,什么也不说了。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <vector>
  5. #include <cstring>
  6. #include <algorithm>
  7. #include <string>
  8. #include <set>
  9. #include <functional>
  10. #include <numeric>
  11. #include <sstream>
  12. #include <stack>
  13. #include <map>
  14. #include <queue>
  15.  
  16. #define CL(arr, val) memset(arr, val, sizeof(arr))
  17.  
  18. #define lc l,m,rt<<1
  19. #define rc m + 1,r,rt<<1|1
  20. #define pi acos(-1.0)
  21. #define ll __int64
  22. #define L(x) (x) << 1
  23. #define R(x) (x) << 1 | 1
  24. #define MID(l, r) (l + r) >> 1
  25. #define Min(x, y) (x) < (y) ? (x) : (y)
  26. #define Max(x, y) (x) < (y) ? (y) : (x)
  27. #define E(x) (1 << (x))
  28. #define iabs(x) (x) < 0 ? -(x) : (x)
  29. #define OUT(x) printf("%I64d\n", x)
  30. #define lowbit(x) (x)&(-x)
  31. #define Read() freopen("din.txt", "r", stdin)
  32. #define Write() freopen("dout.txt", "w", stdout);
  33.  
  34. #define M 10007
  35. #define N 107
  36.  
  37. using namespace std;
  38.  
  39. const int inf = 0x7f7f7f7f;
  40.  
  41. struct node
  42. {
  43. string name;
  44. int pa;
  45. }nd[N],ans;
  46. int n,s,x,y,mod;
  47. string name,num,tmp;
  48.  
  49. int ToNo(string st)
  50. {
  51. int no = ;
  52. for (int i = ; i < st.size(); ++i)
  53. {
  54. no = no* + st[i] - '';
  55. }
  56. return no;
  57. }
  58. int main()
  59. {
  60. // Read();
  61. int T;
  62. scanf("%d",&T);
  63. while (T--)
  64. {
  65. scanf("%d%d%d%d%d",&n,&s,&x,&y,&mod);
  66. for (int i = ; i < n; ++i)
  67. {
  68. cin>>name>>tmp>>num>>tmp;
  69. nd[i].name = name;
  70. nd[i].pa = ToNo(num);
  71. }
  72. int cnt = ;
  73. for (int i = ; i < n; ++i)
  74. {
  75. int tp = cnt + nd[i].pa;
  76. if (tp <= s)
  77. {
  78. cnt += nd[i].pa;
  79. ans = nd[i];
  80. }
  81. else
  82. {
  83. ans.name = nd[i].name;
  84. ans.pa = s - cnt;
  85. cnt = ;
  86. s = (s*x + y)%mod;
  87. if (s == ) s = (s*x + y)%mod;
  88. i--;
  89. }
  90. cout<<ans.pa<<" pages "<<"for "<<ans.name<<endl;
  91. }
  92. cout<<endl;
  93. }
  94. }

山东省第四届ACM程序设计竞赛部分题解的更多相关文章

  1. UPC 2224 Boring Counting ★(山东省第四届ACM程序设计竞赛 tag:线段树)

    [题意]给定一个长度为N的数列,M个询问区间[L,R]内大于等于A小于等于B的数的个数. [题目链接]http://acm.upc.edu.cn/problem.php?id=2224 省赛的时候脑抽 ...

  2. 山东省第四届ACM程序设计竞赛A题:Rescue The Princess

    Description Several days ago, a beast caught a beautiful princess and the princess was put in prison ...

  3. 山东省第四届ACM程序设计竞赛A题:Rescue The Princess(数学+计算几何)

    Rescue The Princess Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 412  Solved: 168[Submit][Status][ ...

  4. 浙江省第十六届大学生ACM程序设计竞赛部分题解

    E .Sequence in the Pocket sol:将数组copy一份,然后sort一下,找寻后面最多多少个元素在原数组中保持有序,用总个数减去已经有序的就是我们需要移动的次数. 思维题 #i ...

  5. 山东省第四届ACM大学生程序设计竞赛解题报告(部分)

    2013年"浪潮杯"山东省第四届ACM大学生程序设计竞赛排名:http://acm.upc.edu.cn/ranklist/ 一.第J题坑爹大水题,模拟一下就行了 J:Contes ...

  6. Alice and Bob(2013年山东省第四届ACM大学生程序设计竞赛)

    Alice and Bob Time Limit: 1000ms   Memory limit: 65536K 题目描述 Alice and Bob like playing games very m ...

  7. 2013年山东省第四届ACM大学生程序设计竞赛-最后一道大水题:Contest Print Server

    点击打开链接 2226: Contest Print Server Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 53  Solved: 18 [Su ...

  8. sdut Mountain Subsequences 2013年山东省第四届ACM大学生程序设计竞赛

    Mountain Subsequences 题目描述 Coco is a beautiful ACMer girl living in a very beautiful mountain. There ...

  9. 华南师大 2017 年 ACM 程序设计竞赛新生初赛题解

    题解 被你们虐了千百遍的题目和 OJ 也很累的,也想要休息,所以你们别想了,行行好放过它们,我们来看题解吧... A. 诡异的计数法 Description cgy 太喜欢质数了以至于他计数也需要用质 ...

随机推荐

  1. hdu4975 网络流解方程组(网络流+dfs判环或矩阵DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=4975 A simple Gaussian elimination problem. Time Limit: 20 ...

  2. SQL取某个字符串最后一次出现的位置后面的字符串方法

    --sql怎么取某个字符串最后一次出现的位置后面的字符串 declare @s varchar(max); set @s = 'fj/2016815/2016081553677565.pdf'; se ...

  3. MacBook鼠标指针乱窜/不受控制问题的解决方法

    用了快一年的MacBook Pro最近出现了奇怪的问题.出问题时,鼠标不受控制,屏幕上鼠标指针乱窜,还时不时自动点击,犹如电脑被人远程控制一般.不管是用trackpad还是用外接鼠标,都是同样问题.电 ...

  4. python基础之练习题(二)

    九九乘法表 i = 0 #while 九九乘法表 j = 0 while i < 9: i += 1 while j<9: j += 1 sum = i + j total="% ...

  5. 【mlflow】mlflow打包、启动、换用mysql backend、mysql配置

    mlflow是一个自动化机器学习平台,支持python2也支持python3 mlflow9.0添加了数据库作为tracking data的存储: https://github.com/mlflow/ ...

  6. 浅谈Java中的equals和==(转载)

    在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String(&qu ...

  7. 洛谷P3939 数颜色 二分查找

    正解:二分 解题报告: 传送门! 话说其实我开始看到这题想到的是分块,,, 但是显然不用这么复杂,,,因为仔细看下这题,会发现每次只改变相邻的兔子的位置 所以开个vector(或者开个数组也成QwQ( ...

  8. centos 目录结构 快捷键 ls命令,alias别名,so:动态库 a:静态库,环境变量PATH,Ctrl+z 暂停命令,Ctrl+a 光标到行首,Ctrl+e 光标到行尾,Ctrl+u 删除光标前所有字符 Ctrl+r 搜索命 hash命令 Ctrl+左箭头/右箭头 cd命令 第三节课

    centos 目录结构 快捷键 ls命令,alias别名,so:动态库 a:静态库,环境变量PATH,Ctrl+z 暂停命令,Ctrl+a 光标到行首,Ctrl+e 光标到行尾,Ctrl+u 删除光标 ...

  9. Hadoop集群完全分布式坏境搭建

    前言 上一篇我们讲解了Hadoop单节点的安装,并且已经通过VMware安装了一台CentOS 6.8的Linux系统,咱们本篇的目标就是要配置一个真正的完全分布式的Hadoop集群,闲言少叙,进入本 ...

  10. 微软官方推出的win10安装或者创建安装u盘的工具

    https://www.microsoft.com/zh-cn/software-download/windows10 下载安装后,可根据提示,一步步的安装win10或者创建安装u盘