问题标题: 洛谷:陈年“毒瘤”世纪老题WA20分求调

0
0
已解决
谈睿
谈睿
新手天翼
新手天翼

rt,“陈年”“世纪老题”是因为我调了一学期+一寒假没调出来,“毒瘤”是因为豆包、文心、百度AI、手搓对拍程序,没一个找出来反例。

题目传送门

之前找到过错误点,也改正了,但是从古至今都是20分没变,并且都是只有#12、#13、#14、#15四个测试点对。

代码如下:(**山代码见谅,不保证最简)(刷题求解能复制代码吗?不能的话代码重发到代码分享里。)

#include<bits/stdc++.h>
#define ing long long
using namespace std;
struct node{
	int l,r;
}a[100005];
int T,n,u,v;
int f[100005],cnt;
int pos[100005];
int min_f[100005];
int size[100005];
int dfs(int root){
	if(root==0) return 0;
	f[++cnt]=root;
	pos[root]=cnt;
	return size[root]=dfs(a[root].l)+dfs(a[root].r)+1;
}
signed main(){
	cin>>T;
	while(T--){
        bool flag=1;
        cnt=0;
        memset(f,0,sizeof(f));
        memset(min_f,0,sizeof(min_f));
        memset(pos,0,sizeof(pos));
        memset(size,0,sizeof(size));
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>a[i].l>>a[i].r; 
		}
		dfs(1);
		min_f[n+1]=0x3f3f3f3f;
		for(int i=n;i>=1;i--) min_f[i]=min(min_f[i+1],f[i]);
        int t=0;
		for(int i=1;i<=n;i++){
			if(a[f[i]].r&&a[f[i]].l>a[f[i]].r){
				int tmp=0;
				for(int j=pos[a[f[i]].r];j<=n;j++){
					if(!a[f[j]].l){
						if(tmp&&f[j]>a[f[i]].l){
							break;
						}
						tmp=j;
					}
				}
                if(tmp!=0){
                	for(int j=1;j<=i;j++) cout<<f[j]<<" ";
    				for(int j=pos[a[f[i]].r];j<=tmp;j++) cout<<f[j]<<" ";
    				for(int j=pos[a[f[i]].l];j<pos[a[f[i]].r];j++) cout<<f[j]<<" ";
    				for(int j=tmp+1;j<=n;j++) cout<<f[j]<<" ";
                    flag=0;
    				break;    
                }

			}else if(!a[f[i]].l&&f[i+1]>min_f[i+1]){
                if(f[i+size[f[i+1]]+1]!=min_f[i+1]){
    				for(int j=1;j<=i;j++) cout<<f[j]<<" ";
    				for(int j=pos[min_f[i+1]];j<pos[min_f[i+1]]+size[min_f[i+1]];j++) cout<<f[j]<<" ";
    				for(int j=i+1;j<pos[min_f[i+1]];j++) cout<<f[j]<<" ";
    				for(int j=pos[min_f[i+1]]+size[min_f[i+1]];j<=n;j++) cout<<f[j]<<" ";
                    flag=0;
                    break;    
                }else{
                    int tmp=0;
    				for(int j=i+size[f[i+1]]+1;j<=n;j++){
    					if(!a[f[j]].l){
    						if(tmp&&f[j]>f[i+1]){
    							break;
    						}
    						tmp=j;
    					}
    				}
                    if(tmp!=0){
                    	for(int j=1;j<=i;j++) cout<<f[j]<<" ";
        				for(int j=i+size[f[i+1]]+1;j<=tmp;j++) cout<<f[j]<<" ";
        				for(int j=i+1;j<=i+size[f[i+1]];j++) cout<<f[j]<<" ";
        				for(int j=tmp+1;j<=n;j++) cout<<f[j]<<" ";
                        flag=0;
        				break;    
                    }
                }
			}else if(!a[f[i]].r&&a[f[i]].l){
                if(a[f[i]].l>f[i+size[a[f[i]].l]+1]){
                    int tmp=0;
    				for(int j=i+size[a[f[i]].l]+1;j<=n;j++){
    					if(!a[f[j]].l){
    						if(tmp&&f[j]>a[f[i]].l){
    							break;
    						}
    						tmp=j;
    					}
    				}
                    if(tmp!=0){
        				for(int j=1;j<=i;j++) cout<<f[j]<<" ";
        				for(int j=pos[a[f[i]].l]+size[a[f[i]].l];j<=tmp;j++) cout<<f[j]<<" ";
        				for(int j=pos[a[f[i]].l];j<pos[a[f[i]].l]+size[a[f[i]].l];j++) cout<<f[j]<<" ";
        				for(int j=tmp+1;j<=n;j++) cout<<f[j]<<" ";
                        flag=0;
                        break;             
                    }

                }
            }
		}
        if(flag) for(int i=1;i<=n;i++) cout<<f[i]<<" ";
        cout<<endl;
	}
	return 0;
}

不求找到错误点(找到更好),能找到错误样例就行。

若能提供有用信息,必将重谢!

AC后,加豆采纳贡献最大的人。

谈睿在2026-03-02 17:50:22追加了内容

代码见此贴

谈睿在2026-03-02 19:54:45追加了内容

ding

谈睿在2026-03-02 21:54:55追加了内容

oops,我自己调出来了,重新再虚拟机里写了一份对拍程序。(对拍真好用)

已AC。采纳第3个回答的人。


0
0
0
0
于逸杋
于逸杋
高级光能
高级光能

厉害(反正我调不来😓)

我要回答