求助hdu 6406 Taotao Picks Apples
  • 板块学术版
  • 楼主Xhesika_Frost
  • 当前回复1
  • 已保存回复1
  • 发布时间2020/8/27 10:56
  • 上次更新2023/11/6 19:12:18
查看原帖
求助hdu 6406 Taotao Picks Apples
133116
Xhesika_Frost楼主2020/8/27 10:56

T飞了

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
long long dp[100001];
long long t;
long long n,m;
long long h[100001];
long long use[100001];
long long last[100001];
long long anss[100001];
long long x,y;
long long dfs(long long x,long long l){
	if(x==n+1)
	return 0;
	if(l<h[x]){
	if(use[x])
	return dp[x];	
	use[x]=1;
	return dp[x]=dfs(x+1,h[x])+1;
	}
	return dfs(x+1,l);
}
long long ans=0;
long long tmp;
long long solve(long long x,long long y){
	ans=anss[x-1];
	long long er;
	if(y>last[x-1]){
	ans++;
	 er=upper_bound(h+x+1,h+1+n+1,y)-h;
	ans+=dp[er]; 
	}else{
	 er=upper_bound(h+x+1,h+1+n+1,last[x-1])-h;
	ans+=dp[er];
	}
	//cout<<er<<endl;
	return ans;
}
int main(){
	scanf("%lld",&t);
	while(t--){
		scanf("%lld%lld",&n,&m);
		memset(h,0,sizeof(h));
		for(long long i=1;i<=n;++i){
			scanf("%lld",&h[i]); 
		}
		h[n+1]=999999999; 
		memset(use,0,sizeof(use));
		memset(dp,0,sizeof(dp));
		memset(anss,0,sizeof(anss));
		memset(last,0,sizeof(last));
		if(n==1){
			for(int i=1;i<=m;++i){
				cout<<1<<endl;
			}
			continue;
		}
		for(long long i=1;i<=n;++i)
		dfs(i,0);
		for(long long i=1;i<=n;++i){
			if(i==1){
				last[i]=h[i];
				anss[i]=1; 
				continue;
			}
			if(h[i]>last[i-1]){
				last[i]=h[i];
				anss[i]=anss[i-1]+1;
			}else{
				anss[i]=anss[i-1];
				last[i]=last[i-1];
			}
		}
		for(long long i=1;i<=m;++i){
			scanf("%lld%lld",&x,&y);
			cout<<solve(x,y)<<endl; 
		}
	}
	return 0;
}
2020/8/27 10:56
加载中...