zoukankan      html  css  js  c++  java
  • hdu 5023 线段树延迟更新+状态压缩

    /*
    线段树延迟更新+状态压缩
    */
    #include<stdio.h>
    #define N  1100000
    struct node {
     int x,y,yanchi,sum;
    }a[N*4];
    int lower[31];
    void build(int t,int x,int y) {
    a[t].x=x;
    a[t].y=y;
    a[t].yanchi=0;
    if(x==y){
         a[t].sum=lower[1];
            return ;
    }
    int temp=t<<1;
    int mid=(x+y)/2;
    build(temp,x,mid);
    build(temp+1,mid+1,y);
    a[t].sum=a[temp].sum|a[temp+1].sum;
    }
    void inset(int t,int x,int y,int c) {
       //printf("%d %d %d
    ",a[t].yanchi,a[t].x,a[t].y);
       if(a[t].x==x&&a[t].y==y) {
        a[t].yanchi=lower[c];
        a[t].sum=lower[c];//sum和yanchi都需要改变
      //  printf("%d %d %d
    ",x,y,lower[c]);
        return ;
       }
       int temp=t*2;
       int mid=(a[t].x+a[t].y)/2;
       if(a[t].yanchi) {//如果区间a[t].x--a[t].y被操作过就赋给子区间
       a[temp].yanchi=a[t].yanchi;
       a[temp].sum=a[t].sum;
       a[temp+1].yanchi=a[t].yanchi;
       a[temp+1].sum=a[t].sum;
       a[t].yanchi=0;
       }
       if(x>mid)inset(temp+1,x,y,c);
       else
        if(y<=mid)inset(temp,x,y,c);
       else {
        inset(temp,x,mid,c);
        inset(temp+1,mid+1,y,c);
       }
      a[t].sum=a[temp].sum|a[temp+1].sum;
       return ;
    }
    int qury(int t,int x,int y) {
      //   printf("%d %d %d
    ",a[t].yanchi,a[t].x,a[t].y);
      if(a[t].x==x&&a[t].y==y) {
      // printf("%d
    ",a[t].sum);
        return a[t].sum;
      }
      int temp=t*2;
      int mid=(a[t].x+a[t].y)/2;
       if(a[t].yanchi) {//如果区间a[t].x--a[t].y被操作过就赋给子区间
       a[temp].yanchi=a[t].yanchi;
       a[temp].sum=a[t].sum;
       a[temp+1].yanchi=a[t].yanchi;
       a[temp+1].sum=a[t].sum;
       a[t].yanchi=0;
       }
      if(x>mid)
        return qury(temp+1,x,y);
      else if(y<=mid)
        return qury(temp,x,y);
      else
        return qury(temp,x,mid)|qury(temp+1,mid+1,y);
      a[t].sum=a[temp+1].sum|a[temp].sum;//更新
    }
    int main() {
      int n,m,i,j,k,ans;
      char s[10];
      lower[0]=1;
      for(i=1;i<=30;i++)
        lower[i]=lower[i-1]*2;
      while(scanf("%d%d",&n,&m),n||m) {
         build(1,1,n);
        while(m--) {
            scanf("%s",s);
            if(s[0]=='P') {
            scanf("%d%d%d",&i,&j,&k);
             inset(1,i,j,k-1);
            }
            if(s[0]=='Q') {
                scanf("%d%d",&i,&j);
                ans=qury(1,i,j);
             //  printf("%d
    ",ans);
                 k=0;
                 for(i=0;i<30;i++)
                 if(ans&lower[i]) {
                    if(k)
                        printf(" ");
                    printf("%d",i+1);
                    k=1;
                 } printf("
    ");
            }
        }
    
      }
    return 0;
    }
    

  • 相关阅读:
    VMware 11安装Mac OS X 10.10 (转载)
    ios]企业开发者账号申请
    SQL SERVER sa无法登陆的问题
    接触Ubuntu的第一周大致总结
    疯狂VirtualBox实战讲学录 以及 virtualbox完全学习手册 之我见
    必须使用角色管理工具 安装或配置microsoft.net framework 3.5
    02_brk/sbrk
    How to install qt5.9
    026_pickle
    024_iterator
  • 原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410616.html
Copyright © 2011-2022 走看看