history

来源:互联网 发布:无锡网络教育学历 编辑:程序博客网 时间:2024/04/28 10:05

题面1
题面2
题面3

并查集
记录每一条边上的时间
因为不能路径压缩
合并的时候把小的合并到大的上来节省时间
好像是叫按秩合并

#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<queue>#include<vector>#include<climits>#include<string>#include<cstdlib>#include<ctime>#define MOD 1000000007#define LL long longusing namespace std;int n,m,i,f[300005],size[300005],c,angry,yr,year[300005],x,y,t,a,b;char p[5];int find(int s,int ti){    while(s!=f[s]&&year[s]<=ti)        s=f[s];    return s;}int main(){    scanf("%d%d",&n,&m);    for(i=0;i<n;i++)    {        f[i]=i;        size[i]=1;    }       while(m--)    {        scanf("%s",p);        if(p[0]=='K')        {            scanf("%d",&c);            angry=0;        }        if(p[0]=='R')        {            scanf("%d%d",&a,&b);            if(angry)            {                a=(a+c)%n;                b=(b+c)%n;            }            yr++;            a=find(a,yr);            b=find(b,yr);            if(a!=b)            {                if(size[a]<size[b])                {                    f[a]=b;                    size[b]+=size[a];                    year[a]=yr;                }                else                {                    f[b]=a;                    size[a]+=size[b];                    year[b]=yr;                }                       }        }        if(p[0]=='T')        {            scanf("%d%d%d",&x,&y,&t);            if(angry=((find(x, yr-t)==find(y, yr-t))||(find(x, yr)^find(y, yr)))) printf("N\n");            else printf("Y\n");        }           }    return 0;}
原创粉丝点击