10/16

1.POJ 2556 单调栈

#include<cstdio>
#include<cstring>
#define INF 2147483641
using namespace std;
typedef long long ll;
ll n,top;
ll h[120000],p[120000],wid[120000],ans;//h存储读入的高度数组,p存储栈内元素的高度
//wid存储当前单调栈中的宽度
inline ll max(ll x,ll y)
{
return x>y?x:y;
}
void calc()
{
top=0,ans=-INF;//注意数据范围,开long long
for(int i=1;i<=n;i++)//单调栈初始化栈顶为0,ans为-INF
{//
if(h[i]>p[top]) //如果当前读入的矩形高度大于栈顶矩形高度,满足单调性
{//直接压栈即可
p[++top]=h[i];//栈顶当前高度为h[i]
wid[top]=1;//wid[top]初始化为1
}
else//如果下一个矩形的高度不符合单调性
{//
ll width=0;//先对局部进行对答案贡献的统计,积累宽度
while(h[i]<p[top])//如果栈顶高度一致高于当前的高度
{//
width+=wid[top];//积累宽度
ans=max(ans,p[top]*(ll)width);//更新答案
top--;//出栈
}//
p[++top]=h[i];//将当前高度的矩形压栈
wid[top]=width+1;//宽度更新
} //
}
ll len=0;//
for(int i=top;i>=1;i--)//对剩余的满足单调性的矩形求解ans
{
len+=wid[i];//宽度从最高的矩形开始累积
ans=max(ans,p[i]*len);//对答案的贡献
}
}
int main()
{
while(scanf("%lld",&n)!=EOF)
{
if(!n)
break;
memset(h,0,sizeof(h));//
memset(p,0,sizeof(p));//
memset(wid,0,sizeof(wid));//
for(int i=1;i<=n;i++)//
scanf("%lld",&h[i]);//
calc();//
printf("%lld\n",ans);//
}
return 0;
}

2.Team QueuePOJ 2259

/*


*/
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int n,m,x,num=0;
char str[203];
int book[1200000];
queue <int> q[1002];//q[0] ´æ´¢µ±Ç°ÔÚ¶ÓÁÐÖеĶÓÎéÐòºÅq[x]´æ´¢µÚxÐòºÅµÄ¶ÓÁÐ
//µ±ÖÐÈë¶ÓµÄ˳Ðò
//£¨1£©Èç¹ûÈë¶ÓÔªËØx£¬
//if(q[book[x]].size()==0)
// q[0].push(book[x]),q[book[x]].push(x);
//else
// q[book[x]].push(x)
//(2)³ö¶Ó£º
// int x=q[q[0].front()].front(),q[q[0].front()].pop();
// if(q[q[0].front()].size()==0)
// q[0].pop();
//
//
void work()
{
int tmp;
while(scanf("%s",str)!=EOF)
{
if(str[0]=='S')
return;

if(str[0]=='E')
{
scanf("%d",&tmp);
int k=book[tmp];
if(q[k].size()==0)
{
q[0].push(k);
q[k].push(tmp);
}
else
{
q[k].push(tmp);
}
}
if(str[0]=='D')
{
int k=q[0].front();
printf("%d\n",q[k].front());
q[k].pop();
if(q[k].size()==0)
q[0].pop();
}
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
num++;
if(n==0)
break;
for(int i=1;i<=n;i++)
{
scanf("%d",&m);
for(int j=1;j<=m;j++)
{
scanf("%d",&x);
book[x]=i;
}
}
printf("Scenario #");
printf("%d\n",num);
work();
memset(book,0,sizeof(book));
for(int i=0;i<=n;i++)
while(q[i].size()) q[i].pop();
printf("\n");
}

return 0;
}

猜你喜欢

转载自www.cnblogs.com/little-cute-hjr/p/11682018.html