zoukankan      html  css  js  c++  java
  • #3:调试疯了——3

    UVA11992,自己板子真心难调bugwoc

      1 #include <bits/stdc++.h>
      2 #define maxn 50005
      3 using namespace std;
      4 
      5 struct Seg {
      6     int l, r;
      7     int sum, maxx, minn;
      8 };
      9 
     10 struct tree {
     11     Seg t[maxn<<2];
     12     int addv[maxn<<2], setv[maxn<<2];
     13 
     14     void init(int c) {
     15         for (int i = 1; i <= (c<<2); i++) {
     16             addv[i] = 0;
     17             setv[i] = -1;
     18         }
     19     }
     20 
     21     void push_up(int p) {
     22         int ls = p << 1, rs = p << 1 | 1;
     23         t[p].sum = t[ls].sum + t[rs].sum;
     24         t[p].maxx = max(t[ls].maxx, t[rs].maxx);
     25         t[p].minn = min(t[ls].minn, t[rs].minn);
     26     }
     27 
     28     void build(int l, int r, int p) {
     29         t[p].l = l, t[p].r = r;
     30         if (l == r) {
     31             t[p].sum = t[p].maxx = t[p].minn = 0;
     32             return;
     33         }
     34 
     35         int mid = (l + r) >> 1;
     36         int ls = p << 1, rs = p << 1 | 1;
     37         build(l, mid, ls);
     38         build(mid+1, r, rs);
     39         push_up(p);
     40     }
     41 
     42     void push_down(int p) {
     43         int ls = p << 1, rs = p << 1 | 1;
     44         if (setv[p] >= 0) {
     45             t[ls].sum = setv[p]*(t[ls].r-t[ls].l+1);
     46             t[rs].sum = setv[p]*(t[rs].r-t[rs].l+1);
     47             t[ls].maxx = t[rs].maxx = setv[p];
     48             t[ls].minn = t[rs].minn = setv[p];
     49             setv[ls] = setv[rs] = setv[p];
     50             addv[ls] = addv[rs] = 0;
     51             setv[p] = -1;
     52         }
     53         if (addv[p]) {
     54             t[ls].maxx += addv[p];
     55             t[rs].maxx += addv[p];
     56             t[ls].minn += addv[p];
     57             t[rs].minn += addv[p];
     58             t[ls].sum += addv[p]*(t[ls].r-t[ls].l+1);
     59             t[rs].sum += addv[p]*(t[rs].r-t[rs].l+1);
     60             addv[ls] += addv[p];
     61             addv[rs] += addv[p];
     62             addv[p] = 0;
     63         }
     64     }
     65 
     66     void update(int l, int r, int k, int p, int flag) {
     67         if (l <= t[p].l && t[p].r <= r) {
     68             if (flag) {
     69                 t[p].maxx = t[p].minn = k;
     70                 t[p].sum = k*(t[p].r - t[p].l + 1);
     71                 setv[p] = k;
     72                 addv[p] = 0;
     73             } else {
     74                 t[p].maxx += k;
     75                 t[p].minn += k;
     76                 t[p].sum += k*(t[p].r - t[p].l + 1);
     77                 addv[p] += k;
     78             }
     79             return;
     80         }
     81 
     82         int mid = (t[p].l + t[p].r) >> 1;
     83         int ls = p << 1, rs = p << 1 | 1;
     84         push_down(p);
     85         if (l <= mid)    update(l, r, k, ls, flag);
     86         if (mid < r)    update(l, r, k, rs, flag);
     87         push_up(p);
     88     }
     89 
     90     Seg query(int l, int r, int p) {
     91         if (l <= t[p].l && t[p].r <= r)    return t[p];
     92 
     93         int mid = (t[p].l + t[p].r) >> 1;
     94         int ls = p << 1, rs = p << 1 | 1;
     95         push_down(p);
     96         if (l > mid)    return query(l, r, rs);
     97         if (r <= mid)    return query(l, r, ls);
     98 
     99         Seg a, b, ans;
    100         a = query(l, r, ls);
    101         b = query(l, r, rs);
    102         ans.sum = a.sum + b.sum;
    103         ans.maxx = max(a.maxx, b.maxx);
    104         ans.minn = min(a.minn, b.minn);
    105         return ans;
    106     }
    107 }T[21];
    108 
    109 int r, c, m, v;
    110 
    111 int main() {
    112     while (~scanf("%d%d%d", &r, &c, &m)) {
    113         for (int i = 1; i <= r; i++) {
    114             T[i].init(c);
    115             T[i].build(1, c, 1);
    116         }
    117         while (m--) {
    118             int o, x1, y1, x2, y2;
    119             scanf("%d%d%d%d%d", &o, &x1, &y1, &x2, &y2);
    120 
    121             if (o == 3) {
    122                 int sum = 0, minn = 1e9+1, maxx = -1e9-1;
    123                 for (int i = x1; i <= x2; i++) {
    124                     Seg a = T[i].query(y1, y2, 1);
    125                     sum += a.sum;
    126                     minn = min(minn, a.minn);
    127                     maxx = max(maxx, a.maxx);
    128                 }
    129                 printf("%d %d %d
    ", sum, minn, maxx);
    130             } else {
    131                 scanf("%d", &v);
    132                 for (int i = x1; i <= x2; i++)
    133                     T[i].update(y1, y2, v, 1, o-1);
    134             }
    135         }
    136     }
    137     return 0;
    138 }
    View Code

    Contest hunter最长公共上升子序列。

     1 #include <cstdio>
     2 #define R(a) scanf("%d", &a);
     3 #define rep(i, a, b) for (int i = a; i <= b; i++)
     4 #define max(a, b) a > b ? a : b
     5 
     6 int n, ans;
     7 int a[3001], b[3001], f[3001][3001];
     8 
     9 int main() {
    10     R(n);
    11     rep(i, 1, n)    R(a[i]);
    12     rep(i, 1, n)    R(b[i]);
    13     rep(i, 1, n) {
    14         int val = 0;
    15         rep(j, 1, n) {
    16             if (a[i] == b[j]) {
    17                 f[i][j] = val + 1;
    18             } else {
    19                 f[i][j] = f[i-1][j];
    20                 if (b[j] < a[i])    val = max(val, f[i][j]);
    21             }
    22         }
    23     }
    24     
    25     rep(i, 1, n)    ans = max(ans, f[n][i]);
    26     printf("%d
    ", ans);
    27     return 0;
    28 }
    View Code

    POJ3666,数据比较水可以只写递增不写递减就AC……

    可以滚动数组,也可nlogn优先队列奇妙过法,跟cf#371div1的C是同一道题,那个题的过法网友们也是千奇百怪,神奇的优先队列看了半天解释也没看懂,目前水平太低悟不透这些,先放坑里。

    假A代码:

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <cmath>
     4 #include <algorithm>
     5 using namespace std;
     6 #define maxn 2001
     7 #define init(a, b) memset(a, b, sizeof(a))
     8 #define R(a) scanf("%d", &a)
     9 #define REP(i, a, b) for (int i = a; i <= b; i++)
    10 
    11 int n, a[maxn];
    12 int num[maxn], f[maxn][maxn];
    13 
    14 int main() {
    15     R(n);
    16     REP(i, 1, n) {
    17         R(a[i]);
    18         num[i] = a[i];
    19     }
    20 
    21     sort(num+1, num+1+n);
    22     int m = unique(num+1, num+1+n) - (num+1);
    23 
    24     init(f, 0x3f);
    25     f[0][0] = 0;
    26 
    27     REP(i, 1, n) {
    28         int temp = f[i-1][0];
    29         REP(j, 1, m) {
    30             temp = min(temp, f[i-1][j]);
    31             f[i][j] = temp + abs(a[i] - num[j]);
    32         }
    33     }
    34 
    35     int ans = 0x3f3f3f3f;
    36     REP(i, 1, m)    ans = min(ans, f[n][i]);
    37     printf("%d", ans);
    38 
    39     return 0;
    40 }
    View Code
  • 相关阅读:
    [luoguP3953] 逛公园(DP + spfa)
    [luoguP3960] 列队(动态开点线段树)
    [luoguP2325] [SCOI2005]王室联邦(树分块乱搞)
    [luoguP1053] 篝火晚会(贪心 + 乱搞)
    Linux_C socket 一些知识
    Linux_C socket 服务器(cat ,execl功能)
    Linux_C socket server.c clinet.c功能分开写
    Linux_C socket clinet.c
    Linux_C AF_INET和PF_INET的细微不同
    Linux_socket一些基本函数和结构体
  • 原文地址:https://www.cnblogs.com/AlphaWA/p/10346058.html
Copyright © 2011-2022 走看看