B1029 Median (25分)
//该题容易爆内存
2×2×10^5×(int)4/1024=1562.5kb
用两个数组存数据就会爆内存
但是第一次没注意内存的问题用分块法水过去了,也不晓得为啥≧ ﹏ ≦,网上看了别人的解法。
-
two points
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string.h>
#include <cmath>
#include <math.h>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <stack>
#define lowbit(i)((i)&(-i))
using namespace std;
typedef long long ll;
const int MAX=200005;
const int INF=0x3f3f3f3f;
const int MOD=1000000007;
const int SQR=633;//每块632个,共633块
int c[MAX];
int main()
{
int n,m,tol=0,mid,j=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&c[i]);
}
c[n]=INF;
scanf("%d",&m);
mid=(n+m+1)/2;
for(int i=0;i<m;i++)
{
int temp;
scanf("%d",&temp);
while(temp>c[j])
{
tol++;
if(tol==mid)
printf("%d",c[j]);
j++;
}
tol++;
if(tol==mid)
printf("%d",temp);
}
while(j<=n)
{
tol++;
if(tol==mid)
printf("%d",c[j]);
j++;
}
-
分块
按理来讲应该过不了啊。。。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string.h>
#include <cmath>
#include <math.h>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <stack>
#define lowbit(i)((i)&(-i))
using namespace std;
typedef long long ll;
const int MAX=400005;
const int INF=0x3f3f3f3f;
const int MOD=1000000007;
const int SQR=633;//每块632个,共633块
int table[MAX];
int blocks[SQR];
void fenkuai(int k)
{
int sum=0;
int idx=0;
while(sum+blocks[idx]<k)
{
sum+=blocks[idx++];
}
int num=idx*632;
while(sum+table[num]<k)
{
sum+=table[num++];
}
printf("%d\n",num);
}
int main()
{
int n,tol=0;
memset(table,0,sizeof(table));
memset(blocks,0,sizeof(blocks));
for(int i=0;i<2;i++)
{
scanf("%d",&n);
tol+=n;
int t;
for(int j=0;j<n;j++)
{
scanf("%d",&t);
table[t]++;
blocks[t/632]++;
}
}
if(tol%2==0)
{
tol/=2;
}
else
tol=(tol+1)/2;
//求第tol大
fenkuai(tol);
return 0;
}