标签:
#pragma comment(linker, "/STACK:10240000,10240000") #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include<map> using namespace std; const int N = 1e6+10, M = 30005, mod = 1e9+7, inf = 0x3f3f3f3f; typedef long long ll; //不同为1,相同为0 map< pair< int, pair< int,int> > ,int> mp; int T,a[N],n,m,b[N],c,C[N],nex[N],p[N],H[N]; struct data{int l,r,id,ans;}Q[N]; int cmp1(data a,data b) {if(a.l==b.l) return a.r<b.r;else return a.l<b.l;} int cmp2(data a,data b) {return a.id<b.id;} int lowbit(int x) { return x&(-x); } void add(int x, int add) { for (; x <= n; x += lowbit(x)) { C[x] += add; } } int sum(int x) { int s = 0; for (; x > 0; x -= lowbit(x)) { s += C[x]; } return s; } int main() { scanf("%d",&T); while(T--) { mp.clear(); memset(H,0,sizeof(H)); memset(p,0,sizeof(p)); memset(b,-1,sizeof(b)); memset(C,0,sizeof(C));memset(nex,0,sizeof(nex)); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]), b[i] = -1,nex[i] = 0; int k = 1; for(int i=3;i<=n;i++) { if(a[i]>=a[i-1]&&a[i-1]>=a[i-2]) { if(mp[make_pair(a[i-2],make_pair(a[i-1],a[i]))]) b[i] = mp[make_pair(a[i-2],make_pair(a[i-1],a[i]))]; else b[i] = k,mp[make_pair(a[i-2],make_pair(a[i-1],a[i]))] = k,H[k] = 1, k++; } else b[i] = -1; } for(int i=n;i>=1;i--) if(b[i]!=-1) nex[i]=p[b[i]],p[b[i]]=i; for(int i=1;i<k;i++) add(p[i],1); int q; scanf("%d",&q); for(int i=1;i<=q;i++) { scanf("%d%d",&Q[i].l,&Q[i].r);Q[i].id = i; } sort(Q+1,Q+q+1,cmp1); int l = 1; for(int i=1;i<=q;i++) { while(l<Q[i].l+2) { if(nex[l] ) add(nex[l],1);l++; } if(Q[i].l+2>Q[i].r) Q[i].ans = 0; else Q[i].ans = sum(Q[i].r) - sum(Q[i].l+2-1); } sort(Q+1,Q+q+1,cmp2); for(int i=1;i<=q;i++) { printf("%d\n",Q[i].ans); } } return 0; }
HDU 5654 xiaoxin and his watermelon candy 离线树状数组
标签:
原文地址:http://www.cnblogs.com/zxhl/p/5336850.html