zoukankan      html  css  js  c++  java
  • GCPC2014 H JuQueen

    题意:给你一个数列,起始值为0 ,区间增加或减少,但是每次的最大改变值是这个区间的最值到临界值的范围。单值查询和区间询问。

    解题思路:线段树。

    解题代码:

      1 // File Name: h.cpp
      2 // Author: darkdream
      3 // Created Time: 2015年03月16日 星期一 15时22分06秒
      4 
      5 #include<vector>
      6 #include<list>
      7 #include<map>
      8 #include<set>
      9 #include<deque>
     10 #include<stack>
     11 #include<bitset>
     12 #include<algorithm>
     13 #include<functional>
     14 #include<numeric>
     15 #include<utility>
     16 #include<sstream>
     17 #include<iostream>
     18 #include<iomanip>
     19 #include<cstdio>
     20 #include<cmath>
     21 #include<cstdlib>
     22 #include<cstring>
     23 #include<ctime>
     24 #define LL long long
     25 #define maxn 100001
     26 using namespace std;
     27 struct node{
     28     int l , r,m, v, lazy,mx,mi ; 
     29 }tree[maxn*4];
     30 int mp[4590000];
     31 int mpt;
     32 int mpa[maxn];
     33 int n,m,q;
     34 char str[100];
     35 struct que{
     36     int status,l,r,v;
     37 }qu[maxn];
     38 int L(int x)
     39 {
     40     return 2* x; 
     41 }
     42 int R(int x)
     43 {
     44     return 2 * x +1;
     45 }
     46 void build(int c, int l ,int r)
     47 {
     48     tree[c].l = l ; 
     49     tree[c].r = r; 
     50     tree[c].m = (tree[c].l + tree[c].r)/2;
     51     if(l == r)
     52     {
     53         return; 
     54     }
     55     build(L(c),l,tree[c].m);
     56     build(R(c),tree[c].m+1,r);
     57 }
     58 int mx;
     59 int mi;
     60 void push_down(int c)
     61 {
     62     tree[L(c)].lazy += tree[c].lazy;
     63     tree[R(c)].lazy += tree[c].lazy;
     64     tree[L(c)].mi += tree[c].lazy; 
     65     tree[L(c)].mx += tree[c].lazy; 
     66     tree[R(c)].mi += tree[c].lazy; 
     67     tree[R(c)].mx += tree[c].lazy; 
     68     tree[c].lazy = 0 ;
     69 }
     70 void push_up(int c)
     71 {
     72     tree[c].mi = min(tree[L(c)].mi,tree[R(c)].mi);
     73     tree[c].mx = max(tree[L(c)].mx,tree[R(c)].mx);
     74 }
     75 void query(int c, int l , int r)
     76 {
     77     if(l <= tree[c].l && r >= tree[c].r)
     78     {
     79         mi = min(mi,tree[c].mi);
     80         mx = max(mx,tree[c].mx);
     81         return ;
     82     }
     83     push_down(c);
     84     if(l <= tree[c].m)
     85         query(L(c),l,r);
     86     if(r > tree[c].m)
     87         query(R(c),l,r);
     88     push_up(c);
     89 }
     90 void update(int c, int l ,int r,int v)
     91 {
     92     //printf("update ! c= %d l = %d r = %d tree[c].l = %d tree[c].r = %d v = %d 
    ",c,l,r,tree[c].l ,tree[c].r,v);
     93     if(l <= tree[c].l && r >= tree[c].r)
     94     {
     95         //    printf("update ! c= %d v = %d 
    ",c,v);
     96         tree[c].mi +=v; 
     97         tree[c].mx +=v;
     98         tree[c].lazy += v;
     99         return;
    100     }
    101     push_down(c);
    102     if(l <= tree[c].m)
    103         update(L(c),l,r,v);
    104     if(r > tree[c].m)
    105         update(R(c),l,r,v);
    106     push_up(c);
    107 }
    108 int main(){
    109     //freopen("large-crafted2.in","r",stdin);
    110     //freopen("out","w",stdout);
    111     while(scanf("%d %d %d",&n,&m,&q)!= EOF)
    112     {
    113         mpt = 0 ; 
    114         int ta, tb; 
    115         for(int i = 1; i <= q;i ++)
    116         {
    117             scanf("%s",str) ;
    118             if(str[0] == 's')
    119             {
    120                 qu[i].status = 1; 
    121                 scanf("%d",&qu[i].l);
    122                 mpt ++ ; 
    123                 mpa[mpt] =  qu[i].l ; 
    124             }else if(str[0] == 'c')
    125             {
    126                 qu[i].status = 2; 
    127                 scanf("%d %d",&qu[i].l ,&qu[i].v);
    128                 mpt ++ ; 
    129                 mpa[mpt] = qu[i].l ; 
    130 
    131             }else{
    132                 qu[i].status = 3; 
    133                 scanf("%d %d %d",&qu[i].l,&qu[i].r,&qu[i].v);
    134                 mpt ++ ; 
    135                 mpa[mpt] = qu[i].l ; 
    136                 mpt ++ ; 
    137                 mpa[mpt] = qu[i].r ; 
    138             }
    139         }
    140         sort(mpa +1 ,mpa + mpt + 1);
    141         int tt = 0  ; 
    142         for(int i = 1;i <= mpt ;i ++)
    143         {
    144             if(i != 1 && mpa[i] == mpa[i-1])
    145                 continue;
    146             mp[mpa[i]]  = ++tt ; 
    147         }
    148         build(1,1,tt);
    149         int tmp ,tmpa,tmpb;
    150         for(int i = 1;i <= q;i ++)
    151         {
    152             mi = 1e9;
    153             mx = 0 ;
    154             if(qu[i].status == 1)
    155             {
    156                  tmp = mp[qu[i].l];
    157                 query(1,tmp,tmp);
    158                 printf("%d
    ",mx);
    159             }else
    160             {
    161                  tmpa = mp[qu[i].l];
    162                  tmpb = tmpa; 
    163 
    164                 if(qu[i].status == 3)
    165                     tmpb = mp[qu[i].r];
    166                 query(1,tmpa,tmpb);
    167                 //printf("%d %d**%d %d %d
    ",tmpa,tmpb,mi,mx,min(m-mx,qu[i].v));
    168                 if(qu[i].v > 0){
    169                     update(1,tmpa,tmpb,min(m-mx,qu[i].v)) ;
    170                     printf("%d
    ",min(m-mx,qu[i].v));
    171                 }else{
    172                     update(1,tmpa,tmpb,max(-mi,qu[i].v)) ;
    173                     printf("%d
    ",max(-mi,qu[i].v));
    174                 }
    175             }
    176         }
    177     }
    178     return 0;
    179 }
    View Code
    没有梦想,何谈远方
  • 相关阅读:
    Log4Net学习【三】
    Log4Net学习【二】
    Log4Net学习【一】
    Asp.Net生命周期系列六
    Asp.Net生命周期系列五
    Asp.Net生命周期系列四
    Asp.Net生命周期系列三
    我为什么很烦在DB服务器上安装杀毒软件
    SQL Server 2012故障转移的looksalive check和is alive check
    如何让用户只能访问特定的数据库(MSSQL)
  • 原文地址:https://www.cnblogs.com/zyue/p/4342643.html
Copyright © 2011-2022 走看看