TLE 90求助
查看原帖
TLE 90求助
234224
青鸟_Blue_Bird楼主2020/10/29 17:03

RT, 蒟蒻已经卡了一下午了,不敢再交了(怕被封号)

求助巨佬们,哪里写慢了

#include <bits/stdc++.h>
using namespace std;
#define N 300005
const int inf = 2e9; 

template <class T>
inline void read(T& a){
	T x = 0, s = 1;
	char c = getchar();
	while(!isdigit(c)){ if(c == '-') s = -1; c = getchar(); }
	while(isdigit(c)){ x = x * 10 + (c ^ '0'); c = getchar(); }
	a = x * s;
	return ;
}

struct tu{
	
	public:
		struct node{
			int u, v, next;
		} t[N << 2];
		int f[N];
	
	public: 
		int bian;
		inline void add(int u, int v){
			this -> bian++; 
			t[bian] = (node){u, v, f[u]}, f[u] = this -> bian;
			return ; 
		}	
	
	tu(int bian = 0){
		this -> bian = bian;
		return ; 
	}

} T, G; 

int n , k;
char s[N]; 
int h[N], w[N]; 

inline int min(int a , int b){return a < b ? a : b ;}
inline int max(int a , int b){return a > b ? a : b ;}

int dfn[N], low[N];
int stac[N], top = 0;
bool vis[N];
int siz[N], scc[N], cnt = 0, id = 0;

void tarjan(int now){
	dfn[now] = low[now] = ++id;
	stac[++top] = now;
	vis[now] = 1;
	for(int i = T.f[now]; i; i = T.t[i].next){
		int v = T.t[i].v;
		if(!dfn[v]){
			tarjan(v);
			low[now] = min(low[now], low[v]); 
		}
		else if(vis[v]) low[now] = min(low[now], dfn[v]); 
	}
	if(dfn[now] == low[now]){
		int cur;
		cnt++; 
		do{
			cur = stac[top--];
			scc[cur] = cnt;
			siz[cnt] += w[cur];  // 排除超级源点的影响 
			vis[cur] = 0; 
		} while(cur != now); 
	}
	return ; 
}

int ans = 0;
int d[N]; 
int q[N]; 
void spfa(int s){
	int head = 0, tail = -1; 
	q[++tail] = s; 
	vis[s] = 1;
	d[s] = siz[s]; 
	while(head <= tail){
		int now = q[head % N];  head++; 
		vis[now] = 0; 
		for(int i = G.f[now]; i; i = G.t[i].next){
			int v = G.t[i].v;
			if(d[v] < d[now] + siz[v]){
				d[v] = d[now] + siz[v];
				if(!vis[v]) q[++tail % N] = v, vis[v] = 1; 
			}
		}
	}
	return ; 
}
int main(){
	read(n), read(k);
	for(int i = 1; i <= n; ++i)
		read(h[i]), w[i] = 1;
	w[n + 1] = 0; 
	h[0] = h[n + 1] = inf; 
	for(int i = 1; i <= n; ++i){
		if(h[i - 1] <= h[i]) T.add(i, i - 1);
		if(h[i + 1] <= h[i]) T.add(i, i + 1); 
	}
	for(int i = 1; i <= n; ++i)
		T.add(n + 1, i);
		
	scanf("%s", s + 1);
	for(int i = 1; i <= n; ++i)
		if(s[i] == 'T') T.add(i, n + 1);
	tarjan(k); 
	for(int i = 1; i <= T.bian; ++i){
		int u = T.t[i].u, v = T.t[i].v;
		if(scc[u] != scc[v] && scc[u] && scc[v])  // 可以到达的点才加入新图 
			G.add(scc[u], scc[v]); 
	}
	memset(vis, 0, sizeof(vis)); 
	spfa(scc[k]); 
	for(int i = 1; i <= cnt; ++i)
		ans = max(ans, d[i]); 
	printf("%d\n", ans); 
	return 0; 
}

2020/10/29 17:03
加载中...