码迷,mamicode.com
首页 > 其他好文 > 详细

SDKD 2017 Summer Team Training #12, tm ( Yet Another Median Task )

时间:2017-08-23 15:54:59      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:const   span   二分   ems   namespace   tor   题目   other   blog   

题目大意:给定一个矩阵,给你多次查询,查询一个小矩阵中的数的中位数;

解题思路:完全没往二分上想,我们可以二分枚举中位数数值,搜索矩阵中数值小于中位数的个数。

#include <cstdio>
#include <iostream>
#include <string.h>
#include <string> 
#include <map>
#include <queue>
#include <vector>
#include <set>
#include <algorithm>
#include <math.h>
#include <cmath>
#include <stack>
#define mem0(a) memset(a,0,sizeof(a))
#define meminf(a) memset(a,0x3f,sizeof(a))
using namespace std;
typedef long long ll;
typedef long double ld;
const int maxn=805,inf=0x3f3f3f3f;  
const ll llinf=0x3f3f3f3f3f3f3f3f;   
const ld pi=acos(-1.0L);  
int a[maxn][maxn];
int p[maxn*maxn];

int main() {
    int n,i,j,k,l,r,u,d,q;
    ll m=-llinf,w=llinf;
    scanf("%d%d",&n,&q);
    for (i=1;i<=n;i++) {
        for (j=1;j<=n;j++) {
            scanf("%d",&a[i][j]);
            m=max(m,(ll)a[i][j]);
            w=min(w,(ll)a[i][j]);
        }
    }
    for (i=1;i<=q;i++) {
        scanf("%d%d%d%d",&u,&l,&d,&r);
        int lc=w,rc=m,mid,tot=(r-l+1)*(d-u+1),ans;
        if (tot%2) tot/=2; else tot=tot/2-1;
        while (lc<=rc) {
        int cnt=0;
        mid=(lc+rc)/2;
        for (j=u;j<=d;j++) {
            for (k=l;k<=r;k++) {
                if (a[j][k]<mid) cnt++;
            }
        }
        if (cnt<=tot) lc=mid+1,ans=mid; else {
            rc=mid-1;
        }
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

SDKD 2017 Summer Team Training #12, tm ( Yet Another Median Task )

标签:const   span   二分   ems   namespace   tor   题目   other   blog   

原文地址:http://www.cnblogs.com/Star-Gazer/p/7418538.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!