10.3 T2

原创 2017年10月03日 20:05:07
T2

给你一个n*m的矩阵,R=每一行最小值的最大值,C=每一列最大值的最小值,求最少修改多少数使R=C。
1 ≤ n, m ≤ 2, 000,0 ≤ Ai, j ≤ 1000,000

分析

呃。。。这题其实我用了一个fkcdalao讲的玄学方法。。。正解O(n*m)不过很麻烦。。。于是。。。蒟蒻打了一个卡过的排序+二分O(n*mlogn)。。。
好像还能用堆和线段树等等奇怪的方法,不过数据结构貌似都被卡了,开了O2后排序+二分很稳。。。


没错上面的都是废话
1、对每一行从小到大排序,f1取排序后每一列最大值
2、对每一列从大到小排序,f2取排序后每一行最小值
3、枚举R=C=x,容易发现x一定在矩阵中出现过否则不是最优
4、二分找有几个f1中最大值比x小,几个f2中的最小值比x大,加起来为x的答案
(这里需要特判一下,因为如果x是最大(小)的,并且x没有出现在矩阵中过,那么答案不是0而是1)

Code

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
bool flag1[3000005],flag2[3000005];
int n,m,type,a[2005][2005],f1[2005][2005],f2[2005][2005],maxx[2005],minn[2005];
long long read()
{
    char last='+',ch=getchar();
    while (ch<'0' || ch>'9') last=ch,ch=getchar();
    long long ans=0;
    while (ch<='9' && ch>='0')
    {
        ans=ans*10+(ch-48);
        ch=getchar();
    }
    if (last=='-') ans=-ans;
    return ans;
}
bool cmp(int x,int y)
{
    return x>y;
}
int find1(int x)
{
    int l=0,r=m;
    while (l<r)
    {
        //printf("%d %d\n", l, r);
        int mid=(l+r+1)>>1;
        if (maxx[mid]<x) l=mid;
        else r=mid-1;
    }
    return l;
}
int find2(int x)
{
    int l=0,r=n;
    while (l<r)
    {
        //printf("%d %d\n", l, r);
        int mid=(l+r+1)>>1;
        if (minn[mid]>x) l=mid;
        else r=mid-1;
    }
    return l;
}
int calc(int x)
{
    //printf("%d ",x);
    int s1=find1(x);
    //printf("%d ",s1); 
    int s2=find2(x);
    //printf("%d\n",s2);
    if (s1==0 && !flag1[x]) s1=1;
    if (s2==0 && !flag2[x]) s2=1;
    return s1+s2;
}
int main()
{
    freopen("exciting.in","r",stdin);
    freopen("exciting.out","w",stdout);
    n=read(),m=read(),type=read();
    for (int i=1; i<=n; i++)
        for (int j=1; j<=m; j++) a[i][j]=read();    
    for (int i=1; i<=n; i++)
    {
        for (int j=1; j<=m; j++) f1[i][j]=a[i][j];
        sort(f1[i]+1,f1[i]+1+m);
        flag1[f1[i][1]]=1;
    }
    for (int i=1; i<=m; i++)
    {
        for (int j=1; j<=n; j++) f2[i][j]=a[j][i];
        sort(f2[i]+1,f2[i]+1+n,cmp);
        flag2[f2[i][1]]=1;
    }
    for (int i=1; i<=m; i++) 
    {
        for (int j=1; j<=n; j++) maxx[i]=max(maxx[i],f1[j][i]);
        //printf("%d\n", maxx[i]);
    }
    for (int i=1; i<=n; i++)
    {
        minn[i] = 3000005;
        for (int j=1; j<=m; j++) minn[i]=min(minn[i],f2[j][i]);
        //printf("%d\n", minn[i]);
    }
    minn[0]=3000005;
    int ans=n*m;
    for (int i=1; i<=n; i++)
        for (int j=1; j<=m; j++)
        {
            ans=min(ans,calc(a[i][j]));
        }
    printf("%d\n",ans);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/adorkable_/article/details/78156020

T2定时器应用

  定时器T2有三种工作模式,其中MODE 2为波特率发生器。 1、Mode 2:波特率发生器串口方式1和3的波特率计算如下:波特率bps=振荡器频率freq/[32*(65536-(RCAP2H, ...
  • nataka
  • nataka
  • 2006-11-03 15:06:00
  • 2663

磁共振中的T1, T2 和 T2*的原理和区别

从物理的角度,要理解这几个概念的区别,需要对原子核的磁化有所了解,本文通过一些图示对这几个概念进行简明的介绍。 首先,磁共振最基本的原理就是氢原子核在磁场中自旋运动时所具有的量子力学特性。在一个均匀磁...
  • taigw
  • taigw
  • 2015-04-02 18:16:39
  • 25332

1)现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行?

public class ThreadTest { /** * @param args */ public static void main(String[] args) { // ...
  • keithq
  • keithq
  • 2014-10-29 11:58:23
  • 672

天敏T2四核增强版ROOT方法

T2四核增强版,兄弟刚买的,启动页面实在是过于“丰富多彩”,影视+教育+购物+游戏+应用,我想大多数用户购买机顶盒主要是看影视的,或者少数会玩游戏,用机顶盒购物基本没有吧!没办法,因为是“阿里云”系统...
  • insisted_search
  • insisted_search
  • 2015-05-29 22:25:53
  • 1737

SIP协议中的T1和T2

本文转载自:http://net.chinaunix.net/8/2008/10/21/1294575.shtml SIP协议中的T1和T2 因为SIP定义了自己的可靠性机制,所以可以使用不可靠...
  • wanglf1986
  • wanglf1986
  • 2016-09-01 09:50:08
  • 1047

翻译-关于为什么没有ArcSDE10.3

ArcSDE10,3 不存在以下是翻译:https://blogs.esri.com/esri/supportcenter/2015/02/11/where-is-the-install-for-ar...
  • yatsov
  • yatsov
  • 2017-05-30 11:38:24
  • 586

arcgis 10.3下载地址 Desktop Server

  • 2015年01月12日 11:12
  • 48B
  • 下载

现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行

这个线程问题通常会在第一轮或电话面试阶段被问到,目的是检测你对”join”方法是否熟悉。这个多线程问题比较简单,可以用join方法实现。 thread.Join把指定的线程加入到当前线程,可以将两个...
  • u014612521
  • u014612521
  • 2015-01-14 17:01:57
  • 2684

PostgreSQL-10.3

  • 2018年04月02日 11:26
  • 67.68MB
  • 下载

使用内部T2定时器制作时钟

使用内部T2定时器制作时钟   目标: 使用89c52内部T2定时器制作时钟,每10ms中断一次,自动装载初值,向上计数溢出。     定时器2的资料:   ...
  • qq910876301
  • qq910876301
  • 2013-10-09 20:18:50
  • 1559
收藏助手
不良信息举报
您举报文章:10.3 T2
举报原因:
原因补充:

(最多只允许输入30个字)