CSU 1532: JuQueen(线段树)
来源:互联网 发布:sql sum函数 编辑:程序博客网 时间:2024/05/22 05:14
1532: JuQueen
Time Limit: 5 Sec Memory Limit: 512 MBSubmit: 363 Solved: 110
[Submit][Status][Web Board]
Description
Input
Output
Sample Input
10 10 5state 0groupchange 2 9 7state 9groupchange 0 2 10change 0 -5
Sample Output
0773-3
HINT
题意: 输入 :c n q ->给你初始[0,c)去为0的区间,q个操作,n是区间数的上限,即不能超过n
q次操作: state id 输出下标为id 的数
groupchange l r val 区间【l,r】上的每个数:val>0,加1 val次,如果有一个数==n,停止操作;
val<0,减1 val次,如果有一个数==0,停止操作;输出实际加或减的次数。
change l val 同上,改为单点操作
题解:线段树维护区间最大值计最小值。
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<string>#include<algorithm>#include<cstdlib>#include<set>#include<queue>#include<stack>#include<vector>#include<map>#define N 4587530#define Mod 10000007#define lson l,mid,idx<<1#define rson mid+1,r,idx<<1|1#define lc idx<<1#define rc idx<<1|1const double EPS = 1e-11;const double PI = acos ( -1.0 );const double E = 2.718281828;typedef long long ll;const int INF = 100010;using namespace std;struct node { int Max; int Min; int se;} tree[N<<2];int n,c,q;int Max,Min;void push_up(int idx) { tree[idx].Max=max(tree[lc].Max,tree[rc].Max); tree[idx].Min=min(tree[lc].Min,tree[rc].Min);}void build(int l,int r,int idx) { tree[idx].se=0; if(l==r) { tree[idx].Max=0; tree[idx].Min=0; return; } int mid=(l+r)>>1; build(lson); build(rson); push_up(idx);}void push_down(int idx) { if(tree[idx].se) { tree[lc].se+=tree[idx].se; tree[rc].se+=tree[idx].se; tree[lc].Max+=tree[idx].se; tree[lc].Min+=tree[idx].se; tree[rc].Max+=tree[idx].se; tree[rc].Min+=tree[idx].se; tree[idx].se=0; }}void updata(int l,int r,int idx,int x,int y,int val) { if(l>=x&&r<=y) { tree[idx].Max+=val; tree[idx].Min+=val; tree[idx].se+=val; return; } push_down(idx); int mid=(l+r)>>1; if(x<=mid)updata(lson,x,y,val); if(y>mid)updata(rson,x,y,val); push_up(idx);}int query(int l,int r,int idx,int x,int y) { if(l>=x&&r<=y) { Min=min(tree[idx].Min,Min); return tree[idx].Max; } push_down(idx); int mid=(l+r)>>1; int res=0; if(x<=mid)res=max(res,query(lson,x,y)); if(y>mid)res=max(res,query(rson,x,y)); return res;}int main() { //freopen("in.txt","r",stdin); while(~scanf("%d%d%d",&c,&n,&q)) { char s[20]; int l,r,val; build(1,c,1); while(q--) { scanf("%s",s); if(s[0]=='s') { scanf("%d",&l); printf("%d\n",query(1,c,1,l+1,l+1)); } else if(s[0]=='g') { scanf("%d%d%d",&l,&r,&val); Min=INF; if(val==0) { printf("0\n"); continue; } int x=query(1,c,1,l+1,r+1); // printf("x=%d\n",x); if(val>0) { if(n-x>=val) { printf("%d\n",val); updata(1,c,1,l+1,r+1,val); } else { printf("%d\n",n-x); updata(1,c,1,l+1,r+1,n-x); } } else { int v=-val; if(Min>=v) { printf("%d\n",val); updata(1,c,1,l+1,r+1,val); } else { printf("%d\n",-1*Min); updata(1,c,1,l+1,r+1,-1*Min); } } } else { scanf("%d%d",&l,&val); if(val==0) { printf("0\n"); continue; } Min=INF; int x=query(1,c,1,l+1,l+1); if(val>0) { if(n-x>=val) { printf("%d\n",val); updata(1,c,1,l+1,l+1,val); } else { printf("%d\n",n-x); updata(1,c,1,l+1,l+1,n-x); } } else { int v=-val; if(Min>=v) { printf("%d\n",val); updata(1,c,1,l+1,l+1,val); } else { printf("%d\n",-1*Min); updata(1,c,1,l+1,l+1,-1*Min); } } } } } return 0;}
0 0
- CSU 1532: JuQueen(线段树)
- CSU 1532 JuQueen 线段树 lazy 区间最值
- coj--1532: JuQueen+线段树
- JuQueen(线段树 lazy)
- JuQueen
- CSU 1110线段树
- CSU 1098: Happy watering(线段树)
- CSU - 1542 Flipping Parentheses (线段树)
- CSU 1542 Flipping Parentheses(线段树)
- CSU 1553 线段树+尺取法
- csu 1110 RMQ with Shifts 线段树
- 【CSU 1258 维护序列】+ 线段树
- CSU 1809 Parenthesis(RMQ||线段树)
- CSU 1809 Parenthesis (线段树)
- 【线段树】CSU 1414 Query on a Tree
- CSU 1082: 憧憬一下集训 (线段树 扫描线)
- csu 1110 RMQ with Shifts(线段树) 解题报告
- CSU 1555-Inversion Sequence(逆序数还原,线段树实现)
- 异构计算 文章
- 学习Objective-C 高效编程
- 黑马程序员_java语言_设计模式
- _T和_L的区别
- mysql 使用count()统计总结与思考
- CSU 1532: JuQueen(线段树)
- 计算机网络--http代理服务器的设计与实现
- 'Ui::GoToCellDialog::setupUi(QDialog*&)' ui.setupUi(dialog);(C++ GUI Qt4编程在QT5.3下勘误)
- 答辩结束了
- Linux学习笔记3
- Android利用ViewPager实现滑动广告板
- IDF实验室:百密一疏--凯撒加密
- 实现自己的gen.engine和gen.Task
- 显示动画基本属性