Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

所有能想到的数据都过了,WA到吐

Posted by smallbox at 2008-11-18 17:53:40 on Problem 2777
In Reply To:你的代码有问题哦!!!!路过的请回 Posted by:carew at 2007-03-27 23:42:59
#include "iostream"
struct Node
{
    int value,min,max;
    Node* left,*right;
    Node(){left=0;right=0;value=1;}
};
Node TreeNode[200000];
Node root;
int NodeNum;
int N,T,O;
void Init(int L)
{
    NodeNum=0;
    root=Node();
    root.left=0;
    root.right=0;
    root.min=1;
    root.max=L;
}
int cal(int color)
{
    int count=0;
    for(int i=0;i<T;i++)
        if((color>>i&1)==1)
            count++;
    return count;
}
void change(Node* root,int min,int max,int color)
{
    int mid=(root->min+root->max)/2;
    if(root->min==min&&root->max==max)
    {
        root->value=1<<color;
        if(root->left)change(root->left,root->left->min,root->left->max,color);
        if(root->right)change(root->right,root->right->min,root->right->max,color);
        return;
    }
    if(root->left==0)
    {
        root->left=&TreeNode[NodeNum++];
        root->right=&TreeNode[NodeNum++];
        root->left->min=root->min;
        root->left->max=mid;
        root->right->min=mid+1;
        root->right->max=root->max;
        root->left->value=1;
        root->right->value=1;
    }
    if(min>mid)
    {
        change(root->right,min,max,color);
    }
    if(max<=mid)
    {
        change(root->left,min,max,color);
    }
    if(min<=mid&&max>mid)
    {
        change(root->left,min,mid,color);
        change(root->right,mid+1,max,color);
    }
    root->value=root->left->value|root->right->value;
}
int find(Node* root,int min,int max)
{
    if(root->min==min&&root->max==max)
    {     
        return root->value;
    }
    int color=0;
    int mid=(root->min+root->max)/2;
    if(root->left==0)
    {
        root->left=&TreeNode[NodeNum++];
        root->right=&TreeNode[NodeNum++];
        root->left->min=root->min;
        root->left->max=mid;
        root->right->min=mid+1;
        root->right->max=root->max;
        root->left->value=root->value;
        root->right->value=root->value;
    }
    if(max<=mid)
    {
        return find(root->left,min,max);
    }
    if(min>mid)
    {
        return find(root->right,min,max);
    }
    if(min<=mid&&max>mid)
    {
        return find(root->left,min,mid)|find(root->right,mid+1,max);
    }
}
main()
{
    scanf("%d %d %d",&N,&T,&O);
    Init(N);
    for(int i=0;i<O;i++)
    {
        char s[10];
        scanf("%s",s);
        if(s[0]=='C')
        {
            int a,b,c;
            scanf("%d %d %d",&a,&b,&c);
            if(a<=b)
            {
                change(&root,a,b,c-1);
            }
            else
            {
                change(&root,b,a,c-1);
            }
        }
        if(s[0]=='P')
        {
            int a,b;
            scanf("%d %d",&a,&b);
            int color;
            if(a<=b)
            {
                color=find(&root,a,b); 
            }
            else
            {
                color=find(&root,b,a);
            }
            printf("%d\n",cal(color));
        }
    }
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator