zoukankan      html  css  js  c++  java
  • Census UVA

    Census

    UVA - 11297

    昨天看完刘汝佳的,用二维线段树写了。。。

    然后刚学过整体二分,就拿来练一下,结果调了一晚上加一早上bug。。。

    先是二维树状数组写崩了

    emmm一直没发现他们两个是不等价的,,好菜啊=_=

    改了之后还是一直RE,要是一直RE我大概也能猜到很可能是数组的问题,关键中间还莫名返回了几个WA,一头雾水...

    最后发现还是数组开太小了=_=

      1 #include <bits/stdc++.h>
      2 using namespace std;
      3 #define LL long long 
      4 const int maxn = 520;
      5 const int maxq = 350010;     //数组开小了WA到死。。。。 500 × 500 + 40000 × 2
      6 const int inf = 1<<30;
      7 struct Qry{
      8     int x1, y1, x2, y2, v;
      9     int id, type;
     10 }q[maxq], q1[maxq], q2[maxq];
     11 
     12 struct BIT{
     13     int n;
     14     int b[maxn][maxn];
     15     void init(int _n){
     16         n = _n;
     17         memset(b, 0, sizeof(b));
     18     }
     19     void add(int x, int y, int v){
     20         for(int i = x; i <= n; i += i & -i){
     21             for(int j = y; j <= n; j += j & -j){
     22                 b[i][j] += v;
     23             }
     24         }
     25     }
     26     int sum(int x, int y){
     27         int res = 0;
     28         for(int i = x; i; i -= i & -i){
     29             for(int j = y; j; j -= j & -j){
     30                 res += b[i][j];
     31             }
     32         }
     33         return res;
     34     }
     35     int sum(int x1, int y1, int x2, int y2){
     36         return sum(x2, y2) - sum(x1 - 1, y2) - sum(x2, y1 - 1) + sum(x1 - 1, y1 - 1);
     37     }
     38 }bit;
     39 int a[maxn][maxn], ans[maxq];
     40 void solve(int L, int R, LL l, LL r){
     41     if(L > R) return ;
     42     if(l == r){
     43         for(int i = L; i <= R; i++){
     44             if(q[i].type == 2) ans[q[i].id] = l;
     45         }
     46         return ;
     47     }
     48     LL m = (l + r) >> 1;
     49     int f = 0, g = 0;
     50     for(int i = L; i <= R; i++){
     51         if(q[i].type == 1){
     52             if(q[i].v <= m) {
     53                 bit.add(q[i].x1, q[i].y1, q[i].id);
     54                 q1[f++] = q[i];
     55             }else q2[g++] = q[i];
     56         }else{
     57             int temp = bit.sum(q[i].x1, q[i].y1, q[i].x2, q[i].y2);
     58             if(temp >= q[i].v) q1[f++] = q[i];
     59             else {
     60                 q[i].v -= temp;
     61                 q2[g++] = q[i];
     62             }
     63         }
     64     }
     65     for(int i = 0; i < f; i++) if(q1[i].type == 1) bit.add(q1[i].x1, q1[i].y1, -q1[i].id);
     66     memcpy(q + L, q1, f * sizeof(Qry));
     67     memcpy(q + L + f, q2, g * sizeof(Qry));
     68     solve(L, L + f - 1, l, m);
     69     solve(L + f, R, m + 1, r);
     70 }
     71 
     72 int main(){
     73     int n;
     74     //freopen("in.txt", "r", stdin);
     75     //freopen("out1.txt", "w", stdout);
     76     while(scanf("%d", &n) != EOF){
     77         bit.init(n);
     78         int idx = 0, cnt = 0;
     79         for(int i = 1; i <= n; i++){
     80             for(int j = 1; j <= n; j++){
     81                 scanf("%d", &a[i][j]);
     82                 q[++idx] = Qry{i, j, 0, 0, a[i][j], 1, 1};
     83             }
     84         }
     85         int m;
     86         scanf("%d",&m);
     87         for(int i = 1; i <= m; i++){
     88             int x1, y1, x2, y2, v;
     89             char op[4];
     90             scanf("%s", op);
     91             if(op[0] == 'q'){
     92                 scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
     93                 q[++idx] = Qry{x1, y1, x2, y2, 1, ++cnt, 2};
     94                 int temp = (x2 - x1 + 1) * (y2 - y1 + 1);
     95                 q[++idx] = Qry{x1, y1, x2, y2, temp, ++cnt, 2};
     96             }else{
     97                 scanf("%d %d %d", &x1, &y1, &v);
     98                 q[++idx] = Qry{x1, y1, 0, 0, a[x1][y1], -1, 1};
     99                 a[x1][y1] = v;
    100                 q[++idx] = Qry{x1, y1, 0, 0, v, 1, 1};
    101             }
    102         }
    103         solve(1, idx, 0, inf);
    104         for(int i = 1; i <= cnt; i += 2){
    105             printf("%d %d
    ", ans[i + 1], ans[i]);
    106         }
    107     }
    108 }
    View Code


    再贴个对拍生成的数据吧orz

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int MAXN = 1313;
     4 const int  mod = 1<<30;
     5 int main(){
     6     freopen("in.txt", "w", stdout);
     7     for(int k = 0; k < MAXN; k++){
     8         int n = rand() % 13 + 1;
     9         cout<<n<<endl;
    10         for(int i = 0; i < n; i++){
    11             for(int j = 0; j < n; j++){
    12                 cout<<(rand() % mod) <<" ";
    13             }
    14             cout<<endl;
    15         }
    16         int m = 10;
    17         cout<<m<<endl;
    18         while(m--){
    19             int fg = rand() & 1;
    20             if(fg){
    21                 cout<<"q ";
    22                 int x1 = rand() % n + 1;
    23                 int y1 = rand() % n + 1;
    24                 int x2 = rand() % n + 1;
    25                 int y2 = rand() % n + 1;
    26                 if(x1 > x2) swap(x1, x2);
    27                 if(y1 > y2) swap(y1, y2);
    28                 printf("%d %d %d %d
    ", x1, y1, x2, y2);
    29             }else{
    30                 cout<<"c ";
    31                 int x1 = rand() % n + 1;
    32                 int y1 = rand() % n + 1;
    33                 int v = rand() % mod;
    34                 printf("%d %d %d
    ", x1, y1, v);
    35             }
    36         }
    37     }
    38 }
    View Code
  • 相关阅读:
    Mac下搭建php开发环境
    phalcon:跟踪sql语句
    phalcon的CLI应用
    phalcon遇到的那些坑
    浏览器 批量大文件上传下载
    网页 批量大文件上传下载
    B/S 批量大文件上传下载
    JavaScript 批量大文件上传下载
    js 批量大文件上传下载
    vue 批量大文件上传下载
  • 原文地址:https://www.cnblogs.com/yijiull/p/8334127.html
Copyright © 2011-2022 走看看