• 【HDU】4391 Paint The Wall


    题意:

    给出n个节点,编号0~n-1。

    1 把[x,y]颜色覆盖为z。

    2 询问[x,y]颜色为z的有多少个。

    题解:http://page.renren.com/601081183/note/867254911

    懒得hash,直接用map搞。

    把数列分成sqrt(n)段,如果每段在完整的查询区间内,可以O(1)得到答案,否则对该段暴力答案。

      1 #include<cstdio>
      2 #include<cmath>
      3 #include<map>
      4 #define EPS 1e-8
      5 #define MAXM 331
      6 #define MAXN 100010
      7 using namespace std;
      8 int col[MAXN], same[MAXM];
      9 map<int, int> mymap[MAXM];
     10 int n, block;
     11 void Hash(int t) {
     12     int nd, i;
     13     mymap[t].clear();
     14     nd = min(t * block + block, n);
     15     for (i = t * block; i < nd; i++)
     16         mymap[t][col[i]]++;
     17 }
     18 void PushDown(int t) {
     19     int i, nd;
     20     nd = min(t * block + block, n);
     21     if (same[t] >= 0) {
     22         for (i = t * block; i < nd; i++)
     23             col[i] = same[t];
     24         same[t] = -1;
     25     }
     26 }
     27 void Update(int x, int y, int z) {
     28     int t, i, nd;
     29     t = x / block;
     30     if (t == y / block) {
     31         if (same[t] != z) {
     32             PushDown(t);
     33             for (i = x; i <= y; i++)
     34                 col[i] = z;
     35             Hash(t);
     36         }
     37     } else {
     38         if (x % block) {
     39             if (same[t] != z) {
     40                 PushDown(t);
     41                 for (nd = min(t * block + block, n); x < nd; x++)
     42                     col[x] = z;
     43                 Hash(t);
     44             } else
     45                 x = min(t * block + block, n);
     46         }
     47         if (y % block != block - 1) {
     48             t = y / block;
     49             if (same[t] != z) {
     50                 PushDown(t);
     51                 for (nd = t * block; y >= nd; y--)
     52                     col[y] = z;
     53                 Hash(t);
     54             } else
     55                 y = t * block - 1;
     56         }
     57         for (t = x / block; x <= y; x += block, t++)
     58             same[t] = z;
     59     }
     60 }
     61 int Query(int x, int y, int z) {
     62     int t, i, nd, ans;
     63     t = x / block;
     64     ans = 0;
     65     if (t == y / block) {
     66         if (same[t] == z)
     67             ans += y - x + 1;
     68         else if (same[t] == -1) {
     69             for (i = x; i <= y; i++) {
     70                 if (col[i] == z)
     71                     ans++;
     72             }
     73         }
     74     } else {
     75         if (x % block) {
     76             if (same[t] == z) {
     77                 ans += block - x % block;
     78                 x = min(t * block + block, n);
     79             } else if (same[t] == -1) {
     80                 for (nd = min(t * block + block, n); x < nd; x++) {
     81                     if (col[x] == z)
     82                         ans++;
     83                 }
     84             } else
     85                 x = min(t * block + block, n);
     86         }
     87         if (y % block != block - 1) {
     88             t = y / block;
     89             if (same[t] == z) {
     90                 ans += y % block + 1;
     91                 y = t * block - 1;
     92             } else if (same[t] == -1) {
     93                 for (nd = t * block; y >= nd; y--) {
     94                     if (col[y] == z)
     95                         ans++;
     96                 }
     97             } else
     98                 y = t * block - 1;
     99         }
    100         for (t = x / block; x <= y; x += block, t++) {
    101             if (same[t] >= 0) {
    102                 if (same[t] == z)
    103                     ans += block;
    104             } else {
    105                 if (mymap[t].count(z))
    106                     ans += mymap[t][z];
    107             }
    108         }
    109     }
    110     return ans;
    111 }
    112 int main() {
    113     int q, i, j, cmd, x, y, z;
    114     while (~scanf("%d%d", &n, &q)) {
    115         block = (int) (ceil(sqrt((double) n)) + EPS);
    116         for (i = 0; i < n; i++)
    117             scanf("%d", &col[i]);
    118         for (i = j = 0; i < n; i += block, j++) {
    119             same[j] = -1;
    120             Hash(j);
    121         }
    122         while (q--) {
    123             scanf("%d%d%d%d", &cmd, &x, &y, &z);
    124             if (cmd == 1)
    125                 Update(x, y, z);
    126             else
    127                 printf("%d\n", Query(x, y, z));
    128         }
    129     }
    130     return 0;
    131 }
  • 相关阅读:
    Web API 配置Help Page
    Web API Help Page Install WebApiTestClient 简单的测试客户端
    开始一个简单的ASP.NET Web API 2 (C#)
    一些有用的huginn Agent
    jsp填坑:找不到属性
    Oracle学习笔记
    阿里云服务器端配置TensorFlow & jupyter
    重启部署在阿里云上的huginn
    centos升级python2.7到3.6之后造成yum命令报错
    取消layUI中日期选择控件默认填充日期
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2658870.html
Copyright © 2020-2023  润新知