社区讨论

TLE最后一个点,树状数组为什么会被卡啊

P4113[HEOI2012] 采花参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@lqxdb57n
此快照首次捕获于
2024/01/03 13:58
2 年前
此快照最后确认于
2024/01/03 16:49
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=2000005;
vector<int> task[N],tasid[N];
vector<int> nums[N];
int len[N];
int n,c,m;
int a[N],tj[N];
int tre[N];
inline void upd(int p,int v){
	while(p<=n){
		tre[p]+=v;
		p+=(p&(-p));
	}
}
inline int que(int p){
	int ans=0;
	while(p){
		ans+=tre[p];
		p-=(p&(-p));
	}
	return ans;
}
int output[N];
int all;
int main(){
	ios::sync_with_stdio(0);cin.tie(0);
	cin>>n>>c>>m;
	for(int i=1;i<=n;i++)cin>>a[i],nums[a[i]].push_back(i);
	for(int i=1;i<=m;i++){
		int l,r;
		cin>>l >>r;
		task[r].push_back(l);
		tasid[r].push_back(i);
	}
	for(int i=1;i<=n;i++){
		len[a[i]]++;
		if(len[a[i]]==2)upd(nums[a[i]][0],1),all++;
		if(len[a[i]]>2)upd(nums[a[i]][len[a[i]]-3],-1),upd(nums[a[i]][len[a[i]]-2],1);
		
		for(int j=0;j<task[i].size();j++)output[tasid[i][j]]=all-que(task[i][j]-1);
		
	}
	for(int i=1;i<=m;i++)cout<<output[i]<<"\n";
	return 0;
} 

回复

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

正在加载回复...