zoukankan      html  css  js  c++  java
  • CF862E Mahmoud and Ehab and the function

    首先 (f(j)=displaystyle|sum_{i=1}^{n}(-1)^{i-1}a_i+(-1)^ib_{i+j}|=|sum_{i=1}^{n}(-1)^{i-1}a_i+sum_{i=1}^{n}(-1)^{i}b_{i+j}|)

    我们先处理出 suma,表示 (displaystylesum_{i=1}^{n}(-1)^{i-1}a_i) 的值。

    然后处理出 sumb[i],这个是等于 (-(sumb[i-1]+b_i)+b_{i+n}* n) 是否为奇数,为奇数就乘 (-1),否则乘 (1)

    然后我们发现对于每次的更新,只有 (r-l+1) 为奇数时,且 (l) 也为奇数时,suma 才会发生变化,所以对于每次更新就判断一下就行了。

    那么对于 (f(j)) 的最小值,我们二分一下,在 sumb 中找最接近 suma 的就行了。

    代码:

    #include <bits/stdc++.h>
    #define reg register
    #define ll long long
    #define int long long
    #define ull unsigned long long
    #define db double
    #define pi pair<int, int>
    #define pl pair<ll, ll>
    #define vi vector<int>
    #define vl vector<ll>
    #define vpi vector<pi>
    #define vpl vector<pl>
    #define pb push_back
    #define er erase
    #define SZ(x) (int) x.size()
    #define lb lower_bound
    #define ub upper_bound
    #define all(x) x.begin(), x.end()
    #define rall(x) x.rbegin(), x.rend()
    #define mkp make_pair
    using namespace std;
    char ch, B[1 << 20], *S = B, *T = B;
    #define getc() (S == T && (T = (S = B) + fread(B, 1, 1 << 20, stdin), S == T) ? 0 : *S++)
    #define isd(c) (c >= '0' && c <= '9')
    int aa, bb;
    int rd() {
      while(ch = getc(), !isd(ch) && ch != '-');
      ch == '-' ? aa = bb = 0 : (aa = ch - '0', bb = 1);
      while(ch = getc(), isd(ch))
        aa = aa * 10 + ch - '0';
      return bb ? aa : -aa;
    }
    const int MAXN = 1e5 + 10;
    int n, m, q, a[MAXN], b[MAXN], suma, sumb[MAXN];
    int ask(int l, int r, int x, int delta) {
      if((r - l) % 2 == 0) {
        if(l % 2 == 1)
          suma += x;
        else
          suma -= x;
      }
      int *pos = lb(sumb, sumb + delta, -suma);
      int ans = 1e18 + 10;
      if(pos != sumb + delta)
        ans = min(ans, abs(suma + *pos));
      if(pos != sumb) {
        --pos;
        ans = min(ans, abs(suma + *pos));
      }
      return ans;
    }
    inline void work() {
      scanf("%lld%lld%lld", &n, &m, &q);
      suma = 0;
      for(reg int i = 1, mul = 1; i <= n; ++i, mul *= -1) {
        scanf("%lld", &a[i]);
        suma += a[i] * mul;
        // printf("%d ", suma);
      }
      // puts("");
      int delta = m - n + 1;
      sumb[0] = 0;
      for(reg int i = 1, mul = -1; i <= m; ++i, mul *= -1) {
        scanf("%lld", &b[i]);
        if(i <= n)
          sumb[0] += b[i] * mul;
      }
      for(reg int i = 1; i + n <= m; ++i)
        sumb[i] = -(sumb[i - 1] + b[i]) + b[i + n] * ((n & 1) ? -1 : 1);
      // for(reg int i = 1; i <= m; ++i)
        // printf("%d ", &b[i]);
      // puts("");
      sort(sumb, sumb + delta);
      printf("%lld
    ", ask(1, 1, 0, delta));
      for(reg int i = 1; i <= q; ++i) {
        int l, r, x;
        scanf("%lld%lld%lld", &l, &r, &x);
        printf("%lld
    ", ask(l, r, x, delta));
      }
    }
    signed main() {
      // freopen("input.txt", "r", stdin);
      work();
      return 0;
    }
    
  • 相关阅读:
    简单字符串处理应避免使用正则表达式
    提高正则表达式的可读性
    用零宽度断言匹配字符串中的特定位置
    避免不必要的回溯
    预编译正则表达式
    用Text::CSV_XS模块处理csv文件
    Ack 类似grep一样的查找
    Apache压力测试
    仅编译正则表达式一次
    排序上下箭头的是实现
  • 原文地址:https://www.cnblogs.com/Lonely-233/p/13659181.html
Copyright © 2011-2022 走看看