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 \n",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 \n",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\n",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\n",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\n",min(m-mx,qu[i].v));
171                 }else{
172                     update(1,tmpa,tmpb,max(-mi,qu[i].v)) ;
173                     printf("%d\n",max(-mi,qu[i].v));
174                 }
175             }
176         }
177     }
178     return 0;
179 }

时间: 2024-10-12 17:28:16

GCPC2014 H JuQueen的相关文章

《linux 内核全然剖析》 include/asm/io.h

include/asm/io.h #define outb(value,port) __asm__ ("outb %%al,%%dx"::"a" (value),"d" (port)) //宏定义outb用汇编实现了在端口地址port处写入值value //使用的寄存器是al,一个byte长度,而端口port使用的是2byte长度地址来标记的寄存器,注意这里寄存器的使用 #define inb(port) ({ unsigned char _v;

CUDA gputimer.h头文件

#ifndef __GPU_TIMER_H__ #define __GPU_TIMER_H__ struct GpuTimer { cudaEvent_t start; cudaEvent_t stop; GpuTimer() { cudaEventCreate(&start); cudaEventCreate(&stop); } ~GpuTimer() { cudaEventDestroy(start); cudaEventDestroy(stop); } void Start() {

2017.5 校内预选赛 A H

题目描述: 目前图像识别是一项非常热门的技术,最流行的莫不过是深度学习的图像识别,识别率甚至能达到99%以上.当然,对于简单的图像来说,深度学习是没有必要的.比如如果要识别安徽拼音的首字母A和H,就可以不用深度学习就可以判断.现在有一些只含A或者H的图像,你知道该如何识别吗? 输入描述: 第一行输入正整数T,表示数据的组数. 每组数据中,第一行是两个正整数n和m,表示图像的大小. 接下来有n行,每行m个字符,只可能为'.'或者'#'.'.'表示白色,'#'表示黑色.'#'会通过上下左右或者左上左

编译过程中,termcap.h 文件找不到路径 licli.a终于生成

编译过程中,termcap.h      文件找不到路径 查看是linux  源码下找不到termcap.h文件 安装了所有关于*cap*的源码包也不起作用 今天终于解决了这个问题,搜termcap.h  发现一篇文章,如下 ----------------------------------------------------------------------------------------- 安装minicom2.3出现termcap.h错误解决方法 2010-05-06 17:12:

使用javah生成.h文件, 出现无法访问android.app,Activity的错误的解决

在工程ndk22/bin/classes中 运行javah  com.cn.ndk22.Ndk22.Activity ,出现了.h文件 我在bin/classes目录中 ,就是无法访问, : 错误:无法访问android.app.Activity 找不到android.app.Activity 如下图所示 于是我cmd定位到ndk/src,中运行 javah com.heima.ndk.ndkActivity, 成功了就能成功了 ...我也不知道为什么.,如下图 总结:  使用javah生成.h

mppe +H -M +S -L -D -C中个字母意思

mppe +H -M +S -L -D -C what each character mean. 根据Microsoft Point-To-Point Encryption (MPPE) Protocol的rfc3078文件中第2节Configuration Option Format: H:使用stateless模式(this indicates that the sender wishes to negotiate the use of stateless mode) M:使用56bit密钥

gnu/stubs-32.h: No such file

On Ubuntu it's called libc6-dev-i386 - do sudo apt-get install libc6-dev-i386. See below for extra instructions for Ubuntu 12.04. On Red Hat distros, the package name is glibc-devel.i686 (Thanks to David Gardner's comment) On CentOS 5.8, the package

VS2013找不到winres.h的解决办法

好久没有搞C++了,搞C++最烦就各种版本问题的报错.我对C++项目开发不是很熟悉,因为项目需要用VS2013修改一个C++/MFC工程,一编译就报错无法打开包括文件:"winres.h": No such file or directory. 上网查了一下,这个'winres.h'是Windows SDK的一个头文件,打开C盘找一下,果然在Windows SDK目录C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include下

php安装编译时 configure: error: Cannot find OpenSSL&#39;s &lt;evp.h&gt;

=============================================== yum install error: protected multilib versions error===============================================sudo yum downgrade openssl 降级sudo yum install openssl-devel ===另外参考====================================