树状数组TLE求调
查看原帖
树状数组TLE求调
473401
zcxnb楼主2024/12/26 15:22
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1005,mod=1e9+7;
int T,n,m,num,cnt;
int a[N],b[N],tr[N][N];
map<int,int>mp;
int lowbit(int x){
	return x&(-x);
}
void add(int s,int x,int v){
	for(;x<=cnt+1;x+=lowbit(x)){
		tr[s][x]+=v;
		tr[s][x]%=mod;
	}
}
int query(int s,int x){
	int res=0;
	for(;x;x-=lowbit(x)){
		res+=tr[s][x];
		res%=mod;
	}
	return res;
}
signed main(){
	scanf("%lld",&T);
	while(T--){
		num++;
		scanf("%lld%lld",&n,&m);
		mp.clear();
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				tr[j][i]=0;
			}
		}
		for(int i=1;i<=n;i++){
			scanf("%lld",&a[i]);
			b[i]=a[i];
		}
		sort(b+1,b+1+n);
		cnt=unique(b+1,b+1+n)-b-1;
		for(int i=1;i<=cnt;i++){
			mp[b[i]]=i+1;
		}
		for(int i=1;i<=n;i++){
			a[i]=mp[a[i]];
		}
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				if(j==1){
					add(1,a[i],1);
				}
				else{
					int z=query(j-1,a[i]-1);
					add(j,a[i],z);
				}
			}
		}
		printf("Case #%lld: %lld\n",num,query(m,cnt+1));
	}
}
2024/12/26 15:22
加载中...