• Codeforces Round #262 (Div. 2)解题报告



    详见:http://robotcator.logdown.com/posts/221514-codeforces-round-262-div-2

    1:A. Vasya and Socks   http://codeforces.com/contest/460/problem/A

    有n双袜子,每天穿一双然后扔掉。每隔m天买一双新袜子,问最多少天后没有袜子穿。


    简单思维题:曾经不注重这方面的训练,结果做了比較久。这样的题自己边模拟边想。只是要多考虑trick
    ```c++
    int main(){
      int n, m;
      long long ans = 0;
      scanf("%d%d", &n, &m);
      ans = n/m*m;
      int tmp = n/m;
      int left = tmp + n%m;
      while(true){
        ans += left/m*m;
        tmp = left/m;
        left = tmp+left%m;
        if(left < m) break;
      }
      ans += left;
      printf("%I64d ", ans);
      return 0;
    }
    ```
    2:B. Little Dima and Equation  http://codeforces.com/contest/460/problem/B
    题意:
    ```mathjax
       求满足方程  x = b*S(x)^{a}+c方程解 \  
       0 lt x lt 10^{9}   ,   1 le a le 5 , 1 le b le 10000 , -10000 le c le 10000\
       s(x) 为x每位数的和
    ```
    题解:假设简单枚举x肯定超时,可是我们能够换个角度,枚举S(x)。这样就简单多了。由于依据右边就能够算出x..
    ```c++

    int get_sum(long long x){
      int ans = 0;
      while(x){
        ans += x%10;
        x /= 10;
      }
      return ans;
    }
    int main(){
      int a, b, c;
      scanf("%d%d%d", &a, &b, &c);
      long long ans[maxn];
      int num = 0;
      for(int i = 1; i <= 81; i ++){
        long long tmp = 1;
        for(int j = 1; j <= a; j ++) tmp *= i;
        long long temp = b*tmp + c;
        if(temp > 1e9) continue;
        if(get_sum(temp) == i) {
          ans[num++] = temp;
        }
      }
      printf("%d ", num);
      if(num > 0) {
        for(int i = 0; i < num; i ++)
          printf("%I64d ", ans[i]);
        printf(" ");
      }
      return 0;
    }
    ```
    3: C. Present  http://codeforces.com/contest/460/problem/C
    题意:有n朵花,给出初始高度。然后能够浇m次水,每次浇水能够浇连续的w朵,每次浇水后花都会长高1个单位。

    问最后最矮的那朵花最大值为多少。
    题解:刚開始想,首先要贪心选出最矮的花和其相邻的花浇水。然后是a_(i) 到a_(i+w-1)加一个单位。当时没想到什么好的办法。于是我就想用线段树维护区间最小值,每次找出最小值的下界。然后往右w多花都浇水。刚開始在求下界时想了好久,只是联系一维情况还是写出来了。
    ```c++
    long long a[maxn];
    long long mm[4*maxn];
    int setv[4*maxn];

    void build(int root, int l, int r){
      int lc = 2*root, rc = 2*root+1;
      if(l < r){
        int mid = (l+r)/2;
        build(2*root, l, mid);
        build(2*root+1, mid+1, r);
        mm[root] = min(mm[lc], mm[rc]);
      }else{
        mm[root] = a[l];
      }
    }

    void pushdown(int root, int l, int r){
      int lc = 2*root, rc = 2*root+1;
      if(setv[root] > 0){
        setv[lc] += setv[root];
        setv[rc] += setv[root];
        mm[lc] += setv[root];
        mm[rc] += setv[root];
        setv[root] = 0;
      }
    }

    void pushup(int root, int l, int r){
      int lc = 2*root, rc = 2*root+1;
      mm[root] = min(mm[lc], mm[rc]);
    }

    void modify(int root, int l, int r, int x, int y, int s){
      if(x <= l && r <= y){
        mm[root] += s;
        setv[root] += s;
      }else{
        pushdown(root, l, r);
        int mid = (l+r)/2;
        if(x <= mid) modify(2*root, l, mid, x, y, s);
        if(y > mid) modify(2*root+1, mid+1, r, x, y, s);
        pushup(root, l, r);
      }
    }

    int minn;
    void query(int root, int l, int r, int z){
      int lc = 2*root, rc = 2*root+1 , mid = (l+r)/2;
      if(l == r){
        if(l < minn) minn = l;
      }else{
        pushdown(root, l, r);
        if(mm[lc] <= z) query(lc, l, mid, z);
        else query(rc, mid+1, r, z);
        pushup(root, l, r);
      }
    }

    void print(int root, int l, int r){
        printf("%d %d ", root, mm[root]);
        if(l < r){
          int mid = (l+r)/2;
          print(2*root, l, mid);
          print(2*root+1, mid+1, r);
        }
    }

    int main(){
      int w, n, m;
      scanf("%d%d%d", &n, &m, &w);
      for(int i = 1; i <= n; i ++)
        scanf("%d", &a[i]);
      memset(setv, 0, sizeof(setv));
      build(1, 1, n);
    //  print(1, 1, n);
      for(int i = 1; i <= m; i ++){
        minn = inf;
        query(1, 1, n, mm[1]);
        //cout << minn << endl;
        if(n-minn+1 < w) modify(1, 1, n, n-w+1, n, 1);
        else modify(1, 1, n, minn, minn+w-1, 1);
      }
      printf("%I64d ", mm[1]);
      return 0;
    }
    ```
    昨晚上面两题时间还有15分钟左右,后两题没想出什么好办法。

    下次再补上。

  • 相关阅读:
    Lexical Sign Sequence
    (UPCOJ暑期训练)Tally Counters
    (2019hdu多校第十场) Welcome Party
    (2019hdu多校第十场1003) Valentine's Day
    更新,线段树模板(支持相关基本操作)
    linux(deepin)下Clion的安装及环境配置
    2019牛客第7场——C(Governing sand)
    【数论】数论之旅:N!分解素因子及若干问题
    [二分]Kayaking Trip
    [数论之旅]数学定理
  • 原文地址:https://www.cnblogs.com/yfceshi/p/6812886.html
Copyright © 2020-2023  润新知