1. 程式人生 > >Important matches Gym - 101840I —— 二維莫隊

Important matches Gym - 101840I —— 二維莫隊

In the qualification rounds of the World Cup, there were two disjoint sets of teams S1 = [1, · · · , N] and
S2 = [1, · · · , M]. Given a matrix X that decides the importance of the match between team i ∈ S1
against team j ∈ S2 by the value Xi,j . S1 represents the rows of the matrix X, and S2 represents the
columns of the matrix X. We would like to answer Q queries, where each decides the importance of all
the matches played by all the teams from the subgroup [A, · · · , C] from S1 against all teams from the
subgroup [B, · · · , D] from S2, such that 1 ≤ A ≤ C ≤ N, 1 ≤ B ≤ D ≤ M. The importance of a set
of matches between two subgroups is determined by the median importance of all the matches between
the teams from the first subgroup against all the teams from the second group, namely the median of the
submatrix XA···C,B···D.
Input
The first line of the input contains a single integer 1 ≤ T ≤ 100 the number of test cases. Each test case
begins with a line containing 3 spaces separated integers N, M, Q. The importance matrix X is given by
the next N lines each containing M space separated integers. The remaining Q lines, each contains 4
space separated integers A, B, C, D of the query; where 1 ≤ N, M ≤ 200, 1 ≤ Q ≤ 10000, and for the
given importance matrix X, 1 ≤ Xi,j ≤ 2000 for all i, j.
Output
For each test case output a line displaying the case number, followed by Q lines each containing a single
integer, the importance of the matches of the corresponding query.
Example

important.in standard output
1
3 4 2
1 2 3 1
2 1 1 4
7 8 9 3
1 1 1 1
1 2 3 4
Case 1:
1
3
Note
• The median of a set of numbers is the middle element in the sorted list of the given set. If the set
has two middle elements, then we choose the second one. For example the median of {2, 1, 3} is 2
and the median of {4, 2, 3, 1} is 3.
• The second query asks for the median of the submatrix that is excluding the first column. This
submatrix contains the elements {2, 3, 1, 1, 1, 4, 8, 9, 3}, which has the sorted form {1, 1, 1, 2, 3,
3, 4, 8, 9}, therefore the median is 3.

題意:

給你一個矩陣,然後q個詢問,每次詢問給你l1,l2,r1,r2,分別是這個矩陣的上界下界,左界右界,問你這個矩陣的中值是什麼,就是大小最中間的那個數,若是1234就是3.

題解:

我也不知道是不是莫隊,但感覺像。由於他有4個變數,這時候就需要用xia JB排序法,簡稱亂排。然後右界往右移的時候就加上上界到下界在右界上的所有數,以此類推,然後就過了咦嘿嘿嘿

#include<bits/stdc++.h>
using namespace std;
int len;
struct node
{
    int up,down,l,r,id;
    bool operator< (const node& a)const
    {
        if(up/len==a.up/len)
        {
            if(l/len==a.l/len)
            {
                if(down/len==a.down/len)
                    return r<a.r;
                return down<a.down;
            }
            return l<a.l;
        }
        return up<a.up;
    }
}p[10005];
vector<int>vec;
int Map[205][205];
int ans[10050];
void addr(int up,int down,int r)
{
    for(int i=up;i<=down;i++)
        vec.push_back(Map[i][r]);
}
void adddown(int l,int r,int down)
{
    for(int i=l;i<=r;i++)
        vec.push_back(Map[down][i]);
}
void delr(int up,int down,int r)
{
    for(int i=up;i<=down;i++)
        vec.erase(lower_bound(vec.begin(),vec.end(),Map[i][r]));
}
void deldown(int l,int r,int down)
{
    for(int i=l;i<=r;i++)
        vec.erase(lower_bound(vec.begin(),vec.end(),Map[down][i]));
}
int main()
{
    freopen("important.in","r",stdin);
    int t;
    scanf("%d",&t);
    int cas=0;
    while(t--)
    {
        vec.clear();
        int n,m,q;
        len=min(sqrt(n),sqrt(m));
        scanf("%d%d%d",&n,&m,&q);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf("%d",&Map[i][j]);
        for(int i=1;i<=q;i++)
            scanf("%d%d%d%d",&p[i].up,&p[i].l,&p[i].down,&p[i].r),p[i].id=i;
        sort(p+1,p+1+q);
        int up=1,l=1,down=1,r=1;
        vec.push_back(Map[1][1]);
        for(int i=1;i<=q;i++)
        {
            while(r<p[i].r)
                r++,addr(up,down,r);
            while(down<p[i].down)
                down++,adddown(l,r,down);
            while(l>p[i].l)
                l--,addr(up,down,l);
            while(up>p[i].up)
                up--,adddown(l,r,up);
            sort(vec.begin(),vec.end());
            while(r>p[i].r)
                delr(up,down,r),r--;
            while(down>p[i].down)
                deldown(l,r,down),down--;
            while(l<p[i].l)
                delr(up,down,l),l++;
            while(up<p[i].up)
                deldown(l,r,up),up++;
            //cout<<"siz+1/2: "<<vec[(vec.size()+1)/2]<<endl;
            ans[p[i].id]=vec[vec.size()/2];
        }
        //for(int i=0;i<vec.size();i++)
            //printf("%d ",vec[i]);
        printf("Case %d:\n",++cas);
        for(int i=1;i<=q;i++)
            printf("%d\n",ans[i]);
    }
    return 0;
}