ITON
来源:互联网 发布:js 字符串替换 中文 编辑:程序博客网 时间:2024/05/22 01:42
关于标题
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