社区讨论

关于 P4093 的 BIT 套 map 写法

学术版参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mll1gl81
此快照首次捕获于
2026/02/13 23:24
6 天前
此快照最后确认于
2026/02/17 09:50
前天
查看原帖
我的代码是长这样的:
CodeCPP
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) ((x)&-(x))

constexpr int N=1e5+9;
int n,m,ans;
struct node{
	int x,y_1,y_2;
}a[N];
map<int,int> tr[N];

void insert(int x,int y,int k){
	for(;x<N;x+=lowbit(x)){
		auto it=tr[x].upper_bound(y);
		if(it!=tr[x].begin()&&prev(it)->second>=k) continue;
		while(it!=tr[x].end()&&it->second<=k) it=tr[x].erase(it);
		tr[x][y]=k;
	}
}

int range_max(int x,int y){
	int res=0;
	for(;x;x-=lowbit(x)){
		auto it=tr[x].upper_bound(y);
		if(it==tr[x].begin()) continue;
		res=max(res,prev(it)->second);
	}
	return res;
}

signed main(){
	cin.tie(0)->sync_with_stdio(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i].x;
		a[i].y_1=a[i].y_2=a[i].x;
	}
	for(int i=1,x,y;i<=m;i++){
		cin>>x>>y;
		a[x].y_1=min(a[x].y_1,y);
		a[x].y_2=max(a[x].y_2,y);
	}
	for(int i=1;i<=n;i++){
		int res=range_max(a[i].y_1,a[i].x)+1;
		ans=max(ans,res);
		insert(a[i].x,a[i].y_2,res);
	}
	cout<<ans;
	return 0;
}
我希望它在数据随机的情况的期望复杂度应该是 Θ(nlognloglogn)\Theta(n\log{n}\log{\log{n}}),但是我没有证据(并且它跑得也不是很快)。
不知道有没有人能证明一下()

回复

2 条回复,欢迎继续交流。

正在加载回复...