Sicily9564

来源:互联网 发布:智业软件股份有限公司 编辑:程序博客网 时间:2024/05/22 21:55

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

#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;}               


原创粉丝点击