zoukankan      html  css  js  c++  java
  • 18牛客多校训练第二场 J farm

    题意:一个n×m的农田, 每个小格子都有一种作物, 现在喷t次农药,每次农药覆盖一个矩形, 该矩形里面与农药类型不同的植物都会死掉, 求最后植物的死亡数是多少。

    题解:二维树状数组。 每次喷农药的时候将这个覆盖的区间加一。 然后对于[1,n*m]的植物, 先删除同种植物的同种农药对区间的影响, 然后查询该种植物的是否被标记过了 即 该位置的值 > 1, 最后处理完这种植物再把这种植物的农药再加回去.

    代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
     4 #define LL long long
     5 #define ULL unsigned LL
     6 #define fi first
     7 #define se second
     8 #define pb push_back
     9 #define lson l,m,rt<<1
    10 #define rson m+1,r,rt<<1|1
    11 #define max3(a,b,c) max(a,max(b,c))
    12 #define min3(a,b,c) min(a,min(b,c))
    13 typedef pair<int,int> pll;
    14 const int inf = 0x3f3f3f3f;
    15 const LL INF = 0x3f3f3f3f3f3f3f3f;
    16 const LL mod =  (int)1e9+7;
    17 const int N = 1e6 + 100;
    18 vector<int> dp[N];
    19 vector<pll> save[N];
    20 int n, m;
    21 int lowbit(int x)
    22 {
    23     return x &(-x);
    24 }
    25 void Add(int x, int y, int c)
    26 {
    27     for(int i = x; i <= n; i += lowbit(i))
    28         for(int j = y; j <= m; j += lowbit(j))
    29             dp[i][j] += c;
    30 }
    31 int Query(int x, int y)
    32 {
    33     int cnt = 0;
    34     for(int i = x; i > 0; i -= lowbit(i))
    35         for(int j = y; j > 0; j -= lowbit(j))
    36            cnt += dp[i][j];
    37     return cnt;
    38 }
    39 struct Node{
    40     int x1, y1, x2, y2, k;
    41 }A[N];
    42 bool cmp(Node &x1, Node &x2){
    43     return x1.k < x2.k;
    44 }
    45 int main()
    46 {
    47     int  t, v;
    48     int ans = 0;
    49     scanf("%d%d%d", &n, &m, &t);
    50     for(int i = 1; i <= n; i++)
    51         dp[i].resize(m+10);
    52     for(int i = 1; i <= n; i++){
    53         for(int j = 1; j <= m; j++){
    54             scanf("%d", &v);
    55             save[v].pb(pll(i,j));
    56         }
    57     }
    58     for(int i = 1; i <= t; i++){
    59         scanf("%d%d%d%d%d", &A[i].x1, &A[i].y1 , &A[i].x2, &A[i].y2, &A[i].k);
    60         Add(A[i].x1, A[i].y1, 1);
    61         Add(A[i].x2+1,A[i].y2+1,1);
    62         Add(A[i].x1,A[i].y2+1,-1);
    63         Add(A[i].x2+1,A[i].y1,-1);
    64     }
    65     sort(A+1,A+1+t,cmp);
    66     for(int i = 1, j = 1, zz; i <= n * m; i++){
    67  
    68         while(A[j].k < i && j <= t)   j++;
    69         if(save[i].size() == 0) continue;
    70         zz = j;
    71         while(A[zz].k == i && zz <=t) zz++;
    72         for(int z = j; z < zz; ++z){
    73             Add(A[z].x2+1,A[z].y2+1,-1);
    74             Add(A[z].x1,A[z].y1,-1);
    75             Add(A[z].x1,A[z].y2+1,1);
    76             Add(A[z].x2+1,A[z].y1,1);
    77         }
    78         for(auto it : save[i]){
    79             if(Query(it.fi, it.se)){
    80                 ans++;
    81             }
    82         }
    83         for(int z = j; z < zz; ++z){
    84             Add(A[z].x2+1,A[z].y2+1,1);
    85             Add(A[z].x1,A[z].y1,1);
    86             Add(A[z].x1,A[z].y2+1,-1);
    87             Add(A[z].x2+1,A[z].y1,-1);
    88         }
    89         j = zz;
    90     }
    91     cout << ans << endl;
    92     return 0;
    93 }
    View Code
  • 相关阅读:
    CSP-S全国模拟赛第三场 【nan死了】
    ●SCOI2018 AFO
    ●洛谷P2934 [USACO09JAN]安全出行Safe Travel
    ●洛谷P3233 [HNOI2014]世界树
    ●洛谷P2495 [SDOI2011]消耗战
    ●UOJ58 [WC2013]糖果公园
    ●洛谷P1903 [国家集训队]数颜色
    ●BZOJ 4237 稻草人
    ●Joyoi Normal
    ●CodeForces 698C LRU
  • 原文地址:https://www.cnblogs.com/MingSD/p/9347223.html
Copyright © 2011-2022 走看看