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

错误的代码能过 对的代码过不了!

Posted by 1320740217 at 2014-09-29 22:03:41 on Problem 2528
1
3
1 10
1 3
6 10

这数据结果显然是3

下面AC代码算出是 2

后面那个代码算出是 3  提交确实WA 


#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>

#define inr  30010

using namespace std;

typedef struct
{
    int s;
    int left,right;
} Node;

int vis[2*inr];
Node tree[8*inr];
int mp[inr][2];
int can[2*inr],sum;
int h[10000020];

int Build(int root,int left,int right)
{
    tree[root].left=left;
    tree[root].right=right;
    tree[root].s=0;
    if(left==right)
        return 0;
    int mid=(left+right)/2;
    Build(2*root,left,mid);
    Build(2*root+1,mid+1,right);
}

int Update(int root,int left,int right,int x)
{
    if(tree[root].left>right||tree[root].right<left)
        return 0;
    if(tree[root].left>=left&&tree[root].right<=right)
    {
        tree[root].s=x;
        return 0;
    }
    if(tree[root].s!=0)
    {
        tree[2*root].s=tree[root].s;
        tree[2*root+1].s=tree[root].s;
        tree[root].s=0;
    }
    Update(2*root,left,right,x);
    Update(2*root+1,left,right,x);
}


int Find(int root)
{
    if(tree[root].s!=0)         //切记两个if分开写
    {
        if(vis[tree[root].s]==0)
        {
            sum++;
            vis[tree[root].s]=1;
        }
        return 0;
    }
    if(tree[root].left==tree[root].right)
        return 0;
    Find(2*root);
    Find(2*root+1);
}

int main()
{
    int T,m,n,a,b;
    cin>>T;
    while(T--)
    {
        sum=n=0;
        scanf("%d",&m);
        memset(vis,0,sizeof(vis));
        memset(h,0,sizeof(h));
        for(int i=1; i<=m; i++)
        {
            scanf("%d%d",&mp[i][0],&mp[i][1]);
            if(!h[mp[i][0]])
            {
                can[n++]=mp[i][0];
                h[mp[i][0]]=1;
            }
            if(!h[mp[i][1]])
            {
                can[n++]=mp[i][1];
                h[mp[i][1]]=1;
            }
        }
        sort(can,can+n);
        Build(1,1,n+1);
        for(int i=1; i<=n; i++)
        {
            h[can[i-1]]=i;                  //此处不同
        }
        for(int i=1; i<=m; i++)
        {
            mp[i][0]=h[mp[i][0]];
            mp[i][1]=h[mp[i][1]];
            Update(1,mp[i][0],mp[i][1],i);
        }
        Find(1);
        printf("%d\n",sum);
    }
    return 0;
}


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>

#define inr 20010

using namespace std;

typedef struct
{
    int color;
    int left,right;
}Node;

int can[2*inr];
Node tree[12*inr];
int hs[10000025],sum;
int mp[inr][2],vis[inr];

int Build(int root,int left ,int right)
{
    tree[root].left=left;
    tree[root].right=right;
    tree[root].color=0;
    if(left==right)
        return 0;
    int mid=(left+right)>>1;
    Build(root<<1,left,mid);
    Build(root<<1|1,mid+1,right);
}

int Update(int root,int left,int right,int x)
{
    if(tree[root].left>right||tree[root].right<left)
        return 0;
    if(tree[root].left>=left&&tree[root].right<=right)
    {
        tree[root].color=x;
        return 0;
    }
    if(tree[root].color!=0)
    {
        tree[root<<1].color=tree[root].color;
        tree[root<<1|1].color=tree[root].color;
        tree[root].color=0;
    }
    Update(root<<1,left,right,x);
    Update(root<<1|1,left,right,x);
}

int Find(int root)
{
    if(tree[root].color!=0)
    {
        if(vis[tree[root].color]==0)
        {
            sum++;
            vis[tree[root].color]=1;
        }
        return 0;
    }
    if(tree[root].left==tree[root].right)
        return 0;
    Find(root<<1);
    Find(root<<1|1);
}

int main()
{
    int T,m,n;
    cin>>T;
    while(T--)
    {
        sum=m=0;
        scanf("%d",&n);
        memset (vis,0,sizeof(vis));
        memset (hs,0,sizeof(hs));
        for(int i=1; i<=n;i++)
        {
            scanf("%d%d",&mp[i][0],&mp[i][1]);
            if(!hs[mp[i][0]])
            {
                can[m++]=mp[i][0];
                hs[mp[i][0]]=1;
            }
            if(!hs[mp[i][1]])
            {
                can[m++]=mp[i][1];
                hs[mp[i][1]]=1;
            }
        }
        sort(can,can+m);
        for(int i=1;i<=m;i++)
        {
            hs[can[i-1]]=2*i-1;             //次处不同
        }
        Build(1,1,2*(m+1));
        for(int i=1;i<=n;i++)
        {
            mp[i][0]=hs[mp[i][0]];
            mp[i][1]=hs[mp[i][1]];
            Update(1,mp[i][0],mp[i][1],i);
        }
        Find(1);
        printf("%d\n",sum);
    }
    return 0;
}

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