rt,站外题,这个
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5+10;
const int INF = 0x7fffffff;
int n,T;
struct node{
int l,r,mx;
}tree[MAXN << 2];
void lazy(int k)
{
tree[k].mx += 1;
}
void build(int k,int l,int r)
{
tree[k].l = l;
tree[k].r = r;
if(l == r)
{
tree[k].mx = 0;
return;
}
int mid,lc,rc;
mid = (l + r) / 2; // 划分点
lc = k * 2; // 左孩子存储下标
rc = k * 2 + 1; // 右孩子存储下标
build(lc,l,mid);
build(rc,mid + 1,r);
tree[k].mx = max(tree[lc].mx,tree[rc].mx);
}
void print(int k)
{
if(tree[k].l && tree[k].r)
{
cout << k << " " << tree[k].l << " " << tree[k].r << " " << tree[k].mx << endl;
print(k << 1);
print((k << 1) + 1);
}
}
void update(int k,int l,int r)//将a[i]改为v
{
if(tree[k].l >= l && tree[k].r <= r)
return lazy(k);
//pushdown(k);
int mid,lc,rc;
mid = (tree[k].l + tree[k].r) / 2;
lc = k * 2;
rc = k * 2 + 1;
if(l <= mid)
update(lc,l,mid);
if(r > mid)
update(rc,mid + 1,r);
tree[k].mx = max(tree[lc].mx,tree[rc].mx);
}
int query(int k,int l,int r)// 求区间[l,r]的最值
{
if(tree[k].l >= l && tree[k].r <= r)
return tree[k].mx;
//pushdown(k);
int mid,lc,rc;
mid = (tree[k].l + tree[k].r) / 2;//划分点
lc = k * 2; // 左孩子存储下标
rc = k * 2 + 1; // 右孩子存储下标
int Max = -INF;
if(l <= mid)
Max = max(Max,query(lc,l,mid));
if(r > mid)
Max = max(Max,query(rc,mid + 1,r));
return Max;
}
int main()
{
scanf("%d",&T);
for(int i = 1;i <= T;i++)
{
scanf("%d",&n);
int newl[MAXN],newr[MAXN];
int tmp[MAXN * 2],cnt = 0,maxr = -1;
for(int i = 0;i < n;i++)
{
scanf("%d%d",&newl[i],&newr[i]);
tmp[cnt++] = newl[i];
tmp[cnt++] = newr[i];
}
sort(tmp,tmp+cnt);
cnt = unique(tmp,tmp+cnt)-tmp;
for(int i = 0;i < n;i++)
{
newl[i] = lower_bound(tmp,tmp+cnt,newl[i]) - tmp + 1;
newr[i] = lower_bound(tmp,tmp+cnt,newr[i]) - tmp + 1;
maxr = max(newl[i],max(newr[i],maxr));
}
build(1,1,maxr);
for(int i = 0;i < n;i++)
{ //cout << "e:" << newl[i] << " " << newr[i] << endl;
update(1,newl[i],newr[i]);
}
//print(1);
printf("/*out :*/%d\n",query(1,1,n));
}
return 0;
}
悬赏一关注球球了