题意:

给出 nnn 和 yyy,表示 nnn 个人以及手洗的时间为 yyy,以及 nnn 个 tit_iti​,表示每个人达到洗衣房的时间。每个人可以选择手洗或者机洗,但只有一个洗衣机,问对于机洗时间为 xxx 时的最后一个人洗完的最小时间,输出 xxx 为 1~y1~y1~y 时的答案。(1≤x≤y,1≤n,y≤106,0≤ti≤109)(1\leq x\leq y,1\leq n,y\leq 10^6,0\leq t_i\leq 10^9)(1≤x≤y,1≤n,y≤106,0≤ti​≤109)


思路:

首先,我们要将问题简化,假设机洗时间为一个固定值 xxx,我们如何求解?

我们首先将 aaa 数组排序,稍加模拟应该可以发现,达到最优情况时,一定存在一个分界点 ppp,分界点前面的人都是手洗,分界点之后的人都是机洗,即手洗和机洗的人都是连续的。

然后继续观察可以发现,一个人如果手洗,则其对最终答案的影响就是 ans=max(ans,a[i]+y)ans=max(ans,a[i]+y)ans=max(ans,a[i]+y)。如果一个人机洗,则其对最终答案的影响并不是 ans=max(ans,a[i]+x)ans=max(ans,a[i]+x)ans=max(ans,a[i]+x)。因为一旦这个人选择机洗,意味着之后的人都需要机洗,因此对答案的贡献应该是 ans=max(ans,a[i]+(n−i+1)∗x)ans=max(ans,a[i]+(n-i+1)*x)ans=max(ans,a[i]+(n−i+1)∗x)。

每个人对答案的贡献如果不明白的话,可以继续看这一段解释。如果第 iii 个人选择了机洗,则第 iii 个人洗完的时间是 a[i]+xa[i]+xa[i]+x。那么对于第 i+1i+1i+1 个人来说,他洗完的时间是 max(a[i+1]+x,a[i]+2∗x)max(a[i+1]+x,a[i]+2*x)max(a[i+1]+x,a[i]+2∗x)。对于第 i+2i+2i+2 来说,他洗完的时间是 max(a[i+2]+x,a[i+1]+2∗x,a[i]+3∗x)max(a[i+2]+x,a[i+1]+2*x,a[i]+3*x)max(a[i+2]+x,a[i+1]+2∗x,a[i]+3∗x)。以此类推,到第 nnn 个人洗的时候,第 iii 个人选择机洗对答案的贡献就是 max(ans,a[i]+(n−i+1)∗x)max(ans,a[i]+(n-i+1)*x)max(ans,a[i]+(n−i+1)∗x)。

到这里我们可以发现,对于每个人来说,其手洗对答案的影响是 a[i]+ya[i]+ya[i]+y,而其机洗对答案的影响是 a[i]+(n−i+1)∗xa[i]+(n-i+1)*xa[i]+(n−i+1)∗x,因此我们取两条直线的较小部分作为这个人对最终答案的影响。

所以我们发现每个人对最终答案的影响都是一个分段函数,因此我们令 xxx,即机洗时间作为横坐标,然后将每一个人的分段函数加到整个坐标上。然后对于每一个 xxx,求取这个位置上方的最大值作为答案即可。

如果对李超树基础内容不了解的话,可以查看这篇文章。


总结:

[比赛反思]

比赛的时候因为李超树求线段交点的地方用了 intintint,wawawa 了一整场,赛后才找出 bugbugbug,真的实锤憨憨…

现在更新,李超树根本不需要求交点…

[题目总结]

对于一道较为复杂的题目,解决这道题的关键点在于不断地观察与挖掘题目的一些性质,并且敢于提出错误做法以及 TLETLETLE 做法。正解不是一蹴而就的,而是对当前算法不断的修改与优化最终才能达到正解。


代码:

#include <bits/stdc++.h>
#define __ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define rep(i,a,b) for(int i = a; i <= b; i++)
#define LOG1(x1,x2) cout << x1 << ": " << x2 << endl;
#define LOG2(x1,x2,y1,y2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << endl;
#define LOG3(x1,x2,y1,y2,z1,z2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << " , " << z1 << ": " << z2 << endl;
typedef long long ll;
typedef double db;
const ll inf = 1e15;
const int N = 1e6+100;
const long double EPS = 1e-8;
using namespace std;struct line{ll k,b;int l,r,flag;line() {}line(ll a1,ll a2,int l1,int r1,int f1) : k(a1),b(a2),l(l1),r(r1),flag(f1) {}
}sgt[2*N];
int n,y;
ll a[N];
inline int get_id(int l,int r) {return (l+r) | (l!=r);}
//计算某条线段在某一个横坐标的纵坐标值
inline ll calc(line a,ll pos) {return a.k*pos+a.b;}void dbg() {cout << "\n";}
template<typename T, typename... A> void dbg(T a, A... x) {cout << a << ' '; dbg(x...);}
#define logs(x...) {cout << #x << " -> "; dbg(x);}void build(int l,int r){int now = get_id(l,r);sgt[now].flag = 0; sgt[now].l = sgt[now].r = 0; sgt[now].k = sgt[now].b = 0;if(l == r) return;int mid = (l+r)>>1;build(l,mid); build(mid+1,r);
}void modify(int l,int r,line k){int now = get_id(l,r);if(k.l <= l && r <= k.r){if(!sgt[now].flag) sgt[now] = k, sgt[now].flag = 1; //原区间没有优势线段else if(calc(k,l) >= calc(sgt[now],l) && calc(k,r) >= calc(sgt[now],r)) sgt[now] = k; //原区间优势线段被覆盖else if(calc(k,l) > calc(sgt[now],l) || calc(k,r) > calc(sgt[now],r)){ //有一端比原线段大int mid = (l+r)>>1;if(calc(k,mid) > calc(sgt[now],mid)){ //新线段比原来优势线段坐标高swap(k,sgt[now]);}if(calc(k,l) > calc(sgt[now],l)) modify(l,mid,k);else modify(mid+1,r,k);}}else{if(l == r) return;int mid = (l+r)>>1;if(k.l <= mid) modify(l,mid,k); //涉及了左区间if(mid < k.r) modify(mid+1,r,k); //涉及了右区间}
}ll query(int l,int r,int x){int now = get_id(l,r);if(l == r) return calc(sgt[now],x);else{int mid = (l+r)>>1;ll ans = calc(sgt[now],x);if(x <= mid) return max(ans,query(l,mid,x));else return max(ans,query(mid+1,r,x));}
} void init(){build(1,y);rep(i,1,n){int pos1 = y/(n-i+1), pos2 = (y%(n-i+1)==0) ? pos1:(pos1+1);pos2 = max(pos2,1);pos1 = min(pos1,y);line tmp1(n-i+1,a[i],1,pos1,1),tmp2(0,a[i]+y,pos2,y,1);if(pos1 > 0) modify(1,y,tmp1);if(pos2 <= y) modify(1,y,tmp2);}
}int main()
{while(~scanf("%d%d",&n,&y)){rep(i,1,n) scanf("%lld",&a[i]);sort(a+1,a+1+n);init();rep(i,1,y){ll ans = query(1,y,i);printf("%lld%c",ans," \n"[i==y]);}}return 0;
}

【2019南京icpc网络赛 I】Washing clothes【李超树】相关推荐

  1. Greedy Sequence(2019南京icpc网络预选赛)主席树求区间小于k的最大值

    题意:给出n个整数,构造s1,s2,s3-sn s1,s2,s3-sns1,s2,s3-sn,si sisi满足五个条件 1.s1[i]=i s1[i]=is1[i]=i 2.对于1<j< ...

  2. New Year and Old Subsequence CodeForces - 750E(线段树+矩阵dp)2019南昌icpc网络赛Hello 2019

    A string t is called nice if a string "2017" occurs in t as a subsequence but a string &qu ...

  3. so easy(2019徐州icpc网络赛B)

    题目链接:题目链接 当时这个题卡了好久,用了两个map一直超时. 一直想用并查集,但是一直想不出来怎么用.赛后问的lzh大佬才知道的. map+并查集. 1操作的时候,就把这个值的map设置为x+1. ...

  4. 2019 徐州icpc网络赛 E. XKC's basketball team

    题库链接: https://nanti.jisuanke.com/t/41387 题目大意 给定n个数,与一个数m,求ai右边最后一个至少比ai大m的数与这个数之间有多少个数 思路 对于每一个数,利用 ...

  5. Factories Gym - 102222G(2018宁夏邀请赛暨2019银川icpc网络预选赛)

    第一场icpc网络赛,出的去年宁夏邀请赛原题.c题还没有读完就有ak的了..(滑稽) Byteland has nn cities numbered from 11 to nn, and n−1n−1 ...

  6. ICPC网络赛第二场G Limit

    ICPC网络赛第二场G Limit 题意: 给你数组a和b,求解: 1≤n≤100000,−100≤ai,bi≤100,0≤t≤5.1≤n≤100000,−100≤a_{i},b_{i}≤100,0≤ ...

  7. icpc网络赛第二场K Meal

    icpc网络赛第二场K Meal 题意: 有n个人,n个菜, 现在n个人轮流吃菜,起初S中有n个菜,第i个人会在还没拿走的菜中随机选一个,拿走第j个菜的概率为ai,j∑k∈Sai,k\frac{a_{ ...

  8. J Red-Black Paths(ICPC网络赛第一场)

    J Red-Black Paths(ICPC网络赛第一场) 题意: 有n个点,m次操作,有三种操作: 1 u v:从u向v建一个有向边 2 u:将点u染成红色 3 u: 将点u染成黑色 4 查询最新生 ...

  9. 图论 ---- DAG删点+枚举+暴力+离线前缀异或和 J Red-Black Paths (2021 icpc网络赛第一场)

    补题地址 题目大意: 比赛时候自己演自己卡A-这题也不难 一开始给你一个空图.有4个操作 在图中给u→vu\rightarrow vu→v加一条有向边 把uuu节点涂成红色 把vvv节点涂成黑色 询问 ...

  10. (每日一题)2016 北京ICPC网络赛G hihocoder 1388 (中国剩余定理 + NTT)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://vjudge.net/problem/HihoCoder-1388 P ...

最新文章

  1. sublime_text配置php调试环境,SublimeText2配置PHP调试环境(在windows环境下)
  2. Android 微信支付详解与Demo
  3. 剑指offer 算法(数组 字符串)
  4. linux pip 安装 python,Linux之安装本地Python和pip
  5. Vue的Props属性概述
  6. 初识Mysql(part18)--我需要知道的4个关于联结的小知识点
  7. 设计模式-工厂方法(Factory Method)
  8. XShell安装lrzsz实现文件上传到Linux服务器
  9. 上海特斯拉自燃事件终于有结果了:没有系统缺陷 单个电池模组故障
  10. 安利一个React同构渲染脚手架 —— razzle
  11. Eclipse中ICTCLAS 2011 的java调用
  12. c语言代码大全和详细解释_最详细的Simulink代码生成(C语言)
  13. Unity基础:简易道具生成
  14. c语言冒泡排序知识点,c语言冒泡排序
  15. CBoard修改折线图颜色
  16. java验证码实现简单_简单实现Java验证码功能
  17. 大学生计算机基础实验文库,大学计算机基础实验指导书(ecxel)
  18. 将xlsx转换为xls格式
  19. Linux系统如何隐藏一个文件?
  20. 在线客服系统对接微信小程序(客服消息推送)

热门文章

  1. Cocos2d-x3.2 持续动作
  2. 南洋理工 OJ 115 城市平乱 dijstra算法
  3. 解决PowerDesigner 错误:Invalid repository user or password!
  4. 使用.NET和Jquery打造简单的便签纸
  5. [转载]HTTP的幂等性
  6. centos下mysql备份数据库命令_[CentOS]下mysql数据库常用命令总结
  7. OpenCV-图像处理- Java(读取与显示图片)
  8. 平板Android调试打开log,Android 调试日志
  9. 华硕主板如何设置开机自启_华硕主板自动开机的设置方法.doc
  10. filecoin 密封手续费_解密Filecoin测试网:全球排名登顶的秘密