传送门

https://www.cnblogs.com/violet-acmer/p/9859003.html

这次比赛,上来还是死抠第一题,用了一个半小时才 AC,还是太菜了..................

题意:

  一共有 n 艘船,每艘船都有一个到港时间,每艘船上有 k 个人,这 k 个人可能来自多个不同的国家;

  求以当前船只为终了时间,在这之前的 24 小时内,到港的所有船只中所承载的乘客来自多少个国家?

题解:

  相关变量解释:

    arrive[maxn]........................................arrive[ i ] : 第 i 艘船到港的时间

    affect[maxn].........................................affect[ i ] : i 国籍为所影响的范围,但不包括其本身

    vector<int >ship[maxn].........................ship[ i ] : 第 i 艘船上所承载的乘客国籍信息

    diff[maxn].............................................差分数组

  因为 k1+k2+.......+k2 <=  3e5,所以用vector存不会超内存。

  1.去重

    因每艘船的 k 个人可能有来自同一国家的乘客,所以先去一下重

      sort(ship[i].begin(),ship[i].end());

      ship[i].erase(unique(ship[i].begin(),ship[i].end()),ship[i].end());

  2.找到每艘船的乘客所能影响的最大范围

    这是什么意思呢?

    例如,第一艘船去重后,乘客分别来自 1,2,4 国家,由于所要求得是以当前船只为终了时间,在这之前的 24 小时内,

    到港的所有船只中所承载的乘客来自多少个国家;

    换句话说,当前船只的乘客只能影响这之后的 24 小时内到达的船只(不包含第 24 小时到达的船只)。

    所以第一艘船的 1 乘客的影响范围为[1,1+86400),此时,记 affect[1]=1+86400,但 1 所影响的范围不包括 affect[1]本身

    同理,第 2,4 乘客的影响范围也为[1,1+86400)

    当来到第二艘船的时候,去重后,乘客分别来自 2,3 国家,而当前船只到港时间为 2 ,affect[2]=1+86400 > 2,所以受之前

    船只的影响,国籍为 2 的乘客并不会对[2,1+86400)造成影响,而当前的 2 乘客可以影响的范围为 [2,2+86400),所以需要

    在之前的范围[1,1+86400)上加上范围[1+86400,2+86400),即加上[affect[2], 2+86400),并将affect[2]更新为2+86400。

  3.求解

    但要如何记录以当前船只为终了时间的前 24 小时内的不同国家的乘客人数呢?

    由题干可知,t <= 1e9,难不成要开个 1e9 大的数组,显然是不可行的,那该怎么办呢?

    看题干,保证所输入的 t 是递增的,而 n <= 1e5,所以可以将affect[ i ]中乘客 i 的影响范围由之前的时间区间变为船只编号,如何变呢?

    还是以样例为例:

    一共有 3 艘船,每艘船的到港时间分别为 1,2,10

    第一艘船的乘客可以影响的时间范围为[1,1+86400),也就是说,只要到港时间在[1,1+86400)范围内的船只,都可以影响到,而后两艘船

    的到港时间都在这个时间范围内,所以将 affect[1]=affect[2]=affect[4]=4,意思是第一艘船的第 1,2,4乘客可以影响到前三艘船。

    来到第二艘船,其乘客国籍为 2,3,但affect[2]=4 > 2,说明在这之前的 24 小时内,有船只载有 2 国家的乘客,所以当前船只的 2 乘客能

    影响的范围变为[affect[2],end),end 指的是到港时间 >= 2+86400 最近的一艘船编号,易得 end = 4。

    其余的船只同理。

    因为每艘船只的到港时间是递增的,所以每次查找可以使用二分。

    而第 i 艘船上的每个乘客的影响范围可以用树状数组或线段树来维护;

    而我选择了一个比较方便的差分数组,何为差分数组,详情请看http://www.cnblogs.com/widsom/p/7750656.html

AC代码:

 #include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define lowbit(x) (x&(-x))
#define mem(a,b) memset(a,b,sizeof a)
const int maxn=1e5+; int n;
int arrive[maxn];
int affect[maxn];
vector<int >ship[maxn];
int diff[maxn];
void Solve()
{
mem(affect,);
mem(diff,);
for(int i=;i <= n;++i)
{
//t : 到港时间 >= arrive[i]+86400 的最近的一艘船的编号
int t=lower_bound(arrive+i,arrive+n+,arrive[i]+)-arrive;
for(int j=;j < ship[i].size();++j)
{
int native=ship[i][j];
if(affect[native] < i)//判断一下affect[native]影响的范围是否包含当前船只 i
affect[native]=i;//如果不包含,则当前乘客的影响范围从当前船只开始
diff[affect[native]]++;//当前乘客的影响范围为 [affect[native],t)
diff[t]--;
affect[native]=t;//更新affect[native]
}
}
for(int i=;i <= n;++i)
{
diff[i] += diff[i-];//一遍前缀和为元素本身,也就是以当前船只为终了时间的前24小时内的来自不同国家的个数
printf("%d\n",diff[i]);
}
}
int main()
{
scanf("%d",&n);
for(int i=;i <= n;++i)
{
int t,k;
scanf("%d%d",&t,&k);
arrive[i]=t;
for(int j=;j <= k;++j)
{
int native;
scanf("%d",&native);
ship[i].pb(native);
}
sort(ship[i].begin(),ship[i].end());
ship[i].erase(unique(ship[i].begin(),ship[i].end()),ship[i].end());
}
Solve();
}
/**
5
1 4 4 1 2 2
2 2 2 3
10 1 3
100000 5 1 2 3 4 5
100001 5 1 2 3 4 6
**/

NOIP 普及组 2016 海港的更多相关文章

  1. NOIP 普及组 2016 回文日期

    传送门 https://www.cnblogs.com/violet-acmer/p/9859003.html 题解: 思路1: 相关变量解释: year1,month1,day1 : date1对应 ...

  2. 2016.8.15上午纪中初中部NOIP普及组比赛

    2016.8.15上午纪中初中部NOIP普及组比赛 链接:https://jzoj.net/junior/#contest/home/1333 这次比赛不怎么好,因为这套题目我并不是很擅长. 可同学们 ...

  3. 2016.9.15初中部上午NOIP普及组比赛总结

    2016.9.15初中部上午NOIP普及组比赛总结 2016.09.15[初中部 NOIP普及组 ]模拟赛 又翻车了!表示时超和空超很可恨! 进度 比赛:AC+0+0+20=120 改题:AC+80+ ...

  4. 2016.9.10初中部上午NOIP普及组比赛总结

    2016.9.10初中部上午NOIP普及组比赛总结 链接:https://jzoj.net/junior/#contest/home/1340 好不爽!翻车了!不过排名差不多在中间偏上一点, 还好不是 ...

  5. 2016.9.3初中部上午NOIP普及组比赛总结

    2016.9.3初中部上午NOIP普及组比赛总结 链接:https://jzoj.net/junior/#contest/home/1339 这次真爽,拿了个第四!(我还被班主任叫过去1小时呢!) 进 ...

  6. 2016.8.19上午初中部NOIP普及组比赛总结

    2016.8.19上午初中部NOIP普及组比赛总结 链接:https://jzoj.net/junior/#contest/home/1338 这次总结发得有点晚啊!我在这里解释一下, 因为浏览器的问 ...

  7. 2016.8.18上午纪中初中部NOIP普及组比赛

    2016.8.18上午纪中初中部NOIP普及组比赛 链接:https://jzoj.net/junior/#contest/home/1336 翻!车!啦!好吧,那是因为大神归来. 进度: 比赛:AC ...

  8. 2016.8.17上午纪中初中部NOIP普及组比赛

    2016.8.17上午纪中初中部NOIP普及组比赛 链接:https://jzoj.net/junior/#contest/home/1335 本来觉得自己能考高分,但只得160分,并列第九.至少又挤 ...

  9. 2016.8.16上午纪中初中部NOIP普及组比赛

    2016.8.16上午纪中初中部NOIP普及组比赛 链接:https://jzoj.net/junior/#contest/home/1334 这次也翻车了,感觉比之前难多了. 辛辛苦苦改完了,太难改 ...

随机推荐

  1. linux-文件流4种读取方式

    第二种方式 第三种 第四种: 小括号在管道符的右边开辟了两个子进程 大括号在管道符的右边开辟了一个子进程, export 用来导出子进程的 num 还可以借助外部文件进行 七步扩展:

  2. 牛客OI赛制测试赛-序列-模拟

    哇这道题好坑啊,可能是我太菜了 题意就是叫把一个连续序列分成K组,使得每个组的和都相等 我最开始的想法是由于要分成K组,那我们知道,每组一定有sum(a[i])/k这样我们只需要每次当num==sum ...

  3. Scrum Meeting 5

                第五次会议 No_00:工作情况 No_01:任务说明 待完成 已完成 No_10:燃尽图 No_11:照片记录 待更新 No_100:代码/文档签入记录 No_101:出席表 ...

  4. Linux内核分析第八周总结

    第八章 进程的切换和系统的一般执行过程 进程调度与进程调度的时机分析 第一种分类: I/O密集型(I/O-bound):频繁的进行I/O,通常会花费很多时间等待I/O操作的完成 CPU密集型(CPU- ...

  5. C# wkhtmltopdf 将html转pdf(详解)

    https://www.cnblogs.com/louby/p/905198.html转自,看文章只放了代码看起来云里雾里的,在此做些解析 使用说明: 1.首先呢,得安装下软件,地址下面有链接,文件里 ...

  6. <<浪潮之巅>>阅读笔记一

    第一次的阅读就想读这本书的,却因为很多愿意一直拖到现在,因为听说这本书在李开复先生 的微博上有推荐,更是增加了我的阅读兴趣.可能是因为在网上找的电子版的原因,通篇阅读的速度很快,但是没有纸质数那种细嚼 ...

  7. 猜字游戏java

    一.实践目的 1.掌握基本输入输出. 2.掌握方法定义与调用,理解参数传递方式. 3.掌握数组的声明.定义与初始化,数组的处理. 4.掌握数组作为方法参数和返回值. 二.实践要求 利用方法.数组.基本 ...

  8. 请求数据传入(SpringMVC)

    1.    请求处理方法签名 Spring MVC 通过分析处理方法的签名,HTTP请求信息绑定到处理方法的相应人参中. Spring MVC 对控制器处理方法签名的限制是很宽松的,几乎可以按喜欢的任 ...

  9. 第八章Jdk代理 cglib代理

    什么是代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 这 ...

  10. Golang的格式化输出fmt.Printf

    本文来源:Go by example. Golang的格式化输出 和 C语言的标准输出基本一样,但是增加了一些针对Golang语言的特有数据结构的格式化输出方式. 一下就是实例: package ma ...