zoukankan      html  css  js  c++  java
  • hdu3726 Graph and Queries

    重写了一遍,从TLE进不到WA了。。。我实在找不出错误在哪了。。。先放着,等过段时间刷顺利指南的时候再来看这题。。

    #include<bits/stdc++.h>
    #define REP(i,a,b) for(int i=a;i<=b;i++)
    #define MS0(a) memset(a,0,sizeof(a))
    #define key_val ch[ch[rt[i]][1]][0]
    
    using namespace std;
    
    typedef long long ll;
    const int maxn=2000100;
    const int INF=1e9+10;
    
    int n,m;
    struct Query
    {
        char op;int x,k;
    };Query q[maxn];int qn;
    struct Edge
    {
        int u,v;
        bool exi;
    };Edge e[maxn];
    char ops[20];int x;ll k;
    ll vp[maxn];
    int fa[maxn];
    int u,v;
    
    int pre[maxn],sz[maxn],ch[maxn][2],rt[maxn],tot1;
    int s[maxn],tot2;
    ll val[maxn];
    
    int find(int x)
    {
        return fa[x]==x?x:fa[x]=find(fa[x]);
    }
    
    void Init()
    {
        pre[0]=sz[0]=ch[0][0]=ch[0][1]=tot1=tot2=s[0]=val[0]=0;
        MS0(rt);
    }
    
    void newnode(int &r,int fa,ll k)
    {
        if(tot2) r=s[tot2--];
        else r=++tot1;
        pre[r]=fa;val[r]=k;
        MS0(ch[r]);
        sz[r]=1;
    }
    
    void up(int r)
    {
        sz[r]=sz[ch[r][0]]+sz[ch[r][1]]+1;
    }
    
    void rot(int x,int kind)
    {
        int y=pre[x];
        ch[y][kind^1]=ch[x][kind];
        pre[ch[x][kind]]=y;
        if(pre[y]) ch[pre[y]][ch[pre[y]][1]==y]=x;
        pre[x]=pre[y];
        ch[x][kind]=y;
        pre[y]=x;
        up(y);
    }
    
    void splay(int i,int x,int goal)
    {
        while(pre[x]!=goal){
            if(pre[pre[x]]==goal) rot(x,ch[pre[x]][0]==x);
            else{
                int y=pre[x],z=pre[y];
                int kind=ch[y][0]==x,one=0;
                if(ch[y][0]==x&&ch[z][0]==y) one=1;
                if(ch[y][1]==x&&ch[z][1]==y) one=1;
                if(one) rot(y,kind),rot(x,kind);
                else rot(x,kind),rot(x,kind^1);
            }
        }
        if(goal==0) rt[i]=x;
        up(x);
    }
    
    void Insert(int i,ll x)
    {
        int r=rt[i];
        if(r==0){
            newnode(rt[i],0,x);
            return;
        }
        while(ch[r][x>val[r]]) r=ch[r][x>val[r]];
        newnode(ch[r][x>val[r]],r,x);
        splay(i,ch[r][x>val[r]],0);
    }
    
    int get_pre(int r)
    {
        r=ch[r][0];
        if(r==0) return 0;
        while(ch[r][1]) r=ch[r][1];
        return r;
    }
    
    int get_next(int r)
    {
        r=ch[r][1];
        if(r==0) return 0;
        while(ch[r][0]) r=ch[r][0];
        return r;
    }
    
    void Erase(int r)
    {
        if(r==0) return;
        Erase(ch[r][0]);
        Erase(ch[r][1]);
        s[++tot2]=r;
    }
    
    void Del(int i,ll x)
    {
        int r=rt[i];
        while(val[r]!=x) r=ch[r][x>val[r]];
        splay(i,r,0);
        int pr=get_pre(r),qr=get_next(r);
        if(pr==0&&qr==0) Erase(r),rt[i]=0;
        else if(pr==0&&qr){
            s[++tot2]=r;
            rt[i]=ch[r][1];
            pre[rt[i]]=0;
        }
        else if(pr&&qr==0){
            s[++tot2]=r;
            rt[i]=ch[r][0];
            pre[rt[i]]=0;
        }
        else{
            splay(i,pr,0);splay(i,qr,rt[i]);
            Erase(key_val);
            key_val=0;
            up(ch[rt[i]][1]);up(rt[i]);
        }
    }
    
    ll Kth(int i,int k)
    {
        int r=rt[i];
        if(r==0||k<=0||k>sz[r]) return 0;
        k=sz[r]+1-k;
        while(k-1!=sz[ch[r][0]]){
            if(k<sz[ch[r][0]]+1) r=ch[r][0];
            else k-=sz[ch[r][0]]+1,r=ch[r][1];
        }
        splay(i,r,0);
        return val[r];
    }
    
    void dfs(int r,int rty)
    {
        if(r==0) return;
        dfs(ch[r][0],rty);
        dfs(ch[r][1],rty);
        Insert(rty,val[r]);
        s[++tot2]=r;
    }
    
    void Union(int u,int v)
    {
        int x=find(u),y=find(v);
        if(x==y) return;
        if(sz[rt[x]]>sz[rt[y]]) swap(x,y);
        dfs(rt[x],y);
        rt[x]=0;
        fa[x]=y;
    }
    
    int main()
    {
        freopen("in.txt","r",stdin);
        int casen=1;
        while(~scanf("%d%d",&n,&m)){
            if(n==0&&m==0) break;
            REP(i,1,n) fa[i]=i;
            Init();
            REP(i,1,n){
                scanf("%I64d",&vp[i]);
                Insert(i,vp[i]);
            }
            REP(i,1,m){
                scanf("%d%d",&u,&v);
                e[i]=(Edge){u,v,1};
            }
            qn=0;
            while(1){
                scanf("%s",ops);
                if(ops[0]=='E') break;
                ++qn;
                if(ops[0]=='D'){
                    scanf("%d",&x);
                    q[qn]=(Query){ops[0],x,0};
                    e[x].exi=0;
                }
                else if(ops[0]=='Q'){
                    scanf("%d%I64d",&x,&k);
                    q[qn]=(Query){ops[0],x,k};
                }
                else{
                    scanf("%d%I64d",&x,&k);
                    q[qn]=(Query){ops[0],x,k};
                }
            }
            REP(i,1,m){
                if(e[i].exi){
                    u=e[i].u,v=e[i].v;
                    Union(u,v);
                }
            }
            ll ans=0,cnt=0;
            for(int i=qn;i>=1;i--){
                x=q[i].x,k=q[i].k;
                if(q[i].op=='D') Union(e[x].u,e[x].v);
                else if(q[i].op=='Q'){
                    u=find(x);
                    ans+=Kth(u,k);
                    cnt++;
                }
                else{
                    u=find(x);
                    Del(u,vp[x]);
                    vp[x]=k;
                    Insert(u,k);
                }
            }
            printf("Case %d: %6f
    ",casen++,ans*1.0/cnt);
        }
        return 0;
    }
    View Code
    没有AC不了的题,只有不努力的ACMER!
  • 相关阅读:
    使用Apworks开发基于CQRS架构的应用程序(六):创建.NET WCF服务
    Microsoft NLayerApp案例理论与实践 项目简介与环境搭建
    使用Apworks开发基于CQRS架构的应用程序(七):配置数据库
    测试一下亚马逊联盟
    Revit参数族之DMD系列静电水处理器
    Revit参数族之ZP系列消声器
    第一个Ruby程序:Hello world!
    百度文库下载器冰点下载
    sketchup ruby编程之绘制梯段
    加西亚马尔克斯枯枝败叶
  • 原文地址:https://www.cnblogs.com/--560/p/5210661.html
Copyright © 2011-2022 走看看