本文共 2035 字,大约阅读时间需要 6 分钟。
这个问题很有趣的项目,写麻烦。它预计将有写了很长的时间。
好在,我想开了一个比较简单的方法。。
。
使用位计算,颜色RGB分别1,2,4,代表。
状态的长度了。
#include #include #include #include #include #include #include #include #pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;#define maxn 11000#define mem(a,b) (memset(a),b,sizeof(a))#define lmin 1#define rmax len#define lson l,(l+r)/2,rt<<1#define rson (l+r)/2+1,r,rt<<1|1#define root lmin,rmax,1#define now l,r,rt#define int_now int l,int r,int rt#define INF 99999999#define LL __int64#define mod 10007#define eps 1e-6#define zero(x) (fabs(x) mp;int du[maxn*2];int len;struct list{ int x; int y,yy; int cl; int leap; friend bool operator <(const list &a,const list &b) { return a.x r||rr =r) { yan[rt][cl]+=x; push_up(now); return; } updata(ll,rr,cl,x,lson); updata(ll,rr,cl,x,rson); push_up(now);}int main(){ int T,cas; scanf("%d",&T); cas=0; int n,x,y,xx,yy; char str[1110]; while(T--) { cas++; scanf("%d",&n); int cl; int ls=0; du[0]=-1; for(int i=1;i<=n;i++) { scanf("%s%d%d%d%d",str,&x,&y,&xx,&yy); if(str[0]=='R')cl=0; if(str[0]=='G')cl=1; if(str[0]=='B')cl=2; node[i*2-1].cl=cl; node[i*2-1].y=y ; node[i*2-1].leap=1; node[i*2-1].x=x; node[i*2-1].yy=yy; node[i*2 ].cl=cl; node[i*2 ].y=y ; node[i*2 ].leap=-1; node[i*2 ].x=xx; node[i*2 ].yy=yy; du[++ls]=y; du[++ls]=yy; } sort(node+1,node+n*2+1); sort(du,du+ls+1); len=0; for(int i=1;i<=ls;i++) { if(du[i]!=du[i-1]) { mp[du[i]]=++len; du[len]=du[i]; } } len--; LL are[8]; int st; st=0; creat(); memset(are,0,sizeof(are)); for(int i=1;i<=n*2;i++) { int l=mp[node[i].y]; int r=mp[node[i].yy]; for(int j=1;j<=7;j++) { are[j]+=(LL)color[1][j]*(node[i].x-st); } st=node[i].x; updata(l,r-1,node[i].cl,node[i].leap,root); } printf("Case %d:\n",cas); printf("%I64d\n",are[1]); printf("%I64d\n",are[2]); printf("%I64d\n",are[4]); printf("%I64d\n",are[3]); printf("%I64d\n",are[5]); printf("%I64d\n",are[6]); printf("%I64d\n",are[7]); }}
版权声明:本文博客原创文章,博客,未经同意,不得转载。