1129 - 喵哈哈村的战斗魔法师丶坏坏い月(线段树)@
2017-06-04 08:52
260 查看
1129 - 喵哈哈村的战斗魔法师丶坏坏い月
Time Limit:3s Memory Limit:256MByte
Submissions:343Solved:77
DESCRIPTION
坏坏い月是月大叔的ID,他是一个掌握者772002种魔法的物理系战士,最擅长的技能就是搞事。今天他又要开始搞事了。
给你nn个数,你需要实现一下操作:
l r v ,在[l,r]区间内找到第一个大于等于v的数,输出这个数的下标,如果找不到的话,请输出-1噢
l r v,让[l,r]区间所有数增加v
INPUT
输入第一行包含一个正整数t(1≤t≤100)t(1≤t≤100)
,表示有t组数据对于每组数据:第一行包含两个整数n(1≤n≤100000)n(1≤n≤100000),q(1≤q≤100000)q(1≤q≤100000),表示数的个数,以及询问的个数。第二行包含nn个整数ai(1≤ai≤1000000000)ai(1≤ai≤1000000000)接下来q行,每行四个整数opt(1≤opt≤2),l,r(1≤l≤r≤n),v(1≤v≤1000000000)opt(1≤opt≤2),l,r(1≤l≤r≤n),v(1≤v≤1000000000)
OUTPUT
对于每个询问,输出一行表示答案.
SAMPLE INPUT
1
5 3
1 2 3 4 5
1 1 2 3
2 1 2 3
1 1 2 3
SAMPLE OUTPUT
-1
1
SOLUTION
玲珑杯”ACM比赛 Round #15
Time Limit:3s Memory Limit:256MByte
Submissions:343Solved:77
DESCRIPTION
坏坏い月是月大叔的ID,他是一个掌握者772002种魔法的物理系战士,最擅长的技能就是搞事。今天他又要开始搞事了。
给你nn个数,你需要实现一下操作:
l r v ,在[l,r]区间内找到第一个大于等于v的数,输出这个数的下标,如果找不到的话,请输出-1噢
l r v,让[l,r]区间所有数增加v
INPUT
输入第一行包含一个正整数t(1≤t≤100)t(1≤t≤100)
,表示有t组数据对于每组数据:第一行包含两个整数n(1≤n≤100000)n(1≤n≤100000),q(1≤q≤100000)q(1≤q≤100000),表示数的个数,以及询问的个数。第二行包含nn个整数ai(1≤ai≤1000000000)ai(1≤ai≤1000000000)接下来q行,每行四个整数opt(1≤opt≤2),l,r(1≤l≤r≤n),v(1≤v≤1000000000)opt(1≤opt≤2),l,r(1≤l≤r≤n),v(1≤v≤1000000000)
OUTPUT
对于每个询问,输出一行表示答案.
SAMPLE INPUT
1
5 3
1 2 3 4 5
1 1 2 3
2 1 2 3
1 1 2 3
SAMPLE OUTPUT
-1
1
SOLUTION
玲珑杯”ACM比赛 Round #15
#include<iostream> #include<string> #include<cstring> #include<set> #include<map> #include<algorithm> #include <bits/stdc++.h> using namespace std; const int N = 1e5+10; typedef long long LL; struct node { LL cmax; }sum[N<<2]; LL lazy[N<<2], a ; void pushdown(int rt) { if(lazy[rt]!=0) { sum[rt<<1].cmax+=lazy[rt]; sum[rt<<1|1].cmax+=lazy[rt]; lazy[rt<<1]+=lazy[rt],lazy[rt<<1|1]+=lazy[rt]; lazy[rt]=0; } return ; } void pushup(int rt) { sum[rt].cmax=max(sum[rt<<1].cmax,sum[rt<<1|1].cmax); return ; } void build(int l,int r,int rt) { if(l==r) { sum[rt].cmax=sum[rt].cmin=a[l]; return ; } sum[rt].cmax=0; lazy[rt]=0; int mid=(l+r)/2; build(l,mid,rt<<1); build(mid+1,r,rt<<1|1); pushup(rt); return ; } void update(int l,int r,int L,int R,int rt,LL w) { if(L>=l&&R<=r) { sum[rt].cmax+=w; lazy[rt]+=w; return ; } pushdown(rt); int mid=(L+R)/2; if(l<=mid) update(l,r,L,mid,rt<<1,w); if(r>mid) update(l,r,mid+1,R,rt<<1|1,w); pushup(rt); return ; } int query(int l,int r,int L,int R,int rt,LL w) { if(sum[rt].cmax<w) return -1; if(L==R) return L; pushdown(rt); pushup(rt); int x=-1,y=-1; int mid=(L+R)/2; if(l<=mid) x=query(l,r,L,mid,rt<<1,w); if(x!=-1) return x; if(r>mid) y=query(l,r,mid+1,R,rt<<1|1,w); return y; } int main() { int t; scanf("%d", &t); while(t--) { int n, q; scanf("%d %d", &n, &q); memset(sum,0,sizeof(sum)); memset(lazy,0,sizeof(lazy)); for(int i=1;i<=n;i++) scanf("%lld", &a[i]); build(1,n,1); while(q--) { int opt, l, r; LL v; scanf("%d %d %d %lld",&opt,&l,&r,&v); if(opt==1) printf("%d\n",query(l,r,1,n,1,v)); else update(l,r,1,n,1,v); } } return 0; }
相关文章推荐
- ifrog 1129 喵哈哈村的战斗魔法师丶坏坏い月 线段树||分块
- 1129 - 喵哈哈村的战斗魔法师丶坏坏い月 线段树
- 玲珑学院OJ 1129 喵哈哈村的战斗魔法师丶坏坏い月【线段树查询最左端大于某个数的操作】
- 玲珑学院1129 - 喵哈哈村的战斗魔法师丶坏坏い月(线段树)
- 玲珑学院OJ 1129 喵哈哈村的战斗魔法师丶坏坏い月【暴力分块】
- 玲珑杯1129-喵哈哈村的战斗魔法师丶坏坏い月
- LonLife-ACM 1129 - 喵哈哈村的战斗魔法师丶坏坏い月
- 玲珑OJ 1129 - 喵哈哈村的战斗魔法师丶坏坏い月
- “玲珑杯”线上赛 Round #15 河南专场 H -- 喵哈哈村的战斗魔法师丶坏坏い月 分块/线段树
- 玲珑学院1129 - 喵哈哈村的战斗魔法师丶坏坏い月(分块)
- 1129 - 喵哈哈村的战斗魔法师丶坏坏い月(河南专场)
- qscoj:喵哈哈村的冒菜店(线段树区间合并)
- 喵哈哈村的魔法考试 Round #2 (Div.2) B.喵哈哈村的种花魔法 线段树 区间更新 单点查询
- 喵哈哈村的冒菜店(线段树 区间合并)
- 喵哈哈村的种花魔法(线段树(区间更新,单点查询),前缀和(单点更新,区间查询))
- 喵哈哈村的冒菜店-(线段树的区间合并)
- HDU-1166 敌兵布阵 线段树
- Problem 2136 取糖果---FUOJ (线段树+维护)
- BZOJ_3038_上帝造题的七分钟2_线段树
- ZOJ3696-A Simple Tree Problem 线段树