zoukankan      html  css  js  c++  java
  • hdu 3911 Black And White

    题目大意:n个排成一列石头,其中有黑有白(1表示黑,0表示白),有两种操作:

    (1)x=1,对相应区间的石头颜色取反。

    (2)x=0,求相应区间内的最长连续的黑石石头的数目。

    View Code
      1 #include <stdio.h>
      2 #define lson l,m,rt<<1
      3 #define rson m+1,r,rt<<1|1
      4 #define maxn 100000
      5 struct node
      6 {
      7     int llen1,llen0,rlen1,rlen0,maxlen1,maxlen0,col;
      8 }setree[maxn<<2];
      9 int max(int a,int b)
     10 {
     11     return a>b?a:b;
     12 }
     13 int min(int a,int b)
     14 {
     15     return a<b?a:b;
     16 }
     17 void pushup(int rt,int len)
     18 {
     19     setree[rt].llen1=setree[rt<<1].llen1;
     20     if(setree[rt<<1].llen1==len-len/2)
     21     setree[rt].llen1+=setree[rt<<1|1].llen1;
     22     
     23     setree[rt].rlen1=setree[rt<<1|1].rlen1;
     24     if(setree[rt<<1|1].rlen1==len/2)
     25     setree[rt].rlen1+=setree[rt<<1].rlen1;
     26     
     27     setree[rt].maxlen1=max(setree[rt<<1].rlen1+setree[rt<<1|1].llen1,max(setree[rt<<1].maxlen1,setree[rt<<1|1].maxlen1));
     28 
     29     setree[rt].llen0=setree[rt<<1].llen0;
     30     if(setree[rt<<1].llen0==len-len/2)
     31     setree[rt].llen0+=setree[rt<<1|1].llen0;
     32     
     33     setree[rt].rlen0=setree[rt<<1|1].rlen0;
     34     if(setree[rt<<1|1].rlen0==len/2)
     35     setree[rt].rlen0+=setree[rt<<1].rlen0;
     36     
     37     setree[rt].maxlen0=max(setree[rt<<1].rlen0+setree[rt<<1|1].llen0,max(setree[rt<<1].maxlen0,setree[rt<<1|1].maxlen0));
     38 }
     39 void pushdown(int rt)
     40 {
     41     if(setree[rt].col==2){
     42         int t;
     43         
     44         if(setree[rt<<1].col==2)
     45         setree[rt<<1].col=-1;
     46         else
     47         setree[rt<<1].col=2;
     48         
     49         t=setree[rt<<1].llen1;
     50         setree[rt<<1].llen1=setree[rt<<1].llen0;
     51         setree[rt<<1].llen0=t;
     52             
     53         t=setree[rt<<1].rlen1;
     54         setree[rt<<1].rlen1=setree[rt<<1].rlen0;
     55         setree[rt<<1].rlen0=t;
     56         
     57         t=setree[rt<<1].maxlen1;
     58         setree[rt<<1].maxlen1=setree[rt<<1].maxlen0;
     59         setree[rt<<1].maxlen0=t;
     60         
     61         if(setree[rt<<1|1].col==2)
     62         setree[rt<<1|1].col=-1;
     63         else
     64         setree[rt<<1|1].col=2;
     65         
     66         t=setree[rt<<1|1].llen1;
     67         setree[rt<<1|1].llen1=setree[rt<<1|1].llen0;
     68         setree[rt<<1|1].llen0=t;
     69             
     70         t=setree[rt<<1|1].rlen1;
     71         setree[rt<<1|1].rlen1=setree[rt<<1|1].rlen0;
     72         setree[rt<<1|1].rlen0=t;
     73         
     74         t=setree[rt<<1|1].maxlen1;
     75         setree[rt<<1|1].maxlen1=setree[rt<<1|1].maxlen0;
     76         setree[rt<<1|1].maxlen0=t;
     77         
     78         setree[rt].col=-1;
     79     }
     80 }
     81 void build(int l,int r,int rt)
     82 {
     83     if(l==r){
     84         scanf("%d",&setree[rt].col);
     85         setree[rt].llen1=setree[rt].rlen1=setree[rt].maxlen1=setree[rt].col?1:0;
     86         setree[rt].llen0=setree[rt].rlen0=setree[rt].maxlen0=setree[rt].col?0:1;
     87         return;
     88     }
     89     setree[rt].col=-1;
     90     int m=(l+r)>>1;
     91     build(lson);
     92     build(rson);
     93     pushup(rt,r-l+1);
     94 }
     95 void update(int l,int r,int rt,int L,int R)
     96 {
     97     int t;
     98     if(L<=l&&r<=R){
     99         if(setree[rt].col==2)
    100         setree[rt].col=-1;
    101         else
    102         setree[rt].col=2;
    103             t=setree[rt].llen1;
    104             setree[rt].llen1=setree[rt].llen0;
    105             setree[rt].llen0=t;
    106             
    107             t=setree[rt].rlen1;
    108             setree[rt].rlen1=setree[rt].rlen0;
    109             setree[rt].rlen0=t;
    110             
    111             t=setree[rt].maxlen1;
    112             setree[rt].maxlen1=setree[rt].maxlen0;
    113             setree[rt].maxlen0=t;
    114             return;
    115     }
    116     pushdown(rt);
    117     int m=(l+r)>>1;
    118     if(L<=m)
    119     update(lson,L,R);
    120     if(R>m)
    121     update(rson,L,R);
    122     pushup(rt,r-l+1);
    123 }
    124 int query(int l,int r,int rt,int L,int R)
    125 {
    126     if(L<=l&&r<=R)
    127     return setree[rt].maxlen1;
    128     pushdown(rt);
    129     int m=(l+r)>>1;
    130     if(R<=m)
    131     return query(lson,L,R);
    132     else if(L>m)
    133     return query(rson,L,R);
    134     else{
    135     int temp=max(query(lson,L,m),query(rson,m+1,R));
    136     temp=max(min(m-L+1,setree[rt<<1].rlen1)+min(R-m,setree[rt<<1|1].llen1),temp);
    137     return temp;
    138     }
    139 }
    140 int main()
    141 {
    142     int n;
    143     while(~scanf("%d",&n)){
    144         build(1,n,1);
    145         int op;
    146         scanf("%d",&op);
    147         while(op--){
    148             int a,b,c;
    149             scanf("%d%d%d",&a,&b,&c);
    150             if(a==1)
    151             update(1,n,1,b,c);
    152             else
    153             printf("%d\n",query(1,n,1,b,c));
    154         }
    155     }
    156     return 0;
    157 }
  • 相关阅读:
    02数值类型
    01开班第一节
    oracle 课堂笔记
    错题整理
    多线程下的单例模式
    线程的同步和异步
    九大内置对象!!!
    jsp前三章测试
    Jav开发中的23种设计模式详解(转载)
    java IO 学习笔记
  • 原文地址:https://www.cnblogs.com/kim888168/p/2759384.html
Copyright © 2011-2022 走看看