程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> poj 2777

poj 2777

編輯:C++入門知識

區間染色問題,線段樹
[cpp]
#include<iostream> 
#include<algorithm> 
using namespace std; 
 
#define lson u<<1 
#define rson u<<1|1 
#define MAXN 100010 
 
bool visit[55]; 
 
struct Node{ 
    int lef,rig,color; 
}T[MAXN<<2]; 
 
void Build(int u,int l,int r){ 
    T[u].lef=l;T[u].rig=r; 
    T[u].color=1;//一開始初始化為0,tle 了兩次 
    if(l==r)return; 
    int mid=(l+r)>>1; 
    Build(lson,l,mid);Build(rson,mid+1,r); 

 
void PushDown(int u){ 
    if(T[u].color!=-1){ 
        T[lson].color=T[rson].color=T[u].color; 
        T[u].color=-1; 
    } 

 
void Update(int u,int l,int r,int val){ 
    if(l<=T[u].lef&&T[u].rig<=r){T[u].color=val;return;} 
    else { 
        PushDown(u); 
        if(l<=T[lson].rig)Update(lson,l,r,val); 
        if(r>=T[rson].lef)Update(rson,l,r,val); 
    } 

 
void Query(int u,int l,int r){ 
    if(T[u].color!=-1){//查詢到該區間有color就可以return了 
        visit[T[u].color]=true;return; 
    } 
    if(T[u].lef==T[u].rig)return; 
    PushDown(u); 
    if(l<=T[lson].rig)Query(lson,l,r); 
    if(r>=T[rson].lef)Query(rson,l,r); 

 
int main(){ 
    int L,T,O; 
    char cmd; 
    int a,b,c; 
    while(scanf("%d%d%d",&L,&T,&O)==3){ 
        Build(1,1,L); 
        while(O--){ 
            scanf(" %c",&cmd); 
            if(cmd=='C'){ 
                scanf("%d%d%d",&a,&b,&c); 
                Update(1,a,b,c); 
            } 
            else {   
                scanf("%d%d",&a,&b); 
                memset(visit,false,sizeof(visit)); 
                Query(1,a,b); 
                int cnt=0; 
                for(int i=1;i<=50;i++)if(visit[i])cnt++; 
                printf("%d\n",cnt); 
            } 
        } 
    } 
    return 0; 

 

作者:qingniaofy

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved