zoukankan      html  css  js  c++  java
  • [HIHO1299]打折机票(线段树)

    题目链接:http://hihocoder.com/problemset/problem/1299

    线段树,按照t为下标去更新v,更新的时候要保留最大的那个。

     1 #include <algorithm>
     2 #include <iostream>
     3 #include <iomanip>
     4 #include <cstring>
     5 #include <climits>
     6 #include <complex>
     7 #include <fstream>
     8 #include <cassert>
     9 #include <cstdio>
    10 #include <bitset>
    11 #include <vector>
    12 #include <deque>
    13 #include <queue>
    14 #include <stack>
    15 #include <ctime>
    16 #include <set>
    17 #include <map>
    18 #include <cmath>
    19 
    20 using namespace std;
    21 
    22 //kirai²»ÊÇɳ²è£¬²»»áÍü¼ÇÐÞ¸Ämaxn
    23 #define lson l, m, rt << 1
    24 #define rson m + 1, r, rt << 1 | 1
    25 typedef long long ll;
    26 typedef struct Node {
    27     int t, v;
    28 }Node;
    29 const int maxn = 100010;
    30 int n, m;
    31 int sum[maxn<<2];
    32 
    33 void pushUP(int rt) {
    34     //modify
    35     sum[rt] = max(sum[rt<<1], sum[rt<<1|1]);
    36 }
    37 
    38 void build(int l, int r, int rt) {
    39     if(l == r) {
    40         sum[rt] = -1;
    41         return;
    42     }
    43     int m = (l + r) >> 1;
    44     build(lson);
    45     build(rson);
    46     pushUP(rt);
    47 }
    48 
    49 void update(int p, int add, int l, int r, int rt) {
    50     if(l == r) {
    51         sum[rt] = max(sum[rt], add);
    52         return;
    53     }
    54     int m = (l + r) >> 1;
    55     if(p <= m) {
    56         update(p, add, lson);
    57     }
    58     else {
    59         update(p, add, rson);
    60     }
    61     pushUP(rt);
    62 }
    63 
    64 int query(int L, int R, int l, int r, int rt) {
    65     if(L <= l && r <= R) {
    66         return sum[rt];
    67     }
    68     int m = (l + r) >> 1;
    69     int ret = 0;
    70     if(L <= m) {
    71         //modify
    72         ret = max(ret, query(L, R, lson));
    73     }
    74     if(R > m) {
    75         //modify
    76         ret = max(ret, query(L, R, rson));
    77     }
    78     return ret;
    79 }
    80 
    81 int main() {
    82     // freopen("in", "r", stdin);
    83     while(~scanf("%d%d", &n, &m)) {
    84         int t, v;
    85         build(1, n, 1);
    86         for(int i = 0; i < n; i++) {
    87             scanf("%d%d", &t, &v);
    88             update(t, v, 1, n, 1);
    89         }
    90         int a, b;
    91         while(m--) {
    92             scanf("%d%d", &a, &b);
    93             int ans = query(a, b, 1, n, 1);
    94             if(ans <= 0) printf("None
    ");
    95             else printf("%d
    ", ans);
    96         }
    97     }
    98     return 0;
    99 }
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 #define lrt rt << 1
     5 #define rrt rt << 1 | 1
     6 const int maxn = 100100;
     7 typedef struct Node {
     8     int l, r;
     9     int sum;
    10 }Node;
    11 Node T[maxn<<2];
    12 int n, m;
    13 
    14 void pushUP(int rt) {
    15     T[rt].sum = max(T[lrt].sum, T[rrt].sum);
    16 }
    17 
    18 void build(int rt, int l, int r) {
    19     T[rt].l = l;
    20     T[rt].r = r;
    21     T[rt].sum = -1;
    22     if(l == r) return;
    23     int mid = (l + r) >> 1;
    24     build(lrt, l, mid);
    25     build(rrt, mid+1, r);
    26     pushUP(rt);
    27 }
    28 
    29 void update(int rt, int pos, int val) {
    30     if(T[rt].l > pos || T[rt].r < pos) return;
    31     if(T[rt].l <= pos && T[rt].r >= pos) T[rt].sum = max(T[rt].sum, val);
    32     if(T[rt].l == T[rt].r) return;
    33     update(lrt, pos, val);
    34     update(rrt, pos, val);
    35     pushUP(rt);
    36 }
    37 
    38 int query(int rt, int l, int r) {
    39     int ret = -1;
    40     if(T[rt].l > r || T[rt].r < l) return ret;
    41     if(T[rt].l >= l && T[rt].r <= r) return T[rt].sum;
    42     if(T[rt].l == T[rt].r) return ret;
    43     ret = max(ret, query(lrt, l, r));
    44     ret = max(ret, query(rrt, l, r));
    45     return ret;
    46 }
    47 
    48 int main() {
    49     // freopen("in", "r", stdin);
    50     int a, b;
    51     while(~scanf("%d%d",&n,&m)) {
    52         build(1, 1, n);
    53         for(int i = 1; i <= n; i++) {
    54             scanf("%d %d", &a, &b);
    55             update(1, a, b);
    56         }
    57         while(m--) {
    58             scanf("%d %d", &a, &b);
    59             int ret = query(1, a, b);
    60             if(ret == -1) puts("None");
    61             else printf("%d
    ", ret);
    62         }
    63     }
    64     return 0;
    65 }
  • 相关阅读:
    零基础学python-4.5 标准类型分类
    零基础学python-4.4 常用的一些内建函数
    零基础学python-4.3 对象的比较
    零基础学python-4.2 其他内建类型
    零基础学python-4.1 python对象的简介和标准类型
    7、postman中的Newman插件(可生成html测试报告)
    6、postman cookie和token使用
    5、postman认证方式简单了解
    4、postman动态参数传递(含token详细使用)
    3、postman中tests断言使用
  • 原文地址:https://www.cnblogs.com/kirai/p/5467545.html
Copyright © 2011-2022 走看看