为啥不开 O2 就会 TLE?
查看原帖
为啥不开 O2 就会 TLE?
995753
__Octhyccc__楼主2024/11/23 15:08

Rt,我第一次用了 C++11,第二次用了 C++14(GCC9)O2,结果第一次 T 的很惨,第二次直接 Accepted 了,这是为啥?

TLE AC

Code:

#include<bits/stdc++.h>
using namespace std;
constexpr int N=1e5+7;
constexpr int M=3e3+7;
struct Edge{
	int u,v,nxt;
}E[N];
int in[M],allow[M],head[M],a[M];
int n,k,m,top,cnt,ans;
queue<int>q;
void init(){
	cnt=top=ans=0;
	memset(head,0,sizeof(head));
	memset(in,0,sizeof(in));
	while(!q.empty())q.pop();
	return;
}
void add(int u,int v){
	in[v]++,E[++top].u=u;
	E[top].v=v,E[top].nxt=head[u];
	head[u]=top;
	return;
}
bool check(int l,int r){
	init();
	for(int i=l+1;i<=r;i+=2){
		add(a[i-1],a[i]);
		if(i+1<=r)add(a[i+1],a[i]);
	}
	for(int i=1;i<=k;i++){
		if(!in[i])q.push(i);
	}
	while(!q.empty()){
		int u=q.front();
		cnt++,q.pop();
		for(int i=head[u];i;i=E[i].nxt){
			int v=E[i].v;
			if(!--in[v])q.push(v);
		}
	}
	return cnt==k;
}
int main(){
	scanf("%d%d%d",&n,&k,&m);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	for(int i=1;i<=n;i++){
		int l=i-1,r=n+1;
		while(l+1!=r){
			int mid=(l+r)>>1;
			if(check(i,mid))l=mid;
			else r=mid;
		}
		allow[i]=max(l,i);
	}
	for(int i=1;i<=m;i++){
		int l=0,r=0;
		scanf("%d%d",&l,&r);
		r<=allow[l]?puts("YES"):puts("NO");
	}
	return 0;
}
2024/11/23 15:08
加载中...