zoukankan      html  css  js  c++  java
  • BZOJ 2819 Nim

    这是BZOJ啊。。。

    dfs传一个参就不会爆栈了。

    然而为什么0msWA?

    是Yes不是YES啊。。。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define maxv 500500
    #define maxe 1000500
    using namespace std;
    struct edge
    {
        int v,nxt;
    }e[maxe];
    char type[5];
    int n,c[maxv],x,y,nume=0,g[maxv],m;
    int fath[maxv],size[maxv],dis[maxv],top[maxv],w[maxv],son[maxv],cnt=0,fw[maxv];
    int ls[maxv<<2],rs[maxv<<2],val[maxv<<2],tot=0,root;
    void addedge(int u,int v)
    {
        e[++nume].v=v;
        e[nume].nxt=g[u];
        g[u]=nume;
    }
    void dfs1(int x)
    {
        size[x]=1;son[x]=0;
        for (int i=g[x];i;i=e[i].nxt)
        {
            int v=e[i].v;
            if (v!=fath[x])
            {
                dis[v]=dis[x]+1;fath[v]=x;
                dfs1(v);
                size[x]+=size[v];if (size[v]>size[son[x]]) son[x]=v;
            }
        }
    }
    void dfs2(int x)
    {
        if (son[fath[x]]==x) top[x]=top[fath[x]];else top[x]=x;
        w[x]=++cnt;fw[cnt]=x;
        if (son[x]!=0) dfs2(son[x]);
        for (int i=g[x];i;i=e[i].nxt)
        {
            int v=e[i].v;
            if ((v!=fath[x]) && (v!=son[x]))
                dfs2(v);
        }
    }
    void build(int &now,int left,int right)
    {
        now=++tot;
        if (left==right)
        {
            val[now]=c[fw[left]];
            return;
        }
        int mid=(left+right)>>1;
        build(ls[now],left,mid);
        build(rs[now],mid+1,right);
        val[now]=val[ls[now]]^val[rs[now]];
    }
    void modify(int now,int left,int right,int pos,int x)
    {
        if ((left==right) && (left==pos))
        {
            val[now]=c[fw[left]];
            return;
        }
        int mid=(left+right)>>1;
        if (pos<=mid) modify(ls[now],left,mid,pos,x);
        else modify(rs[now],mid+1,right,pos,x);
        val[now]=val[ls[now]]^val[rs[now]];
    }
    int ask(int now,int left,int right,int l,int r)
    {
        if ((left==l) && (right==r))
            return val[now];
        int mid=(left+right)>>1;
        if (r<=mid) return ask(ls[now],left,mid,l,r);
        else if (l>=mid+1) return ask(rs[now],mid+1,right,l,r);
        else return ask(ls[now],left,mid,l,mid)^ask(rs[now],mid+1,right,mid+1,r);
    }
    void work()
    {
        scanf("%d%d",&x,&y);
        int f1=top[x],f2=top[y];
        int now=0;
        while (f1!=f2)
        {
            if (dis[f1]<dis[f2]) {swap(f1,f2);swap(x,y);}
            now^=ask(root,1,cnt,w[f1],w[x]);
            x=fath[f1];f1=top[x];
        }
        if (dis[x]>dis[y]) swap(x,y);
        now^=ask(root,1,cnt,w[x],w[y]);
        if (now==0) printf("No
    ");
        else printf("Yes
    ");
    }
    int main()
    {
        scanf("%d",&n);
        for (int i=1;i<=n;i++) scanf("%d",&c[i]);
        for (int i=1;i<=n-1;i++) 
        {
            scanf("%d%d",&x,&y);
            addedge(x,y);
            addedge(y,x);
        }    
        dfs1(1);
        dfs2(1);
        build(root,1,cnt);
        scanf("%d",&m);
        for (int i=1;i<=m;i++)
        {
            scanf("%s",type);
            if (type[0]=='C')
            {
                scanf("%d%d",&x,&y);
                c[x]=y;
                modify(root,1,cnt,w[x],y);
            }
            else work();
        }
        return 0;
    }
  • 相关阅读:
    快速排序中的partition函数的枢纽元选择,代码细节,以及其标准实现
    并发包的线程池第二篇--Executors的构造
    并发包的线程池第一篇--ThreadPoolExecutor执行逻辑
    Servlet学习笔记
    npm + webpack +react
    取消eclipse启动时的subclipse Usage弹窗
    关于webpack最好的文档
    WebStorm2016.1 破解 激活
    微信web调试工具
    webstorm下设置sass
  • 原文地址:https://www.cnblogs.com/ziliuziliu/p/5674658.html
Copyright © 2011-2022 走看看