求助时间复杂度,第五个点T了
查看原帖
求助时间复杂度,第五个点T了
374851
lian13817981484楼主2023/11/13 12:09
#include<cstdio>
#include<map>
using namespace std;
#define ll long long
inline int read(){
	int ans = 0;
	char c = getchar();
	while(c < '0' || c > '9')c = getchar();
	while('0' <= c && c <= '9'){
		ans = (ans<<3)+(ans<<1)+c-'0';
		c = getchar();
	}
	return ans;
}
inline void write(ll x){
	if(x == 0)return;
	write(x/10);
	putchar(x%10+'0');
}
int t,n,arr[300005],dp[300005],nxt[300005],pos;
ll ans = 0;
map<int,int> mp[300005],mp2; 
int main(){
	arr[0] = -1;
	t = read();
	while(t--){
		n = read();
		for(int i = 1;i <= n;i++){
			arr[i] = read();
			mp[i].clear();
			dp[i] = 0;
			nxt[i] = -1;
		}
		dp[n+1] = 0;
		nxt[n+1] = -1;
		mp[n+1].clear();
		for(int i = n;i >= 1;i--){
			if(mp[i+1].count(arr[i]) > 0){
				pos = mp[i+1][arr[i]];
				nxt[i] = pos;
				mp2 = mp[i];
				mp[i] = mp[pos+1];
				mp[pos+1] = mp2;
				if(pos < n)mp[i][arr[pos+1]] = pos+1;
			}
			mp[i][arr[i]] = i;
		}
		ans = 0;
		for(int i = n;i >= 1;i--){
			if(nxt[i] == -1)continue;
			dp[i] = dp[nxt[i]+1]+1;
			ans += dp[i];
		}
		if(ans == 0)putchar('0');
		else write(ans);
		putchar('\n');
	}
	return 0;
}

快读快些都是后面加进来的,没用,求条

2023/11/13 12:09
加载中...