FJD1T3(LOJ 2773 学习轨迹)
发现了\(FJOI\)原题
没什么想法,想到自己考场上连\(n^2\)做法都不会就很感慨。
考虑如果只选择一个序列的任务,那么肯定全部选择会更加优秀。
那么考虑如果我们选择了两个序列的一部分。
如果\(A\)中选择的部分的权值和小于\(A\)权值和的一半,且\(B\)也如此,那我们不如只选择一个序列来的优。
我们考虑强制一个序列\(A\)选择超过一半,然后再反过来做一遍。
那么考虑在\(A\)中第一个大于一半的位置\(p\),那么这个位置是一定要选上的,否则选择的序列全在左边,或全在右边,都不满足条件。
那么考虑维护这个\(B\)中的序列右端,则每次都只有一个新出现\(ban\)点,考虑用线段树维护\([1...r-1,r]\)这些序列的答案。
考虑用单调栈来维护,在每次新增 ban 掉的点时,不断将它能覆盖的点弹出,把原来的贡献删掉,在最后把现在的贡献一起加上.
任然觉得自己考场上太蠢了。
开始\(rush\)代码。
LOJ 2773 学习轨迹
//%std
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define y1 ysgh
inline int read()
{
int out = 0, fh = 1;
char jp = getchar();
while ((jp > '9' || jp < '0') && jp != '-')
jp = getchar();
if (jp == '-') fh = -1, jp = getchar();
while (jp >= '0' && jp <= '9')
out = out * 10 + jp - '0', jp = getchar();
return out * fh;
}
void print(int x)
{
if (x >= 10) print(x / 10);
putchar('0' + x % 10);
}
void write(int x, char c)
{
if (x < 0) putchar('-'), x = -x;
print(x);
putchar(c);
}
const int N = 5e5 + 10;
int n, m, a[N], b[N], c[N << 1], p1, p2, p3, p4, swaped = 0;
ll ans, suma[N], sumb[N];
ll mx[N << 2], ext[N << 2];
void pushup(int x)
{
mx[x] = max(mx[x << 1], mx[x << 1 | 1]) + ext[x];
}
void BuildTree(int x, int l, int r)
{
ext[x] = 0;
if (l == r)
{
mx[x] = suma[n] - sumb[l - 1];
return;
}
int mid = (l + r) >> 1;
BuildTree(x << 1, l, mid);
BuildTree(x << 1 | 1, mid + 1, r);
pushup(x);
}
void upd(int x, int l, int r, int L, int R, ll d)
{
if (L <= l && r <= R)
{
mx[x] += d, ext[x] += d;
return;
}
int mid = (l + r) >> 1;
if (L <= mid)
upd(x << 1, l, mid, L, R, d);
if (R > mid)
upd(x << 1 | 1, mid + 1, r, L, R, d);
pushup(x);
}
int query(int x, int l, int r)
{
if (l == r)
return l;
int mid = (l + r) >> 1;
if (mx[x] == mx[x << 1] + ext[x])
return query(x << 1, l, mid);
return query(x << 1 | 1, mid + 1, r);
}
void report(ll val, int a, int b, int c, int d)
{
if (val > ans)
{
if (swaped)
swap(a, c), swap(b, d);
ans = val, p1 = a, p2 = b, p3 = c, p4 = d;
}
}
int tpl, tpr, sl[N], sr[N];
void solve()
{
int p = lower_bound(suma + 1, suma + n + 1, (suma[n] + 1) >> 1) - suma;
BuildTree(1, 1, m);
tpl = tpr = 0;
for (int i = 1; i <= m; ++i)
{
if (b[i])
{
if (b[i] <= p)
{
while (tpl && b[i] > b[sl[tpl]])
{
upd(1, 1, m, sl[tpl - 1] + 1, sl[tpl], suma[b[sl[tpl]]]);
--tpl;
}
upd(1, 1, m, sl[tpl] + 1, i, -suma[b[i]]);
sl[++tpl] = i;
}
else
{
while (tpr && b[i] < b[sr[tpr]])
{
upd(1, 1, m, sr[tpr - 1] + 1, sr[tpr], suma[n] - suma[b[sr[tpr]] - 1]);
--tpr;
}
upd(1, 1, m, sr[tpr] + 1, i, suma[b[i] - 1] - suma[n]);
sr[++tpr] = i;
}
}
int j = query(1, 1, m);
int pl = lower_bound(sl + 1, sl + tpl + 1, j) - sl;
int pr = lower_bound(sr + 1, sr + tpr + 1, j) - sr;
pl = pl <= tpl ? b[sl[pl]] + 1 : 1;
pr = pr <= tpr ? b[sr[pr]] - 1 : n;
report(sumb[i] + mx[1], pl, pr, j, i);
}
}
int main()
{
n = read(), m = read();
for (int i = 1; i <= n; ++i) a[i] = read();
for (int i = 1; i <= n; ++i) suma[i] = suma[i - 1] + read();
for (int i = 1; i <= m; ++i) c[read()] = i;
for (int i = 1; i <= m; ++i) sumb[i] = sumb[i - 1] + read();
for (int i = 1; i <= n; ++i) a[i] = c[a[i]], b[a[i]] = i;
report(suma[n], 1, n, 0, 0), report(sumb[m], 0, 0, 1, m);
solve();
swap(n, m), swap(a, b), swap(suma, sumb), swaped = 1;
solve();
printf("%lld\n", ans);
printf("%d %d\n", p1, p2);
printf("%d %d\n", p3, p4);
return 0;
}
FJD1T3(LOJ 2773 学习轨迹)的更多相关文章
- 【D3】D3学习轨迹-----学习到一定层度了再更新
1. 首先了解SVG的基本元素 http://www.w3school.com.cn/svg/ 2. 了解d3的专有名词 http://www.cnblogs.com/huxiaoyun90/p ...
- 我的AngularJS学习轨迹
开始接触Anguljar可能是在2013年初,那个时候的版本1.0.*,那个时候国内主要的中文资料AngularJS学习笔记:http://zouyesheng.com/angular.html,an ...
- ICML 2018 | 从强化学习到生成模型:40篇值得一读的论文
https://blog.csdn.net/y80gDg1/article/details/81463731 感谢阅读腾讯AI Lab微信号第34篇文章.当地时间 7 月 10-15 日,第 35 届 ...
- jquery-mobile 学习笔记之中的一个(基础属性)
写在前面 本文是依据w3c 学习轨迹,自己研习过程中记录下的笔记,仅仅供自己学习轨迹记录之用,不喜勿喷. 0 引入库 引入相应的文件: <link rel="stylesheet&qu ...
- arXiv 2015深度学习年度十大论文
由康奈尔大学运营维护着的arXiv网站,是一个在学术论文还未被出版时就将之向所有人开放的地方.这里汇聚了无数科学领域中最前沿的研究,机器学习也包括在内.它反映了学术界当前的整体趋势,我们看到,近来发布 ...
- 2020-02-19Linux学习日记,第一天
今天是2020-02-19第一次写博客.每天更新学习Linux的一些笔记. 主要是为了方便日后自己复习,也是为了督促自己学习.记录自己的学习轨迹! -------------------------- ...
- JSP复习整理(一)表单
好久没更了,一周完成了SRDP,一周完成了课程设计,这一周就要好好回顾回顾Java Web的学习轨迹了. 用的eclipse Mars 一.表单 start.jsp <%@ page langu ...
- Python网络数据采集系列-------概述
这是一个正在准备中的系列文章,主要参考的是<Web Scraping with Python_Collecting Data from the Modern Web-O'Reilly(2015) ...
- 理解asp.net中DropDownList编辑数据源,绑定数据库数据。
一.理解asp.net绑定数据库 终于学习到了连接数据库部分的内容,杨中科老师视频看起来挺轻松的,如果是高清版就更ok了. 我发现我学习新的编程语言会有一个特点,都想要赶紧学习数据库,数据就是一切,有 ...
随机推荐
- UE4蓝图AI角色制作(七)之追逐玩家
15.追逐玩家 现在我们的AI无法做出任何决策,它总是执行相同的决策.我们先把感知系统中的相关信息提供给AI,让AI知道如何做出决策,然后我们会修改行为树.我们首先需要创建新的黑板键,这样我们就能在行 ...
- 分割迭代器Spliterator源码文档翻译
前言 身体是革命的本钱,不舒服了2周,现在好点了. 学习JDK8的Stream,Spliterator这个分割迭代器是必须要重视的. Notes:下方蓝色文字是自己的翻译(如果有问题请指正).黑色文字 ...
- Alpha发布声明
项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 Alpha-发布声明 我们是谁 删库跑路对不队 我们在做什么 题士 进度如何 进度总览 一.功能与特性 1. ...
- [Beta]the Agiles Scrum Meeting 8
会议时间:2020.5.22 21:00 1.每个人的工作 今天已完成的工作 成员 已完成的工作 issue yjy 帮助解决博客评分功能遇到的问题 tq 暂无 wjx 完成批量创建团队项目功能 班级 ...
- springboot读取配置文件中的信息
在一个项目中,我们有时候会把一些配置信息写入到一个配置文件中,在java代码中读取配置文件的信息.在此记录下读取属性文件中的内容. 在springboot项目中,springboot的配置文件可以使用 ...
- 热身训练1 Problem B. Harvest of Apples
http://acm.hdu.edu.cn/showproblem.php?pid=6333 题意: 求 C(0,n)+C(1,n)+...+C(m,n) 分析: 这道题,我们令s(m,n) = C( ...
- JVM:Java内存区域与内存溢出异常
Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁时间,有些区域随着虚拟机进程的启动而存在,有些区域依赖用户线程的启动和 ...
- Flink计算pv和uv的通用方法
PV(访问量):即Page View, 即页面浏览量或点击量,用户每次刷新即被计算一次. UV(独立访客):即Unique Visitor,访问您网站的一台电脑客户端为一个访客.00:00-24:00 ...
- linux切换shell
1. $SHELL这一环境变量用于保存当前用户使用的shell,所以我们可以输出$SHELL来查看当前使用的shell是什么: 2. 查看/etc/shells文件,可以看到当前系统中安装的有效的sh ...
- 碰撞的蚂蚁 牛客网 程序员面试金典 C++ Java Python
碰撞的蚂蚁 牛客网 程序员面试金典 C++ Java Python 题目描述 在n个顶点的多边形上有n只蚂蚁,这些蚂蚁同时开始沿着多边形的边爬行,请求出这些蚂蚁相撞的概率.(这里的相撞是指存在任意两只 ...