zoukankan      html  css  js  c++  java
  • 【HDOJ】4902 Nice boat

     区间线段树。题目还不错。

      1 /*  */
      2 #include <iostream>
      3 #include <string>
      4 #include <map>
      5 #include <queue>
      6 #include <set>
      7 #include <vector>
      8 #include <algorithm>
      9 #include <cstdio>
     10 #include <cmath>
     11 #include <cstring>
     12 #include <climits>
     13 #include <cctype>
     14 using namespace std;
     15 
     16 #define lson l, mid, rt<<1
     17 #define rson mid+1, r, rt<<1|1
     18 #define MAXN 100005
     19 
     20 typedef struct {
     21     int mx, val;
     22 } node_t;
     23 
     24 node_t T[MAXN<<2];
     25 int n, m, x;
     26 int l;
     27 
     28 int gcd(int n, int m) {
     29     if (m == 0)
     30         return n;
     31     if (m > n)
     32         return gcd(m, n);
     33     return gcd(m, n%m);
     34 }
     35 
     36 void PushUp(int rt) {
     37     T[rt].val = T[rt<<1].val==T[rt<<1|1].val ? T[rt<<1].val:-1;
     38     T[rt].mx = max(T[rt<<1].mx, T[rt<<1|1].mx);
     39 }
     40 
     41 void PushDown(int rt) {
     42     if (T[rt].val >= 0) {
     43         T[rt<<1].val = T[rt<<1|1].val = T[rt].val;
     44         T[rt<<1].mx = T[rt<<1|1].mx = T[rt].mx;
     45     }
     46 }
     47 
     48 void build(int l, int r, int rt) {
     49     if (l == r) {
     50         scanf("%d", &T[rt].val);
     51         T[rt].mx = T[rt].val;
     52         return ;
     53     }
     54     int mid = (l+r)>>1;
     55     build(lson);
     56     build(rson);
     57     PushUp(rt);
     58 }
     59 
     60 void update1(int ll, int rr, int l, int r, int rt) {
     61     if (ll<=l && rr>=r) {
     62         T[rt].val = x;
     63         T[rt].mx = x;
     64         return ;
     65     }
     66     int mid = (l+r)>>1;
     67     PushDown(rt);
     68     if (rr <= mid) {
     69         update1(ll, rr, lson);
     70     } else if (ll > mid) {
     71         update1(ll, rr, rson);
     72     } else {
     73         update1(ll, mid, lson);
     74         update1(mid+1, rr, rson);
     75     }
     76     PushUp(rt);
     77 }
     78 
     79 void update2(int ll, int rr, int l, int r, int rt) {
     80     if (T[rt].mx <= x)
     81         return ;
     82     int mid = (l+r)>>1;
     83     if (ll<=l && rr>=r) {
     84         if (T[rt].val >= 0) {
     85             T[rt].val = gcd(T[rt].val, x);
     86             T[rt].mx = T[rt].val;
     87         } else {
     88             update2(ll, rr, lson);
     89             update2(ll, rr, rson);
     90             PushUp(rt);
     91         }
     92         return ;
     93     }
     94     PushDown(rt);
     95     if (rr <= mid) {
     96         update2(ll, rr, lson);
     97     } else if (ll > mid) {
     98         update2(ll, rr, rson);
     99     } else {
    100         update2(ll, mid, lson);
    101         update2(mid+1, rr, rson);
    102     }
    103     PushUp(rt);
    104 }
    105 
    106 void printAll(int l, int r, int rt) {
    107     if (T[rt].val >= 0) {
    108         for (int i=l; i<=r; ++i)
    109             printf("%d ", T[rt].val);
    110         return ;
    111     }
    112     int mid = (l+r)>>1;
    113     printAll(lson);
    114     printAll(rson);
    115 }
    116 
    117 int main() {
    118     int i, j, k;
    119     int l, r;
    120     int t;
    121 
    122     #ifndef ONLINE_JUDGE
    123         freopen("data.in", "r", stdin);
    124         freopen("data.out", "w", stdout);
    125     #endif
    126 
    127     scanf("%d", &t);
    128     while (t--) {
    129         scanf("%d", &n);
    130         build(1, n, 1);
    131         scanf("%d", &m);
    132         while (m--) {
    133             scanf("%d %d %d %d", &k, &l, &r, &x);
    134             if (k == 1) {
    135                 update1(l, r, 1, n, 1);
    136             } else {
    137                 update2(l, r, 1, n, 1);
    138             }
    139         }
    140         printAll(1, n, 1);
    141         putchar('
    ');
    142     }
    143 
    144     return 0;
    145 }
  • 相关阅读:
    VB Treeview控件 介绍与使用
    基于V4L2的视频驱动开发
    Jlinkv8 灯不亮重新烧写固件的办法
    使用JLink间接烧写S3C2410、S3C2440开发板Nor、Nand Flash的方法
    linux 开机自动执行脚本或者一些指定的程序
    FrameBuffer编程二(简单程序下)
    c语言内存分配函数
    FrameBuffer编程二(简单的程序上)
    FrameBuffer编程一(数据结构)
    mmap函数介绍
  • 原文地址:https://www.cnblogs.com/bombe1013/p/4392469.html
Copyright © 2011-2022 走看看