B1029 Median (two points)

B1029 Median (25分)
//该题容易爆内存
2×2×10^5×(int)4/1024=1562.5kb
用两个数组存数据就会爆内存
但是第一次没注意内存的问题用分块法水过去了,也不晓得为啥≧ ﹏ ≦,网上看了别人的解法。

  • two points

20882701-736a312f00396827.png
最多占用1152KB
#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++;
    }
  • 分块

按理来讲应该过不了啊。。。


20882701-b252a8ff82ac7ea3.png
1964K超了啊( ̄﹏ ̄;)
#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值