• [CSP-S模拟测试]:E(贪心)


    题目传送门(内部题48)


    输入格式

    第一行一个整数$n$。
    接下来$n$行每行两个整数$x_i,y_i$。


    输出格式

    一行一个整数表示答案。


    样例

    样例输入$1$:

    2
    3 7
    2 5

    样例输出$1$:

    2

    样例输入$2$:

    5
    5 15
    11 16
    16 34
    2 14
    9 17

    样例输出$2$:

    96


    数据范围与提示

    样例$1$解释:

    第一组球中权值为$3$的球染成红色,权值为$7$的球染成蓝色。
    第一组球中权值为$2$的球染成红色,权值为$5$的球染成蓝色。
    $(R_{max}-R_{min}) imes (B_{max}-B_{min})=(3-2) imes (7-5)=2$

    数据范围:

    对于前$10\%$的数据:$nleqslant 20$
    对于前$20\%$的数据:$nleqslant 50$
    对于前$40\%$的数据:$nleqslant 200$
    对于前$40\%$的数据:$nleqslant 2,000$
    对于所有数据:
    $1leqslant {10}^5$
    $1leqslant x_i,y_ileqslant {10}^9$


    题解

    考虑贪心。

    因为所有数中的最大值和最小值肯定会对答案做贡献,所以分为两种情况:

      $alpha.$最大值和最小值不是一种颜色,这时候我们只需要把每一组中的$x_i,y_i$中较小的一个选成蓝色,较大的选成红色即可。

      $eta.$最大值和最小值是一种颜色(设为红色),这时候我们要最小化蓝色的极差,枚举蓝色球的最小值,二分求出最大值即可。

    对于这道题的数据,只用考虑情况$alpha$即可,因为不确定我的代码的情况$eta$的正确性,所以下面代码只考虑了情况$alpha$。

    时间复杂度:$Theta(nlog n)$(情况$alpha$为$Theta(n)$)。

    期望得分:$100$分。

    实际得分:$100$分。


    代码时刻

    #include<bits/stdc++.h>
    using namespace std;
    int n;
    int minr=1<<30,minb=1<<30,maxr,maxb;
    int main()
    {
    	scanf("%d",&n);
    	while(n--)
    	{
    		int x,y;
    		scanf("%d%d",&x,&y);
    		if(x<y)x^=y^=x^=y;
    		minr=min(minr,x);
    		maxr=max(maxr,x);
    		minb=min(minb,y);
    		maxb=max(maxb,y);
    	}
    	cout<<1LL*(maxr-minr)*(maxb-minb);
    	return 0;
    }

    rp++

  • 相关阅读:
    BZOJ3672/UOJ7 [Noi2014]购票
    POJ3718 Facer's Chocolate Dream
    BZOJ1453:[WC]Dface双面棋盘
    BZOJ2957:楼房重建
    AtCoder Grand Contest 009 D:Uninity
    BZOJ2877:[NOI2012]魔幻棋盘
    BZOJ3065:带插入区间K小值
    BZOJ3489:A simple rmq problem
    浅谈主席树
    AtCoder Regular Contest 080 E:Young Maids
  • 原文地址:https://www.cnblogs.com/wzc521/p/11557395.html
Copyright © 2020-2023  润新知