zoukankan      html  css  js  c++  java
  • [bzoj1455]罗马游戏

    可并堆裸题

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int N=1000010;
     4 struct heap{
     5     int l,r,w,d;
     6     heap(){
     7         l=r=w=d=0;
     8     }
     9     int top(){
    10         return w;
    11     }
    12 }h[N];
    13 int dad[N]; 
    14 inline int merge(int x,int y){
    15     int t;
    16     if(!x||!y) return x+y;
    17     if(h[x].w>h[y].w)swap(x,y);
    18     h[x].r=merge(y,h[x].r);
    19     int &l=h[x].l,&r=h[x].r;
    20     if(h[l].d<h[r].d)
    21     swap(l,r);
    22     h[x].d=h[r].d+1;
    23     dad[l]=dad[r]=x;
    24     return x;
    25 }
    26 void pop(int x){
    27     int l=h[x].l,r=h[x].r;
    28     h[x].l=h[x].r=h[x].w=0;
    29     int t=merge(l,r);dad[t]=t;
    30 }
    31 int find(int x){
    32     return dad[x]==x?x:find(dad[x]);
    33 }
    34 bool die[N];
    35 int main(){
    36     int n;scanf("%d",&n);
    37     for(int i=1;i<=n;i++)
    38     scanf("%d",&h[i].w),dad[i]=i;
    39     int m;scanf("%d",&m);
    40     char ch[10];
    41     while(m--){
    42         scanf("%s",ch);
    43         if(ch[0]=='M'){
    44             int x,y;scanf("%d%d",&x,&y);
    45             if(die[x]||die[y])continue;
    46             x=find(x),y=find(y);
    47             if(x^y)merge(x,y);
    48         }
    49         else{
    50             int x;scanf("%d",&x);
    51             if(die[x]){
    52                 printf("0
    ");continue;
    53             }
    54             int t=find(x);
    55             printf("%d
    ",h[t].top());
    56             die[t]=1;pop(t);
    57         }
    58     }
    59 }
  • 相关阅读:
    app-授权登录插件配置
    微信公众号-公众号设置-功能设置
    Java变量
    Java数据类型
    计算机存储单元
    Java常量
    k8s
    第一个Java程序
    旋转木马
    tools
  • 原文地址:https://www.cnblogs.com/orzzz/p/7443045.html
Copyright © 2011-2022 走看看