NC205411. L2-2又见火车入栈
描述
输入描述
第一行输入一个正整数 n,表示这一天内 StarrySky 记录的数目。
接下去 n 行,每行一个火车进出站的记录,即:每行输入 in 或者 out 表示火车进出站情况,且记录一定合法。
第 n + 2 行一个正整数 q,表示 StarrySky 的询问次数。
接下去 q 行,每行两个正整数 x, y,表示询问在处理完第 x 条记录后,火车站内剩余的火车中,第 y 个进入火车站的火车编号是多少?保证询问一定合法。
输出描述
一共 q 行,依次表示每一个询问的答案。
示例1
输入:
8 in out in in out in out out 3 1 1 3 1 6 2
输出:
1 2 4
说明:
第一条记录后车站内火车情况:1C++14(g++5.4) 解法, 执行用时: 555ms, 内存消耗: 37984K, 提交时间: 2020-05-11 15:14:08
#include<bits/stdc++.h> using namespace std; struct node{ int l,r; int id; }a[1<<20]; int ans[1<<20]; int vis[1<<20]; int sta[1<<20],tot=1; bool cmp(node x,node y){ return x.l<y.l; } char s[15]; int main(){ int n;scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%s",s); if(s[0]=='i') vis[i]=1; } int q;scanf("%d",&q); for(int i=1;i<=q;i++){ int x,y;scanf("%d%d",&x,&y); a[i]={x,y,i}; } sort(a+1,a+1+q,cmp); int k=0,num=1; for(int i=1;i<=q;i++){ while(a[i].l!=k){ if(vis[++k]) sta[tot++]=num++; else tot--; } ans[a[i].id]=sta[a[i].r]; } for(int i=1;i<=q;i++) printf("%d\n",ans[i]); return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 429ms, 内存消耗: 27016K, 提交时间: 2020-07-03 00:56:38
#include<bits/stdc++.h> using namespace std; struct node { int x,y,id; }Q[1000005]; bool cmp(node a,node b) { return a.x<b.x; } int t=0,S[1000005],ans[1000005]; char R[1000005][5]; int main() { int i,j,k=1,n,q; scanf("%d",&n); for(i=0;i<n;i++)scanf("%s",R[i]); scanf("%d",&q); for(i=0;i<q;i++)scanf("%d%d",&Q[i].x,&Q[i].y),Q[i].id=i; sort(Q,Q+q,cmp); for(i=j=0;i<q;i++) { for(;j<n&&j<=Q[i].x-1;j++) { if(R[j][0]=='i')S[++t]=k++; else t--; } ans[Q[i].id]=S[Q[i].y]; } for(i=0;i<q;i++)printf("%d\n",ans[i]); return 0; }