【版本一:分块,17分】
我又一次陷入了寻找bug的陷阱里…
#include <bits/stdc++.h>
using namespace std;
int hsh[100010];
int block[320];
int main(void)
{
int n;
char str[16];
scanf("%d",&n);
memset(hsh,0,sizeof(hsh));
memset(block,0,sizeof(block));
stack<int> s;
int cnt=0;
for(int i=0;i<n;i++)
{
scanf("%s",str);
if(str[1]=='o') //Pop
{
if(cnt==0) printf("Invalid\n");
else
{
cnt--;
int tmp=s.top();
s.pop();
printf("%d\n",tmp);
hsh[tmp]--;
block[tmp/320]--;
}
}
else if(str[1]=='u') //Push
{
int tmp;
scanf("%d",&tmp);
s.push(tmp);
cnt++;
hsh[tmp]++;
block[tmp/320]++;
}
else
{
if(cnt==0) printf("Invalid\n");
else
{
int mid=cnt%2==1?(cnt+1)/2:cnt/2;
int j;
for(j=0;block[j]<mid;j++)
mid-=block[j];
for(int k=j*320+1;k<=(j+1)*320;k++)
{
mid-=hsh[k];
if(mid<=0)
{
printf("%d\n",k);
break;
}
}
}
}
}
}
【版本二:我是智障,AC】
又是边界条件+1-1的问题,去死吧!
#include <bits/stdc++.h>
using namespace std;
int hsh[100010];
int block[320];
int main(void)
{
int n;
char str[16];
scanf("%d",&n);
memset(hsh,0,sizeof(hsh));
memset(block,0,sizeof(block));
stack<int> s;
int cnt=0;
for(int i=0;i<n;i++)
{
scanf("%s",str);
if(str[1]=='o') //Pop
{
if(cnt==0) printf("Invalid\n");
else
{
cnt--;
int tmp=s.top();
s.pop();
printf("%d\n",tmp);
hsh[tmp]--;
block[tmp/320]--;
}
}
else if(str[1]=='u') //Push
{
int tmp;
scanf("%d",&tmp);
s.push(tmp);
cnt++;
hsh[tmp]++;
block[tmp/320]++;
}
else
{
if(cnt==0) printf("Invalid\n");
else
{
int mid=cnt%2==1?(cnt+1)/2:cnt/2;
int j;
for(j=0;block[j]<mid;j++)
mid-=block[j];
for(int k=j*320;k<(j+1)*320;k++)
{
mid-=hsh[k];
if(mid<=0)
{
printf("%d\n",k);
break;
}
}
}
}
}
}