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

原创粉丝点击