关于标题
I(Interesting)T(Test)O(Of)N(Noip)
P.S.此类文章纯属娱乐,还有WYW不要又引用我的题!!!
番外(论queue( ))
一道OJ的题:
Middle number
题目描述
有一个整数序列,我们现在有两个操作:
1.add a:意味着在序列的结尾添加一个整数 a ,形成一个长度为 n+1 的序列。
2.mid:输出当前序列的中位数。
所谓中位数,就是这个序列按升序排列后中间位置的数(如果序列的长度是偶数,那么中位数就是此序列中间两个数)
示例1:序列为 1 2 13 14 15 16,则中位数为 13。
示例2:序列为 1 3 5 7 10 11 17,则中位数为 7 。
示例3:序列为 1 1 1 2 3,则中位数为 1 。
输入格式
第一行输入一个整数 T(T≤10) ,表示测试数据的组数。
对每组数据:
第一行是一个整数 N(1≤N≤100000),表示序列长度;
接下来一行是 N 个整数,表示这个序列;
接下来一行是一个整数 M(0≤M≤10000),表示有M个操作;
接下来有 M 行,每行是由 add 或 mid 开头表示一个操作。
输出格式
对于每组的每个 mid 操作,输出此时序列中符合题意的中位数。
样例数据 1
输入 [复制]
1
6
1 2 13 14 15 16
5
add 5
add 3
mid
add 20
mid
输出
5
13
本来是一道不是特别难的专门用来给queue(优先队列)装逼的。。
然而。。
我一开始是把queue定义在while里面的。。
WTF.CPP
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
int t,n,m,d;
char c[4];
inline int read()
{
int w=1,x=0;char ch;
while(ch< '0'||ch >'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*w;
}
int main()
{
t = read();
while(t--)
{
priority_queue<int >qu1;
priority_queue<int >qu2;
int a;
n = read();
for(int i=1;i<=n;i++){a = read();qu1.push(a);}
for(int i=1;i<=n/2;i++){qu2.push(-qu1.top());qu1.pop();}
m = read();
for(int i=1;i<=m;i++)
{
cin >> c;
if(c[0]=='a')
{
cin>>a;
if(-qu2.top()<a)qu2.push(-a);
else qu1.push(a);
while(qu2.size()>qu1.size()-1)qu1.push(-qu2.top()),qu2.pop();
while(qu2.size()<qu1.size()-1)qu2.push(-qu1.top()),qu1.pop();
}
else cout<<qu1.top()<<endl;
}
}
}
样例啊极限数据什么的都过的是行云流水这是要 AC 的节奏啊A_A。。。
然后。。。
??????
??????
??????
然后在懵逼状态中把queue换成了全局变量。。
STD.CPP
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
int t,n,m,d;
char c[4];
inline int read()
{
int w=1,x=0;char ch;
while(ch< '0'||ch >'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*w;
}
priority_queue<int >qu1;
priority_queue<int >qu2;
int main()
{
t = read();
while(t--)
{
while(!qu1.empty())qu1.pop();
while(!qu2.empty())qu2.pop();
int a;
n = read();
for(int i=1;i<=n;i++){a = read();qu1.push(a);}
for(int i=1;i<=n/2;i++){qu2.push(-qu1.top());qu1.pop();}
m = read();
for(int i=1;i<=m;i++)
{
cin >> c;
if(c[0]=='a')
{
cin>>a;
if(-qu2.top()<a)qu2.push(-a);
else qu1.push(a);
while(qu2.size()>qu1.size()-1)qu1.push(-qu2.top()),qu2.pop();
while(qu2.size()<qu1.size()-1)qu2.push(-qu1.top()),qu1.pop();
}
else cout<<qu1.top()<<endl;
}
}
}
秒过。。。。。
??????
??????
??????
别人都是把queue放在while里面随便过啊???
后来经过某大佬的讲解后。。发现是因为queue相当于一个大数组。。所以说最好不要把queue放在函数利用而是弄成全局变量再清空(虽然慢一些)。。。
至于为什么别人都没事就我挂了。。。
大佬也不知道。。。
感想
queue不要放主函数。。。。。。orz