Sicily9564

原创 2013年12月03日 20:50:03

用线段树做还是超时,百度了一下发现有简便算法。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <deque>
using namespace std;

    int xmin[1000005]={0};
    int xmax[1000005]={0};
    int ymin[1000005]={0};
    int ymax[1000005]={0};
int main()
{
    int m;
    int i,j;
    int x,y;
    scanf("%d",&m);

    for (i=0;i<=m-1;i++)
    {
        int maxx=0,maxy=0;
        int minx=2000000000,miny=2000000000;
        for (j=1;j<=3;j++)
        {
            scanf("%d %d",&x,&y);
            if (x>maxx)
                maxx=x;
            if (x<minx)
                minx=x;
            if (y>maxy)
                maxy=y;
            if (y<miny)
                miny=y;
        }
        //printf("maxx%d maxy%d minx%d miny%d\n",maxx,maxy,minx,miny);
        /*for (j=minx+1;j<maxx;j++)
            hashx[j]++;
        for (j=miny+1;j<maxy;j++)
            hashy[j]++;*/
        xmin[minx]++;
        xmax[maxx]++;
        ymin[miny]++;
        ymax[maxy]++;
    }

    for (i=1;i<=1000000;i++)
    {
    	xmin[i]+=xmin[i-1];
    	xmax[i]+=xmax[i-1];
    	ymin[i]+=ymin[i-1];
    	ymax[i]+=ymax[i-1];
    }


    char s1[5],s2[5];
    int num;
    scanf("%d",&m);
    for (i=0;i<=m-1;i++)
    {
        scanf("%s %s %d",s1,s2,&num);
        if (s1[0]=='x')
            printf("%d\n",xmin[num-1]-xmax[num]);
        else
            printf("%d\n",ymin[num-1]-ymax[num]);
    }
    return 0;
}

线段树:

Lazy_Tag

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <deque>
using namespace std;

struct CNode
{
  int L,R;
  int data;
  CNode *pLeft,*pRight;
  bool is_same;
};

CNode Treex[2000005];
CNode Treey[2000005];
int nCountx=0;
int nCounty=0;

void BuildTree(CNode *pRoot,int L,int R,CNode *Tree,int &nCount)
{
    pRoot->L=L;
    pRoot->R=R;
    pRoot->data=0;
    pRoot->is_same=true;
    if (L==R)
        return;
    nCount++;
    pRoot->pLeft=Tree+nCount;
    nCount++;
    pRoot->pRight=Tree+nCount;
    BuildTree(pRoot->pLeft,L,(L+R)/2,Tree,nCount);
    BuildTree(pRoot->pRight,(L+R)/2+1,R,Tree,nCount);
}

void Insert(CNode *pRoot,int l,int r)
{
    if (l>r)
        return;
    int mid=(pRoot->L+pRoot->R)/2;

        if (l==pRoot->L && r==pRoot->R && pRoot->is_same)
        {
          pRoot->data++;
          return;
        }
        else
        {
            if (pRoot->is_same)
            {
                pRoot->is_same=false;
              pRoot->pLeft->data=pRoot->data;
              pRoot->pRight->data=pRoot->data;
            }
            if (l<=mid && r<=mid)
                Insert(pRoot->pLeft,l,r);
            else if (l<=mid && r>mid)
            {
                Insert(pRoot->pLeft,l,mid);
                Insert(pRoot->pRight,mid+1,r);
            }
            else
                Insert(pRoot->pRight,l,r);
        }

}

int Query(CNode *pRoot,int pos)
{
    if (pos<=pRoot->R && pos>=pRoot->L && pRoot->is_same)
        return pRoot->data;
    if (pos<=(pRoot->L+pRoot->R)/2)
        return Query(pRoot->pLeft,pos);
    else
        return Query(pRoot->pRight,pos);
}

int main()
{
    int m;
    int i,j;
    int x,y;
    scanf("%d",&m);
    CNode *pRootx=Treex;
    CNode *pRooty=Treey;
    BuildTree(pRootx,0,1000000,Treex,nCountx);
    BuildTree(pRooty,0,1000000,Treey,nCounty);
    for (i=0;i<=m-1;i++)
    {
        int maxx=0,maxy=0;
        int minx=2000000000,miny=2000000000;
        for (j=1;j<=3;j++)
        {
            scanf("%d %d",&x,&y);
            if (x>maxx)
                maxx=x;
            if (x<minx)
                minx=x;
            if (y>maxy)
                maxy=y;
            if (y<miny)
                miny=y;
        }
        //printf("maxx%d maxy%d minx%d miny%d\n",maxx,maxy,minx,miny);
        /*for (j=minx+1;j<maxx;j++)
            hashx[j]++;
        for (j=miny+1;j<maxy;j++)
            hashy[j]++;*/
        Insert(pRootx,minx+1,maxx-1);
        Insert(pRooty,miny+1,maxy-1);
    }

    char s1[5],s2[5];
    int num;
    scanf("%d",&m);
    for (i=0;i<=m-1;i++)
    {
        scanf("%s %s %d",s1,s2,&num);
        if (s1[0]=='x')
            printf("%d\n",Query(pRootx,num));
        else
            printf("%d\n",Query(pRooty,num));
    }
    return 0;
}               


相关文章推荐

规范ISO9564

  • 2016年04月20日 19:13
  • 1.92MB
  • 下载

ISO9564-1 个人标识号管理与安全

  • 2011年11月19日 13:12
  • 262KB
  • 下载

【Sicily】1007. 小黄车

题目描述随着共享经济的兴起,大学城如今到处可见ofo小黄车. 小左现在打算每天都骑小黄车从宿舍去实验室. 假设大学城的地图可以简化为一个有向图,图中有N个地点(节点),用0到N-1进行编号,有些地点之...

ISO 9564-2个人标识号管理与安全

  • 2011年11月19日 13:13
  • 88KB
  • 下载

sicily题目1093 1888

  • 2012年10月16日 16:25
  • 1KB
  • 下载

[Sicily 1090 Highways] 求最小生成树的两种算法(普里姆算法/克鲁斯卡尔算法)

[Sicily 1090]使用普里姆算法、克鲁斯卡尔算法求最小生成树的代码实现。

Sicily题目分类

  • 2015年10月15日 10:51
  • 46KB
  • 下载

中山大学 sicily 二叉树重建

  • 2012年10月31日 15:33
  • 2KB
  • 下载

Sicily 1276. Who needs 8 Queens w

1276. Who needs 8 Queens w Constraints Time Limit: 1 secs, Memory Limit: 32 MB , Special Jud...

Sicily_1198_Substring

  • 2012年06月05日 23:05
  • 2KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Sicily9564
举报原因:
原因补充:

(最多只允许输入30个字)