社区讨论

我的程序为啥最后一点超时呢,各位大神求解

P1955[NOI2015] 程序自动分析参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mi5hghdh
此快照首次捕获于
2025/11/19 12:09
4 个月前
此快照最后确认于
2025/11/19 12:09
4 个月前
查看原帖
CPP
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
int n,t,fa[100010],q[100010][2];
using namespace std;
int init()
{
    int x=0;char s=getchar();
    while(s<'0'||s>'9')s=getchar();
    while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
    return x;
}
int find(int x)
{
    if(x!=fa[x])fa[x]=find(fa[x]);
    return fa[x];
}
void merge(int x,int y)
{
    int aa=find(x),bb=find(y);
    if(aa!=bb)fa[aa]=bb;
}
int main()
{
    t=init();
    while(t--)
    {
        map<int,int>mm;
        memset(fa,0,sizeof(fa));
        memset(q,0,sizeof(q));
        n=init();
        int w=n,ww=0;
        for(int i=1;i<=n;i++)
        {
            int a,b,k;
            a=init();b=init();k=init();
            int aa=mm[a];if(aa==0){aa=++w;fa[aa]=mm[a]=aa;}
            int bb=mm[b];if(bb==0){bb=++w;fa[bb]=mm[b]=bb;}
            if(k)merge(mm[a],mm[b]);
            else q[++ww][1]=mm[a],q[ww][0]=mm[b];
            }
        int flag=1;
        for(int i=1;i<=ww;i++)
        {
            int aa,bb;
            if(q[i][1]==q[i][0]){flag=0;break;
            }
            aa=find(q[i][1]),bb=find(q[i][0]);
            if(aa==bb)
            {flag=0;break;}
            }
        if(flag==1)printf("YES\n");
        else printf("NO\n");
        }
}

回复

2 条回复,欢迎继续交流。

正在加载回复...