感觉和栈那一讲一样简单啊。。
poj2259 这个乱搞硬模拟吧。。。没更新last WA了N次。。。(叫你懒得写拍)
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; int bel[1100000]; int aft[1100];bool inq[1100]; int head[1100],tail[1100],q[1100][1100]; char ss[30]; int main() { int n,T_T=0; while(scanf("%d",&n)!=EOF) { if(n==0)break; T_T++;printf("Scenario #%d ",T_T); for(int i=1;i<=n;i++) { int m,x; scanf("%d",&m); for(int j=1;j<=m;j++) scanf("%d",&x), bel[x]=i; } int first,last=0; memset(inq,false,sizeof(inq)); memset(aft,0,sizeof(aft)); for(int i=1;i<=n;i++)head[i]=1,tail[i]=0; while(scanf("%s",ss+1)!=EOF) { if(ss[1]=='S')break; if(ss[1]=='E') { int x; scanf("%d",&x);int c=bel[x]; if(inq[c]==false) { if(last==0)first=c,last=c; else aft[last]=c, last=c; inq[c]=true; } q[c][++tail[c]]=x; } else { printf("%d ",q[first][head[first]]); head[first]++; if(head[first]>tail[first]) { inq[first]=false; int t=first; first=aft[first]; if(first==0)last=0; aft[t]=0; } } } printf(" "); } return 0; }
这算那门子队列啊,名字都带队列了。。。明明是贪心神题
最大字段和 炒鸡简单的单调队列入门题
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; int s[310000]; int head,tail,list[310000]; int main() { int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&s[i]), s[i]+=s[i-1]; int head=1,tail=1;list[head]=1; int ans=s[1]; for(int i=2;i<=n;i++) { while(head<=tail&&i-list[head]+1>m)head++; ans=max(ans,s[i]-s[list[head]-1]); while(head<=tail&&s[list[tail]-1]>=s[i-1])tail--; list[++tail]=i; } printf("%d ",ans); return 0; }
稀里糊涂又完了。