• 线段树专辑——hdu 1540 Tunnel Warfare


    http://acm.hdu.edu.cn/showproblem.php?pid=1540

    又是一道跟新查找最大了连续空余区间的题目,由于每次都是炸一个点和修复一个点,所以max_val域都省下了~

    由于题目只要求数目,无涉及节点的先后,所以查找的话随便怎么查吧,只要你别遗漏就好了

    还有一个要注意的就是一个隧道是可以重复炸毁重复修复的~~

    View Code
      1 #include<iostream>
    2 #include<string>
    3 #include<stack>
    4 #include<algorithm>
    5 using namespace std;
    6
    7 struct node
    8 {
    9 int l;
    10 int r;
    11 int l_val;
    12 int r_val;
    13 int cover;
    14 };
    15
    16 node tree[250000];
    17
    18 int max(int a,int b)
    19 {
    20 return a>b?a:b;
    21 }
    22
    23 stack<int>S;
    24 int n,m;
    25
    26 void build(int i,int l,int r)
    27 {
    28 tree[i].l=l;
    29 tree[i].r=r;
    30 tree[i].cover=0;
    31 tree[i].l_val=tree[i].r_val=r-l+1;
    32 if(l==r)
    33 return;
    34 int mid=(l+r)/2;
    35 build(2*i,l,mid);
    36 build(2*i+1,mid+1,r);
    37 }
    38
    39 void fun(int i)
    40 {
    41 if(tree[i].cover==0)
    42 {
    43 tree[i].l_val=tree[i].r_val=tree[i].r-tree[i].l+1;
    44 }
    45 else
    46 {
    47 tree[i].l_val=tree[i].r_val=0;
    48 }
    49 }
    50
    51 void updata(int i,int l,int r,int w)
    52 {
    53 if(tree[i].l>r || tree[i].r<l)
    54 return;
    55 if(tree[i].l>=l && tree[i].r<=r)
    56 {
    57 tree[i].cover=w;
    58 fun(i);
    59 return;
    60 }
    61 if(tree[i].cover!=-1)
    62 {
    63 tree[2*i].cover=tree[2*i+1].cover=tree[i].cover;
    64 fun(2*i);
    65 fun(2*i+1);
    66 tree[i].cover=-1;
    67 }
    68 updata(2*i,l,r,w);
    69 updata(2*i+1,l,r,w);
    70 if(tree[2*i].cover==tree[2*i+1].cover)
    71 tree[i].cover=tree[2*i].cover;
    72 else
    73 tree[i].cover=-1;
    74 tree[i].l_val=tree[2*i].l_val+(tree[2*i].cover==0?tree[2*i+1].l_val:0);
    75 tree[i].r_val=tree[2*i+1].r_val+(tree[2*i+1].cover==0?tree[2*i].r_val:0);
    76 }
    77
    78 int query(int i,int w)
    79 {
    80 if(tree[i].l<=w && tree[i].l+tree[i].l_val-1>=w) //w点在左边
    81 return tree[i].l_val;
    82 else if(tree[i].r>=w && tree[i].r-tree[i].r_val+1<=w) //w点在右边
    83 return tree[i].r_val;
    84 else if(tree[2*i].r-tree[2*i].r_val+1<=w && tree[2*i+1].l+tree[2*i+1].l_val-1>=w) //w点在中间的连续空闲空间
    85 return tree[2*i].r_val+tree[2*i+1].l_val;
    86 else if(tree[i].l<tree[i].r) //没找到,则向左右子区间查找
    87 {
    88 int mid=(tree[i].l+tree[i].r)/2;
    89 if(w<=mid)
    90 {
    91 return query(2*i,w);
    92 }
    93 else if(w>mid)
    94 {
    95 return query(2*i+1,w);
    96 }
    97 }
    98 return 0;
    99 }
    100
    101 int main()
    102 {
    103 char c;
    104 int i,a;
    105 freopen("in.txt","r",stdin);
    106 while(scanf("%d%d",&n,&m)==2)
    107 {
    108 build(1,1,n);
    109 while(!S.empty())
    110 S.pop();
    111 for(i=0;i<m;i++)
    112 {
    113 getchar();
    114 scanf("%c",&c);
    115 if(c=='D')
    116 {
    117 scanf("%d",&a);
    118 S.push(a);
    119 updata(1,a,a,1);
    120 }
    121 else if(c=='R')
    122 {
    123 a=S.top();
    124 S.pop();
    125 updata(1,a,a,0);
    126 }
    127 else
    128 {
    129 scanf("%d",&a);
    130 a=query(1,a);
    131 printf("%d\n",a);
    132 }
    133 }
    134 }
    135 return 0;
    136 }
  • 相关阅读:
    webstorm配置github 以及本地代码上传github。
    日期控件------moment.js
    图片查看器
    日期
    配置一个node服务器
    git代码管理
    vue
    javascript (字符串, 数组, 对象 , 日期 和 操作元素节点 动画 定时器)
    html css
    JS常用方法
  • 原文地址:https://www.cnblogs.com/ka200812/p/2245863.html
Copyright © 2020-2023  润新知