loj#502. 「LibreOJ β Round」ZQC 的截图

离线做法显然 dfs  顺便开个桶记录下就好。

在线可以将桶换为主席树,一次增加 logn 个点。被卡了

考虑非正解做法。

我们在 mod 3 下运算的话,可以得到对于 3 个东西的判定。

1. sum=0 ,因为 3kcnt1+3kcnt2+...sum0(mod3)

2. 如果只有一个,不满足,那么 3kcnt1+dkcnt2+...sum(mod3),d=1/2,那么只要检验是否有一个的 1/2 倍是整条路径权值和即可。

3. 显然。

增加正确率由于 mod 3,可以看做在 3 进制下运算,多加几位即可。

找显然哈希表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <cmath>
#include <queue>
#include <map>
#include <ctime>
 
#define ll long long
 
using namespace std;
int rd() {
    int f=1,sum=0; char ch=getchar();
    while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
    while(isdigit(ch)) {sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
    return sum*f;
}
ll lrd() {
    ll f=1,sum=0; char ch=getchar();
    while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
    while(isdigit(ch)) {sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
    return sum*f;
}
 
const int N=(int)(2e6+5),mod=10000007,W=36;
struct HASH {
    struct node {
        int uid,nex; ll val;
    }H[mod+2];
    int tot,head[mod+2];
    void clear() {
        tot=0; memset(head,0,sizeof(head));
    }
    int Find(ll v) {
        for(int i=head[v%mod];i;i=H[i].nex) if(H[i].val==v) return i;
        return -1;
    }
    int query(ll v) {
        int qwq=Find(v);
        if(~qwq) return H[qwq].uid;
        return -1;
    }
    void ins(ll v,int idd) {
        int qwq=Find(v);
        if(~qwq);
        else {
            H[++tot].uid=idd; H[tot].nex=head[v%mod]; H[tot].val=v; head[v%mod]=tot;
        }
    }
}Hash;
 
ll val[N],sum[N];
int n,m;
 
ll get_rand() {
    ll res=0;
    for(int i=0;i<W;i++) res=res*3+(rand()%3);
    return abs(res);
}
 
ll merge(ll x,ll y) {
    ll res=0,p=1;
    while(x||y) {
        res+=p*((x+y)%3);
        x/=3; y/=3; p*=3;
    }
    return res;
}
 
int main() {
    srand(19260817);
    n=rd(); m=rd();
    for(int i=1;i<=n;i++) {
        val[i]=get_rand(); Hash.ins(val[i],i); Hash.ins(merge(val[i],val[i]),i); //cout<<merge(val[i],val[i])<<endl;
        //cout<<val[i]<<endl;
    }
    int ans=0,x,y;
    for(int i=1;i<=m;i++) {
        x=rd(); y=rd();
        x^=ans; y^=ans;
        sum[i]=merge(val[x],sum[y]); //cout<<sum[i]<<endl;//cout<<x<<" "<<y<<endl;
        if(!sum[i]) ans=-1;
        else {
            ans=Hash.query(sum[i]);
            if(ans==-1) ans=-2;
            //cout<<ans<<endl;
        }
        printf("%d\n",ans);
    }
}

  


__EOF__

本文作者F x o r G
本文链接https://www.cnblogs.com/xugangfan/p/15158684.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   FxorG  阅读(54)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示