Rt,我第一次用了 C++11,第二次用了 C++14(GCC9)O2,结果第一次 T 的很惨,第二次直接 Accepted 了,这是为啥?
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;
}