[关闭]
@2368860385 2018-12-19T13:07:47.000000Z 字数 2985 阅读 207

北京八十中集训——day1

比赛总结


预计:?+0+0
实际:70+0+0

考试过程

想了会儿T1,感觉好像会做,于是就写了,写了到两个半小时左右的时候,一直调,调了几个bug。最后的bug是找到最小的合法的斜率和最大的合法的斜率。
最后11:30的时候,想先去写暴力,但是想到调出了就100,不调了的话就可能0分了,于是又继续调,终于到12:00发现不太会这个东西,于是就想去写T2,T3,结果比赛结束了,一直以为12:30结束。。。

总结:
注意一下时间,分配好时间
可以先打暴力。

T1

幸亏数据水,不然爆零了。。。
最后的判断最小最大的斜率,可以用旋转卡壳,回去再学学这个东西。

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cstring>
  5. #include<iostream>
  6. #include<cmath>
  7. #include<cctype>
  8. #include<set>
  9. #include<vector>
  10. #include<queue>
  11. #include<map>
  12. using namespace std;
  13. typedef long long LL;
  14. inline int read() {
  15. int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;
  16. for(;isdigit(ch);ch=getchar())x=x*10+ch-'0';return x*f;
  17. }
  18. const int N = 300005;
  19. const int INF = 1e9 + 10;
  20. struct Node {
  21. int k, b, l, r;
  22. Node() {}
  23. Node(int _k,int _b,int _l,int _r) { k = _k, b = _b, l = _l, r = _r; }
  24. }s1[N], s2[N];
  25. int u[N], d[N];
  26. double Slope(int i,int x1,int j,int x2) {
  27. return 1.0 * (x2 - x1) / (1.0 * (j - i));
  28. }
  29. double jiao(const Node &A,const Node &B) {
  30. return (1.0 * (B.b - A.b)) / (1.0 * (A.k - B.k));
  31. }
  32. inline LL dc(int a1,int d,int n) {
  33. return 1ll * n * a1 + 1ll * (n * (n - 1)) / 2 * d;
  34. }
  35. inline LL qz(int a,const Node &A) {
  36. return 1ll * A.k * a + A.b;
  37. }
  38. LL Calc(int l,int r,const Node &A,const Node &B) {
  39. if (l > r) return 0;
  40. LL n1 = dc(qz(l, A), A.k, r - l + 1);
  41. LL n2 = dc(qz(l, B), B.k, r - l + 1);
  42. if (n1 - n2 + 1ll * (r - l + 1) < 0) return 0;
  43. return n1 - n2 + 1ll * (r - l + 1);
  44. // return dc(qz(l, A), A.k, r - l + 1) - dc(qz(l, B), B.k, r - l + 1) + 1ll * (r - l + 1);
  45. }
  46. void de(Node A) {
  47. cout << A.k << " " << A.b << " " << A.l << " " << A.r << "\n";
  48. }
  49. int main() {
  50. // freopen("2.txt", "r", stdin);
  51. int n = read();
  52. for (int i = 1; i <= n; ++i) d[i] = read(), u[i] = read();
  53. // for (int i = 1; i <= n; ++i) u[i] = read();
  54. // double Mx = Slope(1, d[1], 2, u[2]);
  55. // for (int i = 3; i <= n; ++i) Mx = min(Mx, Slope(1, d[1], i, u[i]));
  56. // double Mn = Slope(1, u[1], 2, d[2]);
  57. // for (int i = 3; i <= n; ++i) Mn = max(Mn, Slope(1, u[1], i, d[i]));
  58. // int mx = floor(Mx), mn = ceil(Mn);
  59. // cout << Mx << " " << Mn << "\n";
  60. // if (Mn > Mx) { cout << 0; return 0; }
  61. int top = 0; s1[++top] = Node(0, u[1], -INF, INF); //de(s1[top]);
  62. for (int i = 2; i <= n; ++i) {
  63. Node now = Node(-(i - 1), u[i], -INF, INF);
  64. while (top) {
  65. double t = jiao(s1[top], now);
  66. if (t <= 1.0 * s1[top].l) now.l = s1[top].l, top --;
  67. else if (t > 1.0 * s1[top].l && t <= 1.0 * s1[top].r) {
  68. int p = ceil(t); s1[top].r = p - 1, now.l = p; break;
  69. }
  70. else break;
  71. }
  72. // de(s1[top]); de(now);
  73. s1[++top] = now;
  74. }
  75. int cnt1 = top;
  76. top = 0; s2[++top] = Node(0, d[1], -INF, INF); //de(s2[top]);
  77. int xl = -1;
  78. for (int i = 2; i <= n ; ++i) {
  79. Node now = Node(xl, d[i], -INF, INF); xl --;
  80. while (top) {
  81. double t = jiao(s2[top], now);
  82. if (t >= 1.0 * s2[top].r) now.r = s2[top].r, top --;
  83. else if (t < 1.0 * s2[top].r && t >= 1.0 * s2[top].l) {
  84. int p = floor(t); s2[top].l = p + 1, now.r = p; break;
  85. }
  86. else break;
  87. }
  88. // de(s2[top]); de(now);
  89. s2[++top] = now;
  90. }
  91. int cnt2 = top;
  92. // puts("");
  93. // for (int i = 1; i <= cnt1; ++i) de(s1[i]);puts("");
  94. // for (int i = 1; i <= cnt2; ++i) de(s2[i]);puts("");
  95. int mn = ceil(jiao(s1[1], s2[cnt2]));
  96. int mx = floor(jiao(s1[cnt1], s2[1]));
  97. int last = mn, p1 = 1, p2 = cnt2;
  98. LL ans = 0;
  99. while (p1 <= cnt1 && p2 >= 1) {
  100. if (s1[p1].l > s1[p1].r) { p1 ++; continue ; }
  101. if (s2[p2].l > s2[p2].r) { p2 --; continue ; }
  102. if (s1[p1].r < mn) { p1 ++; continue ; }
  103. if (s2[p2].r < mn) { p2 --; continue ; }
  104. if (s1[p1].r <= s2[p2].r) {
  105. ans += Calc(last, min(mx, s1[p1].r), s1[p1], s2[p2]);
  106. last = s1[p1].r + 1;
  107. p1 ++;
  108. }
  109. else {
  110. ans += Calc(last, min(mx, s2[p2].r), s1[p1], s2[p2]);
  111. last = s2[p2].r + 1;
  112. p2 --;
  113. }
  114. }
  115. // while (p1 <= cnt1) {
  116. // ans +=
  117. // }
  118. // if (ans < 0) { cout << 0; return 0; }
  119. cout << ans;
  120. return 0;
  121. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注