Codeforces Round #305 (Div. 1) A && B

冷不防 2022-08-05 00:55 278阅读 0赞

547A - Mike and Frog

先考虑,从h1->a1的过程,计算需要的时间
如果在M次内,没有到达则不可到达
然后再判断是否符合h2->a2的时间

如果还是不行就进行周期考虑,假设h1已经变成了a1,h2变成了xxx
计算从a1->a1的时间(假设为c),然后通过以下的方式
假设g(x) = Xh2 + Y,然后f(x) = g(g(…(g(x)))) (c次)。

  1. c = 1, d = 0
  2. for i = 1 to c
  3. c = (cX) % p
  4. d = (dX + Y) % p
  5. Then,
  6. f(x)
  7. return (cx + d) % p

然后找到从a1->a1且xxx->a2的周期
如果在迭代M次之后还没有找到,则不可到达

  1. // whn6325689
  2. // Mr.Phoebe
  3. // http://blog.csdn.net/u013007900
  4. #include <algorithm>
  5. #include <iostream>
  6. #include <iomanip>
  7. #include <cstring>
  8. #include <climits>
  9. #include <complex>
  10. #include <fstream>
  11. #include <cassert>
  12. #include <cstdio>
  13. #include <bitset>
  14. #include <vector>
  15. #include <deque>
  16. #include <queue>
  17. #include <stack>
  18. #include <ctime>
  19. #include <set>
  20. #include <map>
  21. #include <cmath>
  22. #include <functional>
  23. #include <numeric>
  24. #pragma comment(linker, "/STACK:1024000000,1024000000")
  25. using namespace std;
  26. typedef long long ll;
  27. typedef long double ld;
  28. typedef pair<ll, ll> pll;
  29. typedef complex<ld> point;
  30. typedef pair<int, int> pii;
  31. typedef pair<pii, int> piii;
  32. typedef vector<int> vi;
  33. #define CLR(x,y) memset(x,y,sizeof(x))
  34. #define mp(x,y) make_pair(x,y)
  35. #define pb(x) push_back(x)
  36. #define lowbit(x) (x&(-x))
  37. #define MID(x,y) (x+((y-x)>>1))
  38. #define speed std::ios::sync_with_stdio(false);
  39. #define eps 1e-9
  40. #define PI acos(-1.0)
  41. #define INF 0x3f3f3f3f
  42. #define LLINF 1LL<<62
  43. template<class T>
  44. inline bool read(T &n)
  45. {
  46. T x = 0, tmp = 1;
  47. char c = getchar();
  48. while((c < '0' || c > '9') && c != '-' && c != EOF) c = getchar();
  49. if(c == EOF) return false;
  50. if(c == '-') c = getchar(), tmp = -1;
  51. while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar();
  52. n = x*tmp;
  53. return true;
  54. }
  55. template <class T>
  56. inline void write(T n)
  57. {
  58. if(n < 0)
  59. {
  60. putchar('-');
  61. n = -n;
  62. }
  63. int len = 0,data[20];
  64. while(n)
  65. {
  66. data[len++] = n%10;
  67. n /= 10;
  68. }
  69. if(!len) data[len++] = 0;
  70. while(len--) putchar(data[len]+48);
  71. }
  72. //-----------------------------------
  73. ll M;
  74. ll H1, A1, X1, Y1;
  75. ll H2, A2, X2, Y2;
  76. int main()
  77. {
  78. read(M);
  79. read(H1),read(A1),read(X1),read(Y1);
  80. read(H2),read(A2),read(X2),read(Y2);
  81. ll i;
  82. for(i=1; i<=M; i++)
  83. {
  84. H1=(H1*X1+Y1)%M;
  85. if(H1==A1)
  86. break;
  87. }
  88. if(i>M)
  89. {
  90. printf("-1\n");
  91. return 0;
  92. }
  93. for(int j=0; j<i; j++)
  94. H2=(H2*X2+Y2)%M;
  95. if(H2==A2)
  96. {
  97. printf("%d\n",i);
  98. return 0;
  99. }
  100. ll X3=1, Y3=0;
  101. ll j;
  102. for(j=1; j<=M; j++)
  103. {
  104. H1=(H1*X1+Y1)%M;
  105. ll X4=X2*X3%M, Y4=(X2*Y3+Y2)%M;
  106. X3=X4;
  107. Y3=Y4;
  108. if(H1==A1)
  109. break;
  110. }
  111. if(j>M)
  112. {
  113. printf("-1\n");
  114. return 0;
  115. }
  116. for(ll k=1; k<=M; k++)
  117. {
  118. H2=(H2*X3+Y3)%M;
  119. if(H2==A2)
  120. {
  121. write(i+j*k),putchar('\n');
  122. return 0;
  123. }
  124. }
  125. printf("-1\n");
  126. return 0;
  127. }

547B - Mike and Feet

方法很多,我用了一个很傻逼很麻烦很慢的方法
题目需要找长度为x的区间中最小值的最大值
则我们按照数的大小进行排序,然后用set维护较小的数的位置,从而能够找到每个数影响到的区间,
然后维护一个区间最大值的线段树,区间是指长度

  1. // whn6325689
  2. // Mr.Phoebe
  3. // http://blog.csdn.net/u013007900
  4. #include <algorithm>
  5. #include <iostream>
  6. #include <iomanip>
  7. #include <cstring>
  8. #include <climits>
  9. #include <complex>
  10. #include <fstream>
  11. #include <cassert>
  12. #include <cstdio>
  13. #include <bitset>
  14. #include <vector>
  15. #include <deque>
  16. #include <queue>
  17. #include <stack>
  18. #include <ctime>
  19. #include <set>
  20. #include <map>
  21. #include <cmath>
  22. #include <functional>
  23. #include <numeric>
  24. #pragma comment(linker, "/STACK:1024000000,1024000000")
  25. using namespace std;
  26. typedef long long ll;
  27. typedef long double ld;
  28. typedef pair<ll, ll> pll;
  29. typedef complex<ld> point;
  30. typedef pair<int, int> pii;
  31. typedef pair<pii, int> piii;
  32. typedef vector<int> vi;
  33. #define CLR(x,y) memset(x,y,sizeof(x))
  34. #define mp(x,y) make_pair(x,y)
  35. #define pb(x) push_back(x)
  36. #define lowbit(x) (x&(-x))
  37. #define MID(x,y) (x+((y-x)>>1))
  38. #define speed std::ios::sync_with_stdio(false);
  39. #define eps 1e-9
  40. #define PI acos(-1.0)
  41. #define INF 0x3f3f3f3f
  42. #define LLINF 1LL<<62
  43. template<class T>
  44. inline bool read(T &n)
  45. {
  46. T x = 0, tmp = 1;
  47. char c = getchar();
  48. while((c < '0' || c > '9') && c != '-' && c != EOF) c = getchar();
  49. if(c == EOF) return false;
  50. if(c == '-') c = getchar(), tmp = -1;
  51. while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar();
  52. n = x*tmp;
  53. return true;
  54. }
  55. template <class T>
  56. inline void write(T n)
  57. {
  58. if(n < 0)
  59. {
  60. putchar('-');
  61. n = -n;
  62. }
  63. int len = 0,data[20];
  64. while(n)
  65. {
  66. data[len++] = n%10;
  67. n /= 10;
  68. }
  69. if(!len) data[len++] = 0;
  70. while(len--) putchar(data[len]+48);
  71. }
  72. //-----------------------------------
  73. #define ls idx<<1
  74. #define rs idx<<1|1
  75. const int MAXN=200010;
  76. struct Tree
  77. {
  78. int l,r;
  79. int maxx,lab;
  80. }t[MAXN<<2];
  81. void build(int idx,int l,int r)
  82. {
  83. t[idx].maxx=t[idx].lab=0;
  84. t[idx].l=l;t[idx].r=r;
  85. if(l==r) return;
  86. int mid=MID(l,r);
  87. build(ls,l,mid);
  88. build(rs,mid+1,r);
  89. }
  90. void update(int idx,int l,int r,int v)
  91. {
  92. if(t[idx].l==l && r==t[idx].r)
  93. {
  94. t[idx].lab=t[idx].maxx=v;
  95. return;
  96. }
  97. if(t[idx].lab)
  98. {
  99. t[ls].maxx=t[ls].lab=t[rs].maxx=t[rs].lab=t[idx].lab;
  100. t[idx].lab=0;
  101. }
  102. int mid=MID(t[idx].l,t[idx].r);
  103. if(l>mid)
  104. update(rs,l,r,v);
  105. else if(r<=mid)
  106. update(ls,l,r,v);
  107. else
  108. {
  109. update(ls,l,mid,v);update(rs,mid+1,r,v);
  110. }
  111. }
  112. int query(int idx,int x)
  113. {
  114. if(t[idx].l==t[idx].r)
  115. {
  116. return t[idx].maxx;
  117. }
  118. if(t[idx].lab)
  119. {
  120. t[ls].maxx=t[ls].lab=t[rs].maxx=t[rs].lab=t[idx].lab;
  121. t[idx].lab=0;
  122. }
  123. int mid=MID(t[idx].l,t[idx].r);
  124. if(x>mid)
  125. return query(rs,x);
  126. else
  127. return query(ls,x);
  128. }
  129. int n;
  130. set<int> st;
  131. set<int>::iterator it;
  132. struct Node
  133. {
  134. int num,id;
  135. bool operator < (const Node& b) const
  136. {
  137. return num<b.num;
  138. }
  139. }a[MAXN];
  140. int main()
  141. {
  142. read(n);
  143. build(1,1,n);
  144. for(int i=1;i<=n;i++)
  145. {
  146. read(a[i].num);
  147. a[i].id=i;
  148. }
  149. sort(a+1,a+n+1);
  150. st.insert(0);st.insert(n+1);
  151. for(int i=1,l,r;i<=n;i++)
  152. {
  153. it=st.lower_bound(a[i].id);
  154. r=*it;l=*(--it);
  155. if(r-l-1>=1)
  156. update(1,1,r-l-1,a[i].num);
  157. st.insert(a[i].id);
  158. }
  159. for(int i=1;i<=n;i++)
  160. write(query(1,i)),putchar(' ');
  161. putchar('\n');
  162. return 0;
  163. }

发表评论

表情:
评论列表 (有 0 条评论,278人围观)

还没有评论,来说两句吧...

相关阅读