标题效果:

每个人都应该申请签证必须向大使馆3种程序,而这3个步骤做的顺序是固定的。通过各种形式的手续给出多少,它需要对每个过程的处理时间,有多少人会来办理手续,什么时间来。要求的是全部人分别在大使馆待的最长时间是多少。

做法:

一种贪心的做法,由于仅仅有三种手续,那么每一个人进入办理的时候,保证选办理同种手续的全部窗体中最早等待的那一个窗体(为什么会有等待?由于该窗体办完了上一个,而下一个没能立即到这一个窗体)。接下来对每一个人分开处理,计算出每一个人从进入大使馆到办完三种手续离开大使馆须要多少时间。最后去最大的一个即可。

那么关键点就是怎么计算出这个时间。

前面已经提到。仅仅须要去每种窗体最早等待的那一个窗体就可以,那么这种话。我们须要知道同种类型的窗体的处于等待的时间的最小值。而且改动这个最小值。

涉及到这种操作的话,那当然想到了线段树。

我们用三个线段树,分别处理不同类型的窗体的信息。

那有人会想,窗体的个数不是多达10^9个吗?怎么建立这种线段树?事实上这仅仅是个障眼法,总人数最多仅仅能由10^5个,那么最多会用到的窗体最多也就10^5个而已。我们建立树的时候仅仅须要建立窗体数和人数的较小值就可以。那这样终于复杂度为O(n*logn)。

代码:
#include <iostream>
#include <cstdio>
#include <climits>
#include <algorithm>
#define N 100010
#define L(x) (x)<<1
#define R(x) (x)<<1|1
using namespace std;
struct node
{
long long ll,rr,mi,pos;
node()
{
ll=rr=pos=0;
mi=INT_MAX;
}
node(long long l,long long r,long long m,long long p)
{
ll=l,rr=r,mi=m,pos=p;
}
}ty[4][N*4];
long long k[4][N],n[4],t[4],peo[N];
long long nn;
void bulid(long long id,long long l,long long r,long long na)
{
ty[na][id]=node(l,r,0,l);
if(l==r) return ;
long long mid=(l+r)/2;
bulid(L(id),l,mid,na);
bulid(R(id),mid+1,r,na);
}
void update(long long id,long long k,long long a,long long na)
{
if(k==ty[na][id].ll && ty[na][id].rr==k){ty[na][id].mi=a;return ;}
long long mid=(ty[na][id].ll+ty[na][id].rr)/2;
if(k>mid) update(R(id),k,a,na);
else update(L(id),k,a,na);
if(ty[na][L(id)].mi<=ty[na][R(id)].mi)
{
ty[na][id].mi=ty[na][L(id)].mi;
ty[na][id].pos=ty[na][L(id)].pos;
}
else
{
ty[na][id].mi=ty[na][R(id)].mi;
ty[na][id].pos=ty[na][R(id)].pos;
}
}
long long query(long long id,long long l,long long r,long long na,long long &index)
{
if(ty[na][id].ll==l&&ty[na][id].rr==r)
{
index=ty[na][id].pos;
return ty[na][id].mi;
}
long long mid=(ty[na][id].ll+ty[na][id].rr)/2;
if(mid>=r) return query(L(id),l,r,na,index);
else if(mid<l) return query(R(id),l,r,na,index);
else
{
long long tmp1,tmp2;
long long t1=query(L(id),l,mid,na,tmp1);
long long t2=query(R(id),mid+1,r,na,tmp2);
if(t1<=t2) {index=tmp1;return t1;}
else {index=tmp2;return t2;}
}
}
int main()
{
for(long long i=1;i<=3;i++)
scanf("%I64d",&n[i]);
for(long long i=1;i<=3;i++)
scanf("%I64d",&t[i]);
scanf("%d",&n[0]);
for(long long i=0;i<n[0];i++)
scanf("%I64d",peo+i),peo[i]--; for(long long i=1;i<=3;i++)
bulid(1,1,min(n[i],n[0]),i);
long long ans=0;
for(long long i=0;i<n[0];i++)
{
long long cur=peo[i];
for(long long j=1;j<=3;j++)
{
long long index;
long long c_mi=query(1,1,min(n[j],n[0]),j,index);
if(c_mi>=cur) cur=c_mi+t[j];
else cur+=t[j];
update(1,index,cur,j);
}
ans=max(ans,cur-peo[i]);
}
cout<<ans<<endl;
return 0;
}

版权声明:本文博主原创文章。博客,未经同意不得转载。

Codeforces 85B. Embassy Queue【段树、馋】的更多相关文章

  1. PKU A Simple Problem with Integers (段树更新间隔总和)

    意甲冠军:一个典型的段树C,Q问题,有n的数量a[i] (1~n),C, a, b,c在[a,b]加c Q a b 求[a,b]的和. #include<cstdio> #include& ...

  2. 计蒜客 30996.Lpl and Energy-saving Lamps-线段树(区间满足条件最靠左的值) (ACM-ICPC 2018 南京赛区网络预赛 G)

    G. Lpl and Energy-saving Lamps 42.07% 1000ms 65536K   During tea-drinking, princess, amongst other t ...

  3. HDU 6356.Glad You Came-线段树(区间更新+剪枝) (2018 Multi-University Training Contest 5 1007)

    6356.Glad You Came 题意就是给你一个随机生成函数,然后从随机函数里确定查询的左右区间以及要更新的val值.然后最后求一下异或和就可以了. 线段树,区间最大值和最小值维护一下,因为数据 ...

  4. HDU 5649.DZY Loves Sorting-线段树+二分-当前第k个位置的数

    DZY Loves Sorting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Oth ...

  5. 计蒜客 28315.Excellent Engineers-线段树(单点更新、区间最值) (Benelux Algorithm Programming Contest 2014 Final ACM-ICPC Asia Training League 暑假第一阶段第二场 E)

    先写这几道题,比赛的时候有事就只签了个到. 题目传送门 E. Excellent Engineers 传送门 这个题的意思就是如果一个人的r1,r2,r3中的某一个比已存在的人中的小,就把这个人添加到 ...

  6. 【UVA】11992 - Fast Matrix Operations(段树模板)

    主体段树,要注意,因为有set和add操作,当慵懒的标志下推.递归优先set,后复发add,每次运行set行动add马克清0 WA了好几次是由于计算那一段的时候出问题了,可笑的是我对着模板找了一个多小 ...

  7. [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路)

    [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路) 题面 有n个空心物品,每个物品有外部体积\(out_i\)和内部体积\(in_i\),如果\(in_i& ...

  8. BZOJ-3212 Pku3468 A Simple Problem with Integers 裸线段树区间维护查询

    3212: Pku3468 A Simple Problem with Integers Time Limit: 1 Sec Memory Limit: 128 MB Submit: 1278 Sol ...

  9. ZOJ 1610 间隔染色段树

    要长8000仪表板.间染色的范围,问:最后,能看到的颜色,而且颜色一共有段出现 覆盖段 数据对比水   水可太暴力 段树: #include "stdio.h" #include ...

随机推荐

  1. 洛谷—— P1168 中位数

    https://www.luogu.org/problem/show?pid=1168 题目描述 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], ...

  2. POJ 1275 Cashier Employment 挺难的差分约束题

    http://poj.org/problem?id=1275 题目大意: 一商店二十四小时营业,但每个时间段需求的雇员数不同(已知,设为R[i]),现有n个人申请这份工作,其可以从固定时间t连续工作八 ...

  3. 【习题5-3 UVA-10935】Throwing cards away I

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 用STL的queue写 [代码] #include <bits/stdc++.h> using namespace st ...

  4. 【z02】选择客栈

    (hotel.cpp/c/pas) [问题描述] 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照 某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示) ...

  5. chrome-extensions -- copytables. verygood

    https://www.crx4chrome.com/extensions/ekdpkppgmlalfkphpibadldikjimijon/,通过设置快捷键,一般是拷贝多行

  6. [Swift] Storyboard outlet and action

    To programmaictlly change the content of app, we need to contect storyboard to a view controller. To ...

  7. jquery-11 留言板如何实现

    jquery-11 留言板如何实现 一.总结 一句话总结:用live()方法让后面动态添加的元素也绑定之前对应类绑定的方法. 1.如何让后面动态添加的元素也绑定之前对应类绑定的方法? 用live()方 ...

  8. linux下的多线程,pthread_create函数

    pthread_create是UNIX环境创建线程函数 头文件 #include<pthread.h> 函数声明 int pthread_create(pthread_t*restrict ...

  9. Android 基于Bmob平台数据管理常用方法整理

    最近想搞一下基于Bmob平台的应用开发,发现确实挺方便的,很好的解决了服务器后台部署的难题, 但是也有一些弊端,数据架构的可扩展性不强,做一些数据结构简单的应用还是可以的. package com.b ...

  10. vimrum

    # Insert your preferred key mappings here.unmap <a-O>map <a-O> closeOtherTabsmap , previ ...