QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#100662#6328. Many ProductsSolitaryDream#WA 20ms76776kbC++202.1kb2023-04-27 15:49:522023-04-27 15:49:56

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-04-27 15:49:56]
  • 评测
  • 测评结果:WA
  • 用时:20ms
  • 内存:76776kb
  • [2023-04-27 15:49:52]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;

const int N=1e5+1e3+7;

int n,m,Q,K;

int d[N];

tuple<int,int,int>e[N];

int son[N*31][2],tt;

using pii=pair<int,int>;

vector<pii>v[N*31];

long long fa[N],sz[N];

long long tot;

void ins(int &x,int p,int v)
{
    if(!x)
        x=++tt;
    if(p==-1)
        return;
    ins(son[x][v>>p&1],p-1,v);
}

void go(int x,int p,pii e,int c)
{
    if(p==-1||!x)
        return;
    int f=K>>p&1;
    if(!f)
        go(son[x][c>>p&1],p-1,e,c);
    else
    {
        f=c>>p&1;
        if(son[x][f])
            v[son[x][f]].push_back(e);
        go(son[x][f^1],p-1,e,c);
    }
}

map<int,long long>ans;

int find(int x)
{
    return x==fa[x]?x:find(fa[x]);
}

void merge(int x,int y,vector<pair<long long*,long long> >&r)
{
    int fx=find(x),fy=find(y);
    if(fx==fy)
        return;
    if(sz[fx]<sz[fy])
        swap(fx,fy);
    r.push_back({&tot,tot});
    tot-=1ll*(sz[fx]-1)*sz[fx]/2;
    tot-=1ll*(sz[fy]-1)*sz[fy]/2;
    r.push_back({&(fa[fy]),fa[fy]});
    fa[fy]=fx;
    r.push_back({&(sz[fx]),sz[fx]});
    sz[fx]+=sz[fy];
    tot+=1ll*sz[fx]*(sz[fx]-1)/2;
}

void dfs(int x,int p,int val)
{
    if(!x)
        return;
    vector<pair<long long*,long long> >rem;
    for(auto [a,b]:v[x])
        merge(a,b,rem);
    if(p==-1)
    {
        ans[val]=tot;
        return;
    }
    dfs(son[x][0],p-1,val<<1);
    dfs(son[x][1],p-1,val<<1|1);
    reverse(rem.begin(),rem.end());
    for(auto [a,b]:rem)
        *a=b;
}

int main()
{
    son[0][0]=son[0][1]=-1;
    scanf("%d%d%d",&n,&m,&K);
    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        e[i]={a,b,c};
    }
    scanf("%d",&Q);
    int r=0;
    for(int i=1;i<=Q;i++)
    {
        scanf("%d",&d[i]);
        ins(r,30,d[i]);
    }
    for(int i=1;i<=m;i++)
    {
        auto [a,b,c]=e[i];
        go(r,30,{a,b},c);
    }
    for(int i=1;i<=n;i++)
        fa[i]=i,sz[i]=1;
    dfs(r,30,0);
    for(int i=1;i<=Q;i++)
        printf("%lld\n",ans[d[i]]);
}

詳細信息

Test #1:

score: 0
Wrong Answer
time: 20ms
memory: 76776kb

input:

2 3
0 1

output:


result:

wrong answer Answer contains longer sequence [length = 1], but output contains 0 elements