鬼知道我有多蒟蒻,第五次发题解了

题目原地址点此进入

呜呜呜~今天在CSDN上看了好多大佬神犇的OI退役文,百感交集,故写篇题解振奋自己。

文章目录

  • 题目描述
  • 输入
  • 输出
  • 样例输入
  • 样例输出3
  • 题目大意
  • 暴力
  • 击破TLE!
  • 击破MLE!
  • AC代码

题目描述

To meet the ever-growing demands of his N (1 <= N <= 50,000) cows,
Farmer John has bought them a new soda machine. He wants to figure
out the perfect place to install the machine.

The field in which the cows graze can be represented as a one-dimensional
number line. Cow i grazes in the range A_i…B_i (1 <= A_i <= B_i;
A_i <= B_i <= 1,000,000,000) (a range that includes its endpoints),
and FJ can place the soda machine at any integer point in the range
1…1,000,000,000. Since cows are extremely lazy and try to move
as little as possible, each cow would like to have the soda machine
installed within her grazing range.

Sadly, it is not always possible to satisfy every cow’s desires.
Thus FJ would like to know the largest number of cows that can be
satisfied.

To demonstrate the issue, consider four cows with grazing ranges
3…5, 4…8, 1…2, and 5…10; below is a schematic of their grazing
ranges:

     1   2   3   4   5   6   7   8   9  10  11  12  13|---|---|---|---|---|---|---|---|---|---|---|---|-...aaaaaaaaabbbbbbbbbbbbbbbbbccccc           ddddddddddddddddddddd

Sample Output

As can be seen, the first, second and fourth cows share the point 5,
but the third cow’s grazing range is disjoint. Thus, a maximum of
3 cows can have the soda machine within their grazing range.
有N个人要去膜拜JZ,他们不知道JZ会出现在哪里,因此每个人有一个活动范围,只要JZ出现在这个范围内就能被膜拜,
伟大的JZ当然希望膜拜他的人越多越好,但是JZ不能分身,因此只能选择一个位置出现,他最多可以被多少人膜拜呢,
这个简单的问题JZ当然交给你了

输入

  • Line 1: A single integer: N
  • Lines 2…N+1: Line i+1 contains two space-separated integers: A_i and B_i

输出

  • Line 1: A single integer representing the largest number of cows
    whose grazing intervals can all contain the soda machine.

样例输入

4
3 5
4 8
1 2
5 10

样例输出3

OUTPUT DETAILS:
If the soda machine is placed at location 5, cows 1, 2, and 4 can be
satisfied. It is impossible to satisfy all four cows.

题目大意

其实这道题目意思很简单啦,就是给你一个极长的一根线段,然后选取n组点[x,y]并在此区间染色,求染色次数最多是多少?
本题推荐按此流程做:
校门外的树
光线
Soda Machine

暴力

其实这题暴力很简单的,直接开一个数组在[x,y]这段区域内权值+1就行,但是很显然,虽然染色次数n不多只有50000,但因为染色区域过长会造成极其严重的超时!

击破TLE!

刚刚我们说到,这个题主要超时的原因是因为染色区域过长每一次染色区域最多可以达到近十亿个单位长度,所以我们应克服的问题就是这里,如何优化每一次染色呢?这就需要引进差分思想

这个题其实你有感觉是要用前缀和的,但是似乎没什么屁用,其实不然,事实上染色的本质就是将[x,y](x<=y)
这一段凸显出来,使它看起来更特别,为了“看上去”是“特别”的,我们除了将它们全部打上标记,也可以在染色的两个端点打上标记(因为染色段是连续的,只要确定两端点那么这种染色方式就被唯一确定),即x和y;

但是这一题我们打标记的方式有所不同,我们应该开一个整形变量的数组而不是逻辑数组用于记录区域之间被染色的次数,假设这个数组为k,我们要给k[x]——k[y]之间的区域染色,事实上只要将k[x]+1,将k[y+1]-1,再求一遍前缀和,那么k[x]——k[y]就被全部加了(对于初始状态数组中全赋值为0时,该操作将[x,y]之间全赋值为1)。

一样的,对于样例数据来说。我们可以画出如下表格:

然后求一遍前缀和。

可以看出在哪个位置被染了几次,并且最大值为3.
伪代码如下:

for(int i=1;i<=n;i++)scanf("%d%d",&a,&b),ch[a]++;ch[b+1]--;
fh[1]=ch[1];
for(int i=2;i<=n;i++)
{fh[i]=fh[i-1]+ch[i];if(fh[i]>=1)ans++;
}
cout<<ans<<endl;//可以加一个快读

然而肯定会爆内存(fh[1,000,000,000],最多只能开33,000,000左右)

击破MLE!

综上所述,这一题实在是忒恶心,不仅需要用到差分,还要用离散化!(虽然比这恶心的题目多了去了)

仔细阅读题面,我们可以发现染色的两个端点的数值实际意义并不大,重要的是他们的相对意义,就比方说1,200,3000,4000,99999999,232-1这一组数据,在本题来看,其实和1,2,3,4,5没有太大的区别,所以我们可以对过大的数据进行转化,在不改变相对大小的情况下改变其本身大小,而这恰好就是离散化操作!

离散化的大致思想是:先将数据排序,然后将排完序后的数组a[i]赋值为i,再将这个值放回原先未排序数组的位置处
流程:6 8 9 4

  1. 4 6 8 9(原位置:4 1 2 3)
  2. 1 2 3 4(原位置:4 1 2 3)
  3. 2 3 4 1 (将1放到第4位,将2放到第1位,将3放到第2位,将4放到第3位,就有如下结果)

所以代码应该这么写:

struct wssb{int x,idx;}a[200001];//x表示权值,idx表示位置
bool cmp(wssb a,wssb b){return a.x<b.x;}//cmp函数
int lsh[200001];//离散化结果
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i)
{scanf("%d",&a[i].x);a[i].idx=i;//记下其位置
}
sort(a+1,a+n+1,cmp);//把数据按照其权值排序,相当于上述第一个步骤。
for(int i=1;i<=n;++i)lsh[a[i].idx]=i;//注:这里将上述的第二个步骤和第三个步骤合并了

终于克服了这两大难题,成功AC!

AC代码

//注:AC代码会根据题面而相对于前面的伪代码有所调整,前面讲的只是模版代码。
#include <bits/stdc++.h>
using namespace std;
int n,cnt,ans,x1,x2;
int lsh[200001],k[200010];
struct wssb{int x,idx;}a[200001];
bool cmp(wssb a,wssb b){return a.x<b.x;}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%d",&x1,&x2);a[++cnt].x=x1;a[++cnt].x=x2;a[cnt-1].idx=cnt-1;a[cnt].idx=cnt;}sort(a+1,a+cnt+1,cmp);for(int i=1;i<=cnt;i++){lsh[a[i].idx]=i;if(a[i].x==a[i-1].x)lsh[a[i].idx]--;}for(int i=1;i<=n;i++)k[lsh[2*i-1]]++,k[lsh[2*i]+1]--;for(int i=1;i<=2*n+1;i++)k[i]=k[i]+k[i-1],ans=max(ans,k[i]);printf("%d\n",ans);return 0;
}

希望得到神犇的指教。

[usaco2010 Oct]Soda Machine (入门oj Problem 6195 )相关推荐

  1. [Usaco2010 Hol]cowpol 奶牛政坛(入门oj Problem 5274)

    第三次发题解哈.有什么表述错误的请见谅(可以提出). 题目源地址:https://www.lydsy.com/JudgeOnline/problem.php?id=1776 文章目录 题目描述 输入 ...

  2. 2019.6.7 一场搜索专题的考试【including 洛谷·血色先锋队,入门OJ·兴建高铁,珠光宝气阁

    这次分数还好.但全是搜索题还没上200就有点打击人了--[本狸才177QAQ 血色先锋队/血色敢死队 传送门:洛谷P1332 & 入门OJ P2259 Description 邪魔天国领主复活 ...

  3. [USACO10OCT]汽水机Soda Machine

    题意翻译 为了满足fj所有的N(1<=n<=50000)头奶牛的需求,fj新买了一台汽水机.他想找到一个最完美的位置来安放它. 奶牛的牧场可以被表示为一个一维数轴,第i个奶牛被放牧的区间是 ...

  4. YTU OJ Problem 3013

    YTU OJ Problem 3013 皇后问题(递归) 题目描述 编写一个函数,求解皇后问题:在 n × n 的方格棋盘上,放置 n 个皇后,要求每个皇后不同行.不同列.不同左右对角线. 要求: 1 ...

  5. YTU OJ Problem 2013

    YTU OJ Problem 2013 C语言实验 - 一元二次方程 II 题目描述 求一元二次方程ax²+bx+c=0 的解. a,b,c为任意实数. 输入 输入数据有一行,包括 a,b,c 的值. ...

  6. 【bzoj 入门OJ】[NOIP 热身赛]Problem C: 星球联盟(并查集)

    Problem C: 星球联盟 Time Limit: 4 Sec  Memory Limit: 256 MB Submit: 57  Solved: 15 [Submit][Status][Web ...

  7. 华农oj Problem K: 负2进制【有技巧构造/待补】

    Problem K: 负2进制 Time Limit: 2 Sec Memory Limit: 128 MB Submit: 51 Solved: 6 [Submit][Status][Web Boa ...

  8. Boltzmann Machine 入门(1)

    根据我的第一篇关于DBM的博文,明白了一个道理,1. v 和h 互相能推测出彼此,表示同一组特征的两种形式,就像时域频域一样.接下来又看了 http://www.cnblogs.com/tianchi ...

  9. 问题 J: [入门OJ]求和 为 C(初中生请多多指教)

    时间限制: 1 Sec  内存限制: 256 MB 题目描述 楠楠在网上刷题,感觉第一题:求两数的和(A+B Problem)太无聊了,于是增加了一题:求和为C的Problem,难倒了一群小朋友,哈哈 ...

最新文章

  1. Caffe源码中syncedmem文件分析
  2. python中List的sort方法(或者sorted内建函数)的用法
  3. SSH连接两台虚拟机、秘钥免密登录
  4. Scrapy Learning笔记(四)- Scrapy双向爬取
  5. ubuntu下安装android ndk
  6. Spring Security相关
  7. js forEach跳出循环
  8. 概念数据模型到逻辑数据模型的转化
  9. 浏览器事件:为什么会有捕获过程和冒泡过程?
  10. APP测试概念/Appium实战
  11. Nature子刊:机器学习方法扩展了anti-CRISPR蛋白家族的所有成员
  12. 国内有哪些比较靠谱的云服务器?
  13. ip route常用语法
  14. 老卫带你学---CMake Error: CMake was unable to find a build program corresponding to MinGW Makefiles. CM
  15. 机器人抓取(二)—— ROS 控制 onrobot RG2 / RG6 机械手(第二代)
  16. 高屋建瓴 08年IT产业38个黄金技术
  17. linux csh 安装,linux安装gcc的shell脚本
  18. 细数企业网站建设中那些不成文的规范
  19. 语音论文中英语的高级表达(持续更新ing...)
  20. Jenkins之路(一):Jenkins安装

热门文章

  1. 华为悦盒EC6108V9通刷固件及教程
  2. 基于QT实现的可视化链表(单链表、循环链表、双向链表)
  3. ISO3834认证所需的部分标准
  4. 交易者应该学习的东西
  5. 关于JDK8发送邮件失败的问题
  6. Debain 安装SVN服务器 支持http/https 全程指导
  7. 如何建立网站登录系统?
  8. 苹果xsmax怎么开机_苹果xsmax触屏不灵敏,xsmax触屏失灵怎么回事
  9. 2019年AI领域回顾:稳定发展还是幻想破灭?
  10. 原生高性能抓包工具Proxyman,送给爱学习的你