zoukankan      html  css  js  c++  java
  • Codeforces Round #149 (Div. 2)

    A,B两个水题。

    C:BFS求最短路,由于范围很大(1e9),而且实际的可走范围比较小,所以需要存储映射关系,类似稀疏矩阵的三元组

     1 #include <cstdio>
     2  #include <cstring>
     3  #include <algorithm>
     4  #include <map>
     5  #include <utility>
     6  #include <queue>
     7  #define LL long long
     8  
     9  using namespace std;
    10  
    11  int dx[] = {0, 0, 1, -1, 1, -1, 1, -1};
    12  int dy[] = {1, -1, 0, 0, 1, -1, -1, 1};
    13  typedef pair<int, int> P;
    14  map<P, int> q;
    15  struct node
    16  {
    17      int x, y, l;
    18  };
    19  queue<node> qu;
    20  int x1, y1, x2, y2;
    21  int bfs()
    22  {
    23      while(!qu.empty()) qu.pop();
    24      node tmp = {x1, y1, 0};
    25      qu.push(tmp);
    26      while(!qu.empty())
    27      {
    28          tmp = qu.front();
    29          qu.pop();
    30          if(tmp.x == x2 && tmp.y == y2) return tmp.l;
    31          for(int i = 0; i < 8; ++i)
    32          {
    33              P t = make_pair(tmp.x + dx[i], tmp.y + dy[i]);
    34              if(q[t] == 1)
    35              {
    36                  q[t] = -1;
    37                  node nw = {tmp.x + dx[i], tmp.y + dy[i], tmp.l + 1};
    38                  qu.push(nw);
    39              }
    40          }
    41      }
    42      return -1;
    43  }
    44  int main()
    45  {
    46      int n;
    47      while(scanf("%d%d%d%d", &x1, &y1, &x2, &y2) == 4)
    48      {
    49          q.clear();
    50          q[make_pair(x1, y1)] = 1;
    51          q[make_pair(x2, y2)] = 1;
    52          int m, x, y, z;
    53          scanf("%d", &m);
    54          while(m--)
    55          {
    56              scanf("%d%d%d", &x, &y, &z);
    57              for(int i = y; i <= z; ++i)
    58                  q[make_pair(x, i)] = 1;
    59          }
    60          int ans = bfs();
    61          printf("%d\n", ans);
    62      }
    63      return 0;
    64  }

    D:

    E:线段树,区间求和,问题是更新时将区间内每个数异或x,可以按位统计二进制1的个数,注意pushdown的写法。

      1 #include <cstdio>
      2 #include <cstring>
      3 #include <algorithm>
      4 #include <map>
      5 #include <utility>
      6 #include <queue>
      7 #define LL long long
      8 
      9 using namespace std;
     10 
     11 struct tree
     12 {
     13     int x;
     14     int d[20];
     15 }t[100010 << 2];
     16 int p[20];
     17 void pushdown(int rt, int l, int r)
     18 {
     19     if(t[rt].x)
     20     {
     21         t[rt << 1].x ^= t[rt].x;
     22         t[rt << 1 | 1].x ^= t[rt].x;
     23         int m = (r - l + 1);
     24         int left = m - (m >> 1);
     25         int right = (m >> 1);
     26         for(int i = 0; i < 20; ++i)
     27         {
     28             if(t[rt].x & (1 << i))
     29             {
     30                 t[rt << 1].d[i] = (left - t[rt << 1].d[i]);
     31             }
     32             if(t[rt].x & (1 << i))
     33             {
     34                 t[rt << 1 | 1].d[i] = (right - t[rt << 1 | 1].d[i]);
     35             }
     36         }
     37         t[rt].x = 0;
     38     }
     39 }
     40 void pushup(int rt)
     41 {
     42     for(int i = 0; i < 20; ++i)
     43     {
     44         t[rt].d[i] = t[rt << 1 | 1].d[i] + t[rt << 1].d[i];
     45     }
     46 }
     47 void update(int l, int r, int rt, int L, int R, int x)
     48 {
     49     if(L <= l && r <= R)
     50     {
     51         t[rt].x ^= x;
     52         for(int i = 0; i < 20; ++i)
     53         {
     54             if((1 << i) & x)
     55             {
     56                 t[rt].d[i] = (r - l + 1 - t[rt].d[i]);
     57             }
     58         }
     59         return;
     60     }
     61     int m = (l + r) >> 1;
     62     pushdown(rt, l, r);
     63     if(m >= L) update(l, m, rt << 1, L, R, x);
     64     if(m < R) update(m + 1, r, rt << 1 | 1, L, R, x);
     65     pushup(rt);
     66 }
     67 
     68 LL query(int l, int r, int rt, int L, int R)
     69 {
     70     if(L <= l && r <= R)
     71     {
     72         LL tmp = 0;
     73         for(int i = 0; i < 20; ++i)
     74         {
     75             tmp += t[rt].d[i] * (LL)p[i];
     76         }
     77         return tmp;
     78     }
     79     LL ans = 0;
     80     int m = (l + r) >> 1;
     81     pushdown(rt, l, r);
     82     if(L <= m) ans += query(l, m, rt << 1, L, R);
     83     if(m < R) ans += query(m + 1, r, rt << 1 | 1, L, R);
     84     return ans;
     85 }
     86 
     87 int main()
     88 {
     89     int n, m;
     90     for(int i = 0; i < 20; ++i)
     91     {
     92         if(i == 0) p[i] = 1;
     93         else p[i] = 2 * p[i - 1];
     94     }
     95     scanf("%d", &n);
     96     for(int i = 0, x; i < n; ++i)
     97     {
     98         scanf("%d", &x);
     99         update(1, n, 1, i + 1, i + 1, x);
    100     }
    101     scanf("%d", &m);
    102     while(m--)
    103     {
    104         int x, y, f;
    105         scanf("%d%d%d", &f, &x, &y);
    106         if(f == 1)
    107         {
    108             LL ans = 0;
    109             ans = query(1, n, 1, x, y);
    110             printf("%lld\n", ans);
    111         }
    112         else
    113         {
    114             scanf("%d", &f);
    115             update(1, n, 1, x, y, f);
    116         }
    117     }
    118     return 0;
    119 }
  • 相关阅读:
    Java 重写(Override)与重载(Overload)
    Java 继承
    Java 异常处理
    Java Scanner 类
    Java 流(Stream)、文件(File)和IO
    Java 方法
    Java 正则表达式
    Beta冲刺——代码规范、冲刺任务与计划
    Beta冲刺——凡事预则立
    Beta冲刺——问题总结博客(事后诸葛亮和组员交换事宜)
  • 原文地址:https://www.cnblogs.com/ACystalMoon/p/2767441.html
Copyright © 2011-2022 走看看