【♂Not The Triumph♂O(∩_∩)O哈哈~But The Struggle♂】

竞赛决不是捷径,它只是另一种艰辛的生活方式。得到与失去,只有时间会去评判;成功与失败,只有历史能去仲裁。我不会永远成功,正如我不会永远失败一样

  C++博客 :: 首页 :: 联系 ::  :: 管理
  6 Posts :: 239 Stories :: 25 Comments :: 0 Trackbacks

常用链接

留言簿(7)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 108475
  • 排名 - 229

最新评论

阅读排行榜

评论排行榜

你刚刚接手一项窗体界面工程。窗体界面还算简单,而且幸运的是,你不必显示实际的窗体。有 5 种基本操作:

创建一个新窗体
将窗体置顶
将窗体置底
删除一个窗体
输出窗体可见部分的百分比(就是,不被其它窗体覆盖的部分)。

在输入文件中,操作以如下的格式出现。

创建一个新窗体:w(I,x,y,X,Y)
将窗体置顶: t(I)
将窗体置底: b(I)
删除一个窗体:d(I)
输出窗体可见部分的百分比:s(I)

I 是每个窗体唯一的标识符,标识符可以是 'a'..'z', 'A'..'Z' 和 '0'..'9' 中的任何一个。输入文件中没有多余的空格。

(x,y)和(X,Y)是窗体的对角。当你创建一个窗体的时候,它自动被“置顶”。你不能用已经存在的标识符来创建窗体,但是你可以删除一个窗体后再用已删除窗体的标识符来创建窗体。坐标用正整数来表示,并且所有的窗体面积都不为 0(x <> X 且 y <> Y)。x 坐标和 y 坐标在 1 —— 32767 的范围内。

格式
PROGRAM NAME: window
INPUT FORMAT
输入文件包含给你的解释程序的一系列命令,每行一个。当输入文件结束时,停止程序。

OUTPUT FORMAT
只对于 s() 命令进行输出。当然,输入文件可能有许多 s() 命令(不超过500次),所以输出文件应该是一个百分比的序列,每行一个,百分比是窗体可见部分的百分比。百分比应该四舍五入到三位小数。

SAMPLE INPUT (file window.in)
w(a,10,132,20,12)
w(b,8,76,124,15)
s(a)

SAMPLE OUTPUT (file window.out)
49.167

【参考程序】:

/*
ID: XIONGNA1
PROG: window
LANG: C++
*/
#include
<cstdio>
#include
<cstring>
using namespace std;

int L[256],R[256],U[256],D[256
];
int prev[256],next[256
];
char S[256
];
int
 head,tail;

int
 get_n()
{
    
return S[2
];
}
void Swap(int & x,int &
 y)
{
    
int t=x;x=y;y=
t;
}
void addtail(int
 x)
{
    prev[x]
=tail; next[x]=-1
;
    
if (tail!=-1) next[tail]=
x;
    tail
=
x;
    
if (head==-1) head=
x;
}
void remove(int
 x)
{
    
if (x!=tail) prev[next[x]]=
prev[x];
    
if (x!=head) next[prev[x]]=
next[x];
    
if (x==tail) tail=
prev[x];
    
if (x==head) head=
next[x];
}
void addhead(int
 x)
{
    prev[x]
=-1; next[x]=
head;
    
if (head!=-1) prev[head]=
x;
    head
=
x;
    
if (tail==-1) tail=
x;
}
int cut(int l,int r,int u,int d,int
 k)
{
    
while (k!=-1 && (R[k]<=|| L[k]>=|| U[k]>=|| D[k]<=
u))
        k
=
next[k];
    
if (k==-1return (r-l)*(d-
u);
    
int area=0
;
    
if (L[k]>
l)
    {
        area
+=
cut(l,L[k],u,d,next[k]);
        l
=
L[k];
    }
    
if (R[k]<
r)
    {
        area
+=
cut(R[k],r,u,d,next[k]);
        r
=
R[k];
    }
    
if (U[k]>u) area+=
cut(l,r,u,U[k],next[k]);
    
if (D[k]<d) area+=
cut(l,r,D[k],d,next[k]);
    
return
 area;
}
void
 solve_w()
{
    
int n=
get_n();
    sscanf(S
+4,"%d,%d,%d,%d",L+n,U+n,R+n,D+
n);
    
if (L[n]>
R[n]) Swap(L[n],R[n]);
    
if (U[n]>
D[n]) Swap(U[n],D[n]);
    addtail(n);
}
void
 solve_t()
{
    
int n=
get_n();
    remove(n);
    addtail(n);
}
void
 solve_b()
{
    
int n=
get_n();
    remove(n);
    addhead(n);
}
void
 solve_d()
{
    
int n=
get_n();
    remove(n);
}
void
 solve_s()
{
    
int n=
get_n();
    
int ans=
cut(L[n],R[n],U[n],D[n],next[n]);
    printf(
"%.3lf\n",100.0*(double)ans/((R[n]-L[n])*(D[n]-
U[n])));
}
void
 solve()
{
    
switch (S[0
])
    {
        
case 'w'
:
            solve_w();
            
break
;
        
case 't'
:
            solve_t();
            
break
;
        
case 'b'
:
            solve_b();
            
break
;
        
case 'd'
:
            solve_d();
            
break
;
        
case 's'
:
            solve_s();
            
break
;
    }
}
int
 main()
{
    freopen(
"window.in","r"
,stdin);
    freopen(
"window.out","w"
,stdout);
    memset(prev,
-1,sizeof
(prev));
    memset(next,
-1,sizeof
(next));
    head
=-1; tail=-1
;
    
while (scanf("%s",S)!=
EOF) solve();
    
return 0
;
}
posted on 2009-08-08 20:24 开拓者 阅读(357) 评论(0)  编辑 收藏 引用 所属分类: USACO 题解经典习题

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理