首页 > 其他分享 >洛谷题单指南-前缀和差分与离散化-P3029 [USACO11NOV] Cow Lineup S

洛谷题单指南-前缀和差分与离散化-P3029 [USACO11NOV] Cow Lineup S

时间:2024-08-01 17:30:45浏览次数:18  
标签:USACO11NOV Cow int 洛谷题 离散 ++ cnt2 cnt1 ans

原题链接:https://www.luogu.com.cn/problem/P3029

题意解读:不同的坐标位置有不同种类的牛,要计算一个最小的区间,包括所有种类的牛。

解题思路:

由于坐标位置不连续,并且数值范围较大,因此需要离散化处理,将坐标处理成1~n连续分布

由于种类编号数值范围也比较大,也需要离散化处理,去重后的种类数量记为cnt2

设t[i] = x表示离散化之后,第i个坐标位置是x类型的牛

这样一来,问题简化成:在t[]中,找到一个区间,使得区间内包括cnt2种不同数字,并且区间端点l,r在离散化之前的差值最小,

通过双指针+哈希数组即可解决。

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 50005;
int x[N], id[N], t[N], h[N];
int a[N], cnt1, b[N], bb[N], cnt2;
map<int, int> ha, hb;
int n, ans = INT_MAX;

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        cin >> x[i] >> id[i];
        a[++cnt1] = x[i];
        b[++cnt2] = id[i];
    }
    //对a排序、不用去重,牛不会在同一个位置
    sort(a + 1, a + cnt1 + 1);
    //对b排序、去重
    sort(b + 1, b + cnt2 + 1);
    int j = 0;
    for(int i = 1; i <= cnt2; i++)
    {
        if(i == 1 || b[i] != b[i - 1])
        {
            bb[++j] = b[i];
        }
    }
    cnt2 = j;
    //a离散化
    for(int i = 1; i <= cnt1; i++) ha[a[i]] = i;
    //bb离散化
    for(int i = 1; i <= cnt2; i++) hb[bb[i]] = i;
    //将x替换为离散化后的值
    for(int i = 1; i <= n; i++) x[i] = ha[x[i]];
    //将id替换为离散化后的值
    for(int i = 1; i <= n; i++) id[i] = hb[id[i]];
    //将坐标位置对应的牛种类填入数组t
    for(int i = 1; i <= n; i++) 
    {
        t[x[i]] = id[i];
    }
    //双指针找包含cnt2个不同整数的最小区间
    int l = 1, r = 0, cnt = 0;
    while(l <= n && r <= n)
    {
        while(r <= n && h[t[l]] <= 1)
        {
            h[t[++r]]++;
            if(h[t[r]] == 1) cnt++;
            if(cnt == cnt2) ans = min(ans, a[r] - a[l]);
        }
        while(h[t[l]] > 1)
        {
            h[t[l++]]--;
            if(cnt == cnt2) ans = min(ans, a[r] - a[l]);
        }
    }
    cout << ans;
    return 0;
}

 

标签:USACO11NOV,Cow,int,洛谷题,离散,++,cnt2,cnt1,ans
From: https://www.cnblogs.com/jcwy/p/18337102

相关文章

  • 洛谷题单指南-前缀和差分与离散化-P4552 [Poetize6] IncDec Sequence
    原题链接:https://www.luogu.com.cn/problem/P4552题意解读:对一组数字序列,进行若干次区间+1或者-1操作,最终使得所有数字一样,计算最少的操作次数,以及能得到多少种不同序列。解题思路:要使得序列每一个数字都相同,则其差分除了第一项之外其余项都是0。因此,问题转化为:给定一个差分数......
  • 洛谷题单指南-前缀和差分与离散化-P2882 [USACO07MAR] Face The Right Way G
    原题链接:https://www.luogu.com.cn/problem/P2882题意解读:一个有F、B组成的序列,每次可以翻转k个连续子序列,翻转:F->B,B->F,计算最少翻转多少次可以将序列都变成F,并求相应的k。解题思路:为方便处理,设F为1,B为01、朴素做法枚举k:1~n  枚举序列,一旦遇到0,就将连续k个字符翻转,如果可......
  • [USACO5.1] 圈奶牛Fencing the Cows /【模板】二维凸包
    凸包,顾名思义,就是凸多边形包围,具体定义见OI-wiki(既是周长最小也是面积最小)有Graham算法和Andrew算法,后者精度更高常数更小(因为不涉及求角度)Andrew算法:1.将点排序(横坐标为第一关键字,纵坐标为第二关键字)2.从左到右维护上半部分,再从右到左维护下半部分。具体见OI-wiki。最后说的......
  • 洛谷题单指南-前缀和差分与离散化-P1083 [NOIP2012 提高组] 借教室
    原题链接:https://www.luogu.com.cn/problem/P1083题意解读:已知第i天有r[i]个教室可以供租借,有m个租借教室的订单,第i订单需要在第s[i]~t[i]天区间内租借d[i]个教室,计算是否全部订单都能满足,如果不满足要输出从第几个订单开始不满足。解题思路:1、朴素做法枚举1~m个订单,通过差分......
  • 洛谷题单指南-前缀和差分与离散化-P3406 海底高铁
    原题链接:https://www.luogu.com.cn/problem/P3406题意解读:1-n个城市共了n段路,第i段路不买卡票价a[i],买卡票价b[i](卡本身花费c[i]),给定一个路程顺序,计算最少的通行费用。解题思路:根据路程,计算每段路各走了多少次,然后对于每段路,计算买卡和不买卡两种花费,取较小的累加即可。如何......
  • 洛谷题单指南-前缀和差分与离散化-P3017 [USACO11MAR] Brownie Slicing G
    原题链接:https://www.luogu.com.cn/problem/P3017题意解读:将一个r*c的矩阵,横向切成a条,每一条纵向切除b块,计算每一块子矩阵之和的最小值最大是多少。解题思路:要计算最小值中最大的,直觉上可以采用二分,下面来分析单调性:给定一个子矩阵块之和的值,值越小可以划分的条数、块数就越多......
  • 洛谷题单指南-前缀和差分与离散化-P2004 领地选择
    原题链接:https://www.luogu.com.cn/problem/P2004题意解读:在一个n*m的矩阵中,找到边长为c的正方形,使得正方形范围内的数之和最大,输出正方形的左上角坐标。解题思路:二维前缀和的简单应用第一步:计算二维前缀和第二步:枚举边长为c的正方形左上角,计算正方形区域的数之和,更新答案第......
  • 洛谷题单指南-前缀和差分与离散化-P1884 [USACO12FEB] Overplanting S
    原题链接:https://www.luogu.com.cn/problem/P1884题意解读:给定n个矩形的平面直角坐标系下左上角、右下角的坐标,计算这n个矩形能覆盖的的格子数。解题思路:直观上来看,此题是一个差分应用,针对二维差分数组,将n个矩形区域内每个格子的值加1,然后统计有多少个不为0的格子即可。但是!坐......
  • 洛谷题单指南-前缀和差分与离散化-P1496 火烧赤壁
    原题链接:https://www.luogu.com.cn/problem/P1496题意解读:给定n个区间[a,b),计算所有区间覆盖的总长度。解题思路:方法1、离散化先思考一种比较直观的思路:既然要计算多个区间覆盖的总长度,可以枚举每一个区间[a,b),通过一个桶数组来标记区间中所有的点f[x]=1,最终统计所有为1的......
  • 洛谷题单指南-前缀和差分与离散化-P3397 地毯
    原题链接:https://www.luogu.com.cn/problem/P3397题意解读:给定一个n*n的矩阵,每个元素初始值为0,再将m个子矩阵中的元素都增加1,统计每个元素最终的值。解题思路:1、暴力法枚举每一个子矩阵,将对应元素值加1,时间复杂度为1000^3,不可行。2、二维差分对于给定二维数组s[][],给指定区......