【线段树】 HDOJ 4417 Super Mario

来源:互联网 发布:windows激活密匙在哪里 编辑:程序博客网 时间:2024/05/23 13:17

线段树水题。。。一开始query写错了。。TLE了好久。。

#include <iostream>  #include <queue>  #include <stack>  #include <map>  #include <set>  #include <bitset>  #include <cstdio>  #include <algorithm>  #include <cstring>  #include <climits>  #include <cstdlib>#include <cmath>#include <time.h>#define maxn 100005#define maxm 40005#define eps 1e-10#define mod 1000000007#define INF 999999999#define lowbit(x) (x&(-x))#define mp mark_pair#define ls o<<1#define rs o<<1 | 1#define lson o<<1, L, mid  #define rson o<<1 | 1, mid+1, R  typedef long long LL;//typedef int LL;using namespace std;LL powmod(LL a, LL b){LL res=1,base=a;while(b){if(b%2)res=res*base%mod;base=base*base%mod;b/=2;}return res;}void scanf(int &__x){__x=0;char __ch=getchar();while(__ch==' '||__ch=='\n')__ch=getchar();while(__ch>='0'&&__ch<='9')__x=__x*10+__ch-'0',__ch = getchar();}LL gcd(LL _a, LL _b){if(!_b) return _a;else return gcd(_b, _a%_b);}// headstruct point{int v, p;}po[maxn];struct node{int a, b, c, id;}op[maxn];int sum[maxn<<2];int res[maxn];int p, ql, qr, n, m;int cmp1(point a, point b){return a.v < b.v;}int cmp2(node a, node b){return a.c < b.c;}void read(void){memset(sum, 0, sizeof sum);scanf("%d%d", &n, &m);for(int i = 1; i <= n; i++) {scanf("%d", &po[i].v);po[i].p = i;}for(int i = 1; i <= m; i++) scanf("%d%d%d", &op[i].a, &op[i].b, &op[i].c), op[i].id = i, op[i].a++, op[i].b++;}void updata(int o, int L, int R){if(L == R) {sum[o]++;return;}int mid = (L+R)>>1;if(p <= mid) updata(lson);else updata(rson);sum[o] = sum[ls] + sum[rs];}int query(int o, int L, int R){if(ql <= L && qr >= R) return sum[o];int mid = (L+R)>>1, ans = 0;if(ql <= mid) ans += query(lson);if(qr > mid) ans += query(rson);return ans;}void work(void){sort(po+1, po+n+1, cmp1);sort(op+1, op+m+1, cmp2);for(int i = 1, j = 1; i <= m; i++) {while(j <= n && po[j].v <= op[i].c) p = po[j++].p, updata(1, 1, n);ql = op[i].a, qr = op[i].b;res[op[i].id] = query(1, 1, n);}for(int i = 1; i <= m; i++) printf("%d\n", res[i]);}int main(void){int _, __;while(scanf("%d", &_)!=EOF) {__ = 0;while(_--) {read();printf("Case %d:\n", ++__);work();}}return 0;}


0 0
原创粉丝点击