WA求调
查看原帖
WA求调
763878
Jerry_heng楼主2025/1/8 12:05

大的数据过了,小的数据WA了

//2025-01-08 08:49:43
#include<bits/stdc++.h>
#define db double
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define mkp make_pair
#define pii pair<int,int>
using namespace std;
bool MBE;
inline int read(){
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-f;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f; 
}
const int mxn=2e5+10;
bool tree1[mxn<<2];
int cnt,tot,dep[mxn],id[mxn],siz[mxn],dfn[mxn],id2[mxn],m,n,a[mxn],tag[mxn<<2],b[mxn];
queue<int>q;
vector<int>E[mxn];
set<int>st[mxn],s[mxn];
void dfs(int u,int f){
	dep[u]=dep[f]+1;
	dfn[u]=++tot,id[tot]=u;
	siz[u]=1;
	for(int v:E[u]){
		dfs(v,u);
		siz[u]+=siz[v];
	}
}
bool query1(int o,int l,int r,int L,int R){
	if(L<=l&&r<=R)return tree1[o];
	int mid=(l+r)>>1;bool res=0;
	if(L<=mid)res|=query1(o*2,l,mid,L,R);
	if(R>mid)res|=query1(o*2+1,mid+1,r,L,R);
	return res;
}
void update1(int o,int l,int r,int pos){
	if(l==r){
		tree1[o]=1;
		return;
	}
	int mid=(l+r)>>1;
	if(pos<=mid)update1(o*2,l,mid,pos);
	else update1(o*2+1,mid+1,r,pos);
	tree1[o]=1;
}
void change(int o,int x){
	tag[o]=max(tag[o],x);
}
int query2(int o,int l,int r,int pos){
	if(l==r)return tag[o];
	int mid=(l+r)>>1;
	if(pos<=mid)return max(tag[o],query2(o*2,l,mid,pos));
	else return max(tag[o],query2(o*2+1,mid+1,r,pos));
}
void update2(int o,int l,int r,int L,int R,int val){
	if(L<=l&&r<=R){
		tag[o]=max(tag[o],val);
		return;
	}
	int mid=(l+r)>>1;
	if(L<=mid)update2(o*2,l,mid,L,R,val);
	if(R>mid)update2(o*2+1,mid+1,r,L,R,val);
}
signed main(){
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    #endif
    n=read();
    for(int i=2;i<=n;i++){
    	int x=read();
    	E[x].eb(i);
    }
    q.push(1);
    while(!q.empty()){
    	int u=q.front();q.pop();
    	a[u]=++tot;id2[tot]=u;
    	for(int v:E[u])
    		q.push(v);
    }
    tot=0;
    dfs(1,0);
    for(int i=1;i<=n;i++)
    	st[dep[i]].insert(dfn[i]);
    m=read();
    for(int i=1;i<=m;i++){
    	int u=read(),k=read();
    	int d=dep[u]+k;
    	auto it=st[d].upper_bound(dfn[u]);
    	int l=*it;
    	it=st[d].upper_bound(dfn[u]+siz[u]-1);
    	it--;
    	int r=*it;
    	l=a[id[l]],r=a[id[r]];
    	if(query1(1,1,n,l,r))continue;
    	update1(1,1,n,l),update1(1,1,n,r);
    	cnt++;
    	for(int j=l;j<=r;j++)
    		s[cnt].insert(id2[j]);
    }
    int mn=n;
    for(int i=1;i<=cnt;i++){
    	int las=1,mx=0;
    	for(int j:s[i]){
    		mx=max(mx,j);
    		update2(1,1,n,las,j,j);
       		las=j+1;
    	}
    	mn=min(mn,mx);
    }
    int res=n+1,resl=0;
    for(int i=1;i<=mn;i++){
    	int p=query2(1,1,n,i);
    	if(p-i+1<res)res=p-i+1,resl=i;
    }
    printf("%d %d\n",resl,res+resl-1);
    bool MED;
    cerr<<(&MED-&MBE)/1048576.0<<" MB, "<<1000*clock()/CLOCKS_PER_SEC<<" ms\n";
    return 0;
}
2025/1/8 12:05
加载中...