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

POJ 3225

編輯:C++入門知識

U:把區間[l,r]覆蓋成1
I:把[-∞,l)(r,∞]覆蓋成0
D:把區間[l,r]覆蓋成0
C:把[-∞,l)(r,∞]覆蓋成0 , 且[l,r]區間0/1互換
S:[l,r]區間0/1互換
剛剛做的時候沒有理解,後來才知道(2,3)區間也是可以的,不是一個點,而是區間,因為輸入都是整數,所以,(2,3)擴大為(4,6),這樣[5,5],就可以來取代(2,3)這種情況
繼續寫實驗報告吧,3周沒課了,天天睡懶覺,美好的早上總被我浪費掉,拖出去,樹上吊起來吧,課程設計實驗報告一大堆,還有一天就要上課了,加油!!
#include<iostream>
using namespace std;

const int MAX=65536<<1;//65535<<1;改成65600<<1就不對了

struct T
{
    int col;//表示顏色
    int cnt;//表示取反的次數
    int l,r,m;
}tree[MAX*3];

struct N
{
    int x,y;
}node[MAX];//這裡改成node[MAX*2]就不對了
int size=0;

void Build_tree(int root,int l,int r)//創建樹
{
    tree[root].l=l;
    tree[root].r=r;
    tree[root].m=(l+r)>>1;
    tree[root].cnt=0;
    if (l==r)
    {
        tree[root].col=0;
        return;
    }
    tree[root].col=-1;
    Build_tree(root<<1,l,tree[root].m);
    Build_tree(root<<1|1,tree[root].m+1,r);
};

void Updata(int root,int l,int r,int k)
{
    if(tree[root].l==l&&tree[root].r==r)
    {
        if(k==-1) tree[root].cnt++;
        else
        {
            tree[root].col=k;
            tree[root].cnt=0;
        }
        return ;
    }
    if(tree[root].col!=-1)
    {
        if (tree[root].cnt%2)
            tree[root].col=!tree[root].col;
        tree[root<<1].col=tree[root<<1|1].col=tree[root].col;
        tree[root<<1].cnt=tree[root<<1|1].cnt=tree[root].cnt=0;
        tree[root].col=-1;
    }
    if (tree[root].cnt%2)
    {
        tree[root<<1].cnt++;
        tree[root<<1|1].cnt++;
        tree[root].cnt=0;
    }
    if (r<=tree[root].m)//左子樹
        Updata(root<<1,l,r,k);
    else if (l>tree[root].m)
        Updata(root<<1|1,l,r,k);
    else
    {
        Updata(root<<1,l,tree[root].m,k);
        Updata(root<<1|1,tree[root].m+1,r,k);
    }
}


void Query(int root)
{
    if (tree[root].col!=-1)
    {
        if(tree[root].cnt%2)
            tree[root].col=!tree[root].col;
        if (tree[root].col)
        {
            node[size].x=tree[root].l;
            node[size++].y=tree[root].r;
        }
        return ;
    }
    if(tree[root].cnt%2)
    {
        tree[root<<1].cnt++;
        tree[root<<1|1].cnt++;
        tree[root].cnt=0;
    }
    Query(root<<1);
    Query(root<<1|1);
}

int main()
{
    Build_tree(1,0,MAX);
    char ch[4],ci,cj;
    int a,b;
    while(scanf("%s %c%d,%d%c",ch,&ci,&a,&b,&cj)!=EOF)
    {
        a=2*a;
        b=2*b;
        if (ci=='(')
            a+=1;
        if (cj==')')
            b-=1;//這裡[a,b]閉區間
        switch(ch[0])
        {
        case 'U'://[a,b]全部變1(並)
            if(a <= b)//過濾空集
                Updata(1,a,b,1);
            break;
        case 'I'://(交)
            if(a>0)
                Updata(1,0,a-1,0);
            Updata(1,b+1,MAX,0);
            break;
        case 'D'://(S-T)
            if(a <= b)//過濾空集
                Updata(1,a,b,0);
            break;
        case 'C':// (T-S)
            if(a>0)
                Updata(1,0,a-1,0);
            Updata(1,b+1,MAX,0);
            if(a<=b)//過濾空集
                Updata(1,a,b,-1);//取反
            break;
        case 'S':
            if(a<=b)//過濾空集
                Updata(1,a,b,-1);//取反
            break;
        }
    }
    Query(1);
    if(size==0)
        printf("empty set");
    else
        for (int i=0;i<size;i++)
        {
            int st=node[i].x;
            while (node[i].y==node[i+1].x-1) i++;
            int en=node[i].y;
            if(st%2)
                printf("(%d,",st/2);
            else
                printf("[%d,",st/2);
            if(en%2)
                printf("%d) ",en/2+1);
            else
                printf("%d] ",en/2);
        }
    putchar('\n');
    return 0;
}

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