QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#165214#5410. 树特卡克林Lynkcat#0 1ms5752kbC++204.2kb2023-09-05 16:42:162024-07-04 01:52:39

Judging History

你现在查看的是最新测评结果

  • [2024-07-04 01:52:39]
  • 评测
  • 测评结果:0
  • 用时:1ms
  • 内存:5752kb
  • [2023-09-05 16:42:16]
  • 提交

answer

#include<bits/stdc++.h>
#include<bits/extc++.h>
#define poly vector<int>
#define IOS ios::sync_with_stdio(false)
#define ll long long
#define mp make_pair
#define mt make_tuple
#define pa pair < int,int >
#define fi first
#define se second
#define inf 1e18
#define mod 998244353
#define sz(x) ((int)((x).size()))
#define int ll
#define N 100005
using namespace std;
using namespace __gnu_cxx;
using namespace __gnu_pbds;
int n,m;
int ffa[N],rt[N];
poly G[N];
int s[N],siz[N],son[N];
poly all;
int mx[N];
tree<pa, null_type, less<pa>, rb_tree_tag, tree_order_statistics_node_update> t;
void dfs(int k,int fa)
{
    ffa[k]=fa;
    rt[k]=rt[fa];
    for (auto u:G[k])
    {
        if (u==fa) continue;
        dfs(u,k);
    }
} 
void makert(int k)
{
    rt[k]=k;
    dfs(k,k);
}
void gt(int k,int fa)
{
    s[k]=k;
    siz[k]=1;son[k]=0;
    mx[k]=k;
    for (auto u:G[k])
    {
        if (u==fa) continue;
        // cout<<k<<"->"<<u<<endl;
        gt(u,k);
        siz[k]+=siz[u];
        if (siz[u]>siz[son[k]]||siz[u]==siz[son[k]]&&mx[u]>mx[son[k]]) son[k]=u;
    }
    mx[k]=max(mx[k],mx[son[k]]);
    for (auto u:G[k])
    {
        if (u==fa) continue;
        if (u!=son[k]) all.push_back(s[u]);
        else s[k]^=s[u];
    }
}
void BF()
{
    for (int i=1;i<=n;i++) rt[i]=i;
    for (int i=1;i<=m;i++)
    {
        int op;
        cin>>op;
        if (op==1)
        {
            int x,y;
            cin>>x>>y;
            G[y].push_back(x);
            G[x].push_back(y);
            makert(rt[x]);
        }
        else
        {
            int x,y;
            cin>>x>>y;
            if (ffa[x]==y) swap(x,y);
            G[x].erase(find(G[x].begin(),G[x].end(),y));
            G[y].erase(find(G[y].begin(),G[y].end(),x));
            makert(y);
        }
        int k;
        cin>>k;
        for (int j=1;j<=n;j++)
            if (rt[j]==j) gt(j,j),all.push_back(s[j]);
        sort(all.begin(),all.end());
        cout<<all[(k-1)%all.size()]<<'\n';
        poly().swap(all);
    }
}
inline int tp(int k)
{
    while (ffa[k]!=k)
    {
        if (son[ffa[k]]!=k) return k;
        k=ffa[k];
    }
    return k;
}
inline void updmx(int k,int x)
{
    int res=x;
    while (ffa[k]!=k)
    {
        res=max(res,k);
        mx[k]=res;
        if (son[ffa[k]]!=k) return;
        k=ffa[k];
    }
    return;
}
void jump(int k)
{
    if (ffa[k]==k) 
    {
        t.insert(mp(s[k],k));
        return;
    }
    if (son[ffa[k]]==k)
    {
        jump(ffa[k]);
        return;
    }
    // cout<<","<<siz[k]<<" "<<siz[son[ffa[k]]]<<endl;
    if (!son[ffa[k]]||siz[k]>siz[son[ffa[k]]]||siz[k]==siz[son[ffa[k]]]&&mx[k]>mx[son[ffa[k]]])
    {
        int fa=ffa[k];
        t.erase(mp(s[tp(fa)],tp(fa)));
        if (son[fa])
        {
            s[tp(fa)]^=s[son[fa]];
            t.insert(mp(s[son[fa]],son[fa]));
        }
        son[fa]=k;
        s[tp(k)]^=s[k];
        updmx(fa,mx[k]);
        // t.insert(mp(s[tp(k)],tp(k)));
        jump(fa);
    }
    else
    {
        t.insert(mp(s[k],k));
    }
}
void BF1()
{
    for (int i=1;i<=n;i++) ffa[i]=i,rt[i]=i,s[i]=i,mx[i]=i,siz[i]=1,t.insert(mp(s[i],i));
    for (int i=1;i<=m;i++)
    {
        int op;
        cin>>op;
        if (op==1)
        {
            int x,y;
            cin>>x>>y;
            ffa[y]=x;
            rt[y]=rt[x];
            int u=x;
            while (ffa[u]!=u) siz[u]+=siz[y],u=ffa[u];
            siz[u]+=siz[y];
            t.erase(mp(s[y],y));
            jump(y);
        }
        else
        {
            int x,y;
            return;
        }
        int k;
        cin>>k;
        cout<<(*t.find_by_order((k-1)%t.size())).fi<<'\n';
        for (int i=1;i<=n;i++)
            if (ffa[i]!=i)
            {
                int fa=ffa[i];
                // cout<<i<<" "<<son[fa]<<endl;
                assert(siz[son[fa]]>siz[i]||siz[son[fa]]==siz[i]&&mx[son[fa]]>=mx[i]);
            }
    }
}
void BellaKira()
{
    cin>>n>>m;
    if (n<=1000&&m<=5000&&0) BF();
    else BF1();
}
signed main()
{
	IOS;
	cin.tie(0);
	int T=1;
	while (T--)
	{
		BellaKira();
	}
}

詳細信息

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 0
Wrong Answer
time: 1ms
memory: 5752kb

input:

10 50
1 4 5 8
1 2 10 6
1 7 10 1
1 2 5 7
1 1 5 1
1 8 3 1
1 5 3 3
1 1 9 3
0 10 2 8
1 10 1 6
0 1 10 1
0 4 5 9
1 8 4 9
0 3 5 3
0 10 7 6
1 1 4 1
0 4 8 3
1 5 6 2
1 10 7 1
1 2 7 1
0 2 7 8
0 4 1 10
1 7 2 6
1 2 4 2
1 2 3 4
0 5 6 7
1 8 6 1
0 2 7 7
1 10 3 1
0 3 8 5
0 2 4 7
1 4 10 9
0 1 9 8
0 2 3 1
1 10 8 4
1 1...

output:

9
8
1
8
1
1
7
7

result:

wrong answer 4th numbers differ - expected: '1', found: '8'

Subtask #2:

score: 0
Skipped

Dependency #1:

0%

Subtask #3:

score: 0
Skipped

Dependency #2:

0%

Subtask #4:

score: 0
Runtime Error

Test #4:

score: 0
Runtime Error

input:

100000 99999
1 1 2 44734
1 2 3 61340
1 1 4 68331
1 2 5 86313
1 4 6 26991
1 4 7 72397
1 3 8 24098
1 5 9 31437
1 5 10 82367
1 5 11 20958
1 11 12 38919
1 12 13 87596
1 2 14 41335
1 1 15 78828
1 14 16 73861
1 9 17 81368
1 1 18 40205
1 9 19 60737
1 4 20 9347
1 5 21 84645
1 18 22 20063
1 15 23 98769
1 15 ...

output:


result:


Subtask #5:

score: 0
Runtime Error

Test #5:

score: 0
Runtime Error

input:

100000 99999
1 2 1 30000
1 3 2 76304
1 4 1 35053
1 5 4 38046
1 6 4 43843
1 7 1 64206
1 8 6 52957
1 9 3 42768
1 10 8 6520
1 11 5 43975
1 12 1 64810
1 13 12 64219
1 14 10 78432
1 15 4 62142
1 16 15 235
1 17 3 77806
1 18 17 58130
1 19 5 47941
1 20 14 19568
1 21 7 99780
1 22 17 39362
1 23 4 10525
1 24 1...

output:


result:


Subtask #6:

score: 0
Skipped

Dependency #3:

0%

Subtask #7:

score: 0
Skipped

Dependency #1:

0%