|
コード解けました。 集合は苦手ですが丁寧に考え直してコードから組みなおしたらうまくいきました。 コード実行速度1位正当しました。 少しうれしいです。
#include<stdio.h> #include<vector> #include <algorithm> #include <string.h>
const int typeIn=1,typeOut=-1,mapSize=10003;
struct point{ int x1,x2,y,inOut; bool operator<(const point p)const{ if(y!=p.y)return y<p.y; return inOut>p.inOut; } };
void setMap(int n,int type){ std::vector<int> sheetIO[mapSize];//シートにinOut[x座標]する。Y座標は0から増えていく std::vector<point> points; point p1,p2;
int x1,y1,x2,y2,x,y,ioCount[mapSize]; memset(ioCount,0,mapSize*4); p1.inOut=typeIn; p2.inOut=typeOut; for(int i=0;i<n;i++){ scanf("%d %d %d %d",&x1,&y1,&x2,&y2); x1++;//0列目はダミーとして使うので一列シートをずらす x2++; p1.x1=p2.x1=x1; p1.x2=p2.x2=x2; p1.y=y1; p2.y=y2; points.push_back(p1); points.push_back(p2); } std::sort(points.begin(),points.end()); int ansR=0,ansS=0,old,now,pSize=points.size();//周長,面積、一列手前、今計算中の列、 for(int i=0;i<pSize;i++){ p1=points[i]; //printf("(%d %d %d %d)",p1.y,p1.inOut,p1.x1-1,p1.x2-1); for(int x=p1.x1;x<p1.x2;x++){ if(sheetIO[x].empty() || ioCount[x]==0){ sheetIO[x].push_back(p1.y); ioCount[x]=1; }else{ ioCount[x]+=p1.inOut; if(ioCount[x]==0){ sheetIO[x].push_back(p1.y); } } } } int yOld1,yOld2,yNow1,yNow2,pSize2; unsigned int pointer1,pointer2;
for(int x=1;x<mapSize;x++){ pSize2=sheetIO[x].size(); for(int i=0;i<pSize2;i+=2){ ansS+=sheetIO[x][i+1]-sheetIO[x][i]; ansR+=2*(sheetIO[x][i+1]-sheetIO[x][i])+2; if(i!=pSize2-2 && sheetIO[x][i+2]==sheetIO[x][i+1]){ ansR--; } } pointer1=pointer2=0; while(pointer1<sheetIO[x-1].size() && pointer2<sheetIO[x].size()){ yOld1=sheetIO[x-1][pointer1]; yOld2=sheetIO[x-1][pointer1+1]; yNow1=sheetIO[x][pointer2]; yNow2=sheetIO[x][pointer2+1]; if(yOld1>=yNow2){ pointer2+=2; }else if(yOld2<=yNow1){ pointer1+=2; }else if(yOld2>=yNow2 && yOld1>=yNow1 && yOld1<=yNow2){ ansR-=2*(yNow2-yOld1); pointer2+=2; }else if(yOld2>=yNow2 && yOld1<=yNow1){ ansR-=2*(yNow2-yNow1); pointer2+=2; }else if(yOld2<=yNow2 && yOld1<=yNow1 && yOld2>=yNow1){ ansR-=2*(yOld2-yNow1); pointer1+=2; }else if(yOld2<=yNow2 && yOld1>=yNow1){ ansR-=2*(yOld2-yOld1); pointer1+=2; } } } if(type==2){ printf("%d\n%d\n",ansS,ansR); }else{ printf("%d\n",ansS); } } int main() { int n,type; scanf("%d %d",&n,&type); while(n!=0 || type!=0){ setMap(n,type); scanf("%d %d",&n,&type); } }
|