和哈希求调,65pts
查看原帖
和哈希求调,65pts
653286
zhfaz123楼主2023/8/29 11:10

提交记录:这里

代码:

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<stack>
#include<algorithm>
#include<queue>
#include<deque>
#include<cstring>
#include<string>
#include<set>
#include<utility>
#include<set>
#include<map>
#include<climits>
#include<unordered_set>
#include<unordered_map>
#include<bitset>
#include<random>
#include<ctime>
constexpr int N=5e5,M=5e5;
#define I using
#define AK namespace
#define IOI std
I AK IOI;
int n,m,q;
long long in[N+5];
long long cw[N+5],w[N+5],fll,now;//in为原图入度权和,cw为每个节点入度,w为当前入度和,fll为所有入度为一是权和,now为当前权和
void inline init()
{
    static default_random_engine e;
    constexpr long long mod=11451419;
    e.seed(time(nullptr));
    for(int i=1;i<=n;i++)
    {
        cw[i]=e()%mod+3;
    }
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n>>m;
    init();
    for(int i=1;i<=m;i++)
    {
        int u,v;
        cin>>u>>v;
        w[v]+=cw[u];in[v]=w[i];
    }
    now=accumulate(w+1,w+n+1,0ll);
    fll=accumulate(cw+1,cw+n+1,0ll);
    cin>>q;
    while(q--)
    {
        int op;cin>>op;
        switch (op)
        {
        case 1:
        {
            int u,v;
            cin>>u>>v;
            w[v]-=cw[u];
            now-=cw[u];
            break;
        }   
        case 2:
        {
            int u;
            cin>>u;
            now-=w[u];
            w[u]=0;
            break;
        }
        case 3:
        {
            int u,v;
            cin>>u>>v;
            w[v]+=cw[u];
            now+=cw[u];
            break;
        }
        case 4:
        {
            int u;
            cin>>u;
            now=now-w[u]+in[u];
            w[u]=in[u];
            break;
        }
        default:
            break;
        }
        if(now==fll) cout<<"YES\n";
        else cout<<"NO\n";
    }
    return 0;
}
2023/8/29 11:10
加载中...