设为首页 加入收藏

TOP

HDU 多校第三场 (三)
2014-11-23 21:42:27 来源: 作者: 【 】 浏览:16
Tags:HDU 第三
].add = 0;
}
}

void build(int l,int r,int x) {
tree[x].l = l;
tree[x].r = r;
tree[x].mid = (l+r) >> 1;
tree[x].maxx = 0;
tree[x].add = 0;
if(l == r) return ;
build(l,tree[x].mid,ll(x));
build(tree[x].mid+1,r,rr(x));
}

void update(int l,int r,int x,int t) {
if(l <= tree[x].l && r >= tree[x].r) {
tree[x].add = max(t,tree[x].add);
tree[x].maxx = max(tree[x].maxx,tree[x].add);
return ;
}
down(x);
if(r <= tree[x].mid) update(l,r,ll(x),t);
else if(l > tree[x].mid) update(l,r,rr(x),t);
else {
update(l,tree[x].mid,ll(x),t);
update(tree[x].mid+1,r,rr(x),t);
}
up(x);
}

int query(int l,int x) {
if(tree[x].l == tree[x].r) {
return tree[x].maxx;
}
down(x);
if(l > tree[x].mid) return query(l,rr(x));
else return query(l,ll(x));
}
int main() {
int T;
cin >> T;
init();
while( T--) {
RD(n);
build(1,n,1);
memset(pos,0,sizeof(pos));
for(int i=1; i<=n; i++) RD(a[i]);
RD(q);
for(int i=1; i<=q; i++) {
RD(ask[i].l);
RD(ask[i].r);
ask[i].num = i;
}
sort(ask+1,ask+1+q,cmp);
int cnt = 1,flag = 0;
for(int i=1; i<=n; i++) {
for(int j=head[a[i]]; j != -1; j = v[j].next) {
int t = v[j].e;
if(pos[t] != 0) update(1,pos[t],1,t);
pos[t] = i;
}
while(ask[cnt].r <= i) {
print[ask[cnt].num] = query(ask[cnt].l,1);
cnt++;
if(cnt > q) {
flag = 1;
break;
}
}
if(flag) break;
}
for(int i=1; i<=q; i++) OT(print[i]),puts("");
}
return 0;
}

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇[leetcode]N-Queens 下一篇HDU 4622 多校第三场1002 后缀自..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Linux 系统监控 的完 (2025-12-27 08:52:29)
·一口气总结,25 个 L (2025-12-27 08:52:27)
·【总结】100个最常用 (2025-12-27 08:52:22)
·有没有哪些高效的c++ (2025-12-27 08:20:57)
·Socket 编程时 Accep (2025-12-27 08:20:54)