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了. 我发现我学习新的编程语言会有一个特点,都想要赶紧学习数据库,数据就是一切,有 ...
随机推荐
- python socket 基本使用
socket通常也叫做"套接字",用于连接server client,是一个通信链的句柄,应用程序通常通过套接字向网络发出请求或应答网络请求. 就像python 处理file一样: ...
- (课内)信安数基RSA-level3-5
emmmm感觉其实自己对这个的理解完全不够,原理只能写出这么个东西(悲) 代码完全是 攻击方式中(1)(2)内容的实现. lambda是一种可以理解为匿名函数的写法:写在这里看起来很酷炫(bushi) ...
- Vue3学习(八)之 Vue CLI多环境配置
一.前言 这里相对于之前就没那么麻烦了,通俗点说就是使用配置文件来管理多环境,实现环境的切换. 二.实现切换 1.增加开发和生产配置文件 在web的根目录下,创建开发环境切换配置文件.env.dev, ...
- 【c++ Prime 学习笔记】第7章 类
类的基本思想是数据抽象和封装 数据分离抽象是一种依赖于接口和实现分离的编程/设计技术.接口包括用户能执行的操作,实现包括类的数据成员.接口实现的函数体.定义类所需的各种私有函数 封装实现了类的接口和实 ...
- 【二食堂】Beta - Scrum Meeting 7
Scrum Meeting 7 例会时间:5.19 18:30~18:50 进度情况 组员 当前进度 今日任务 李健 1. 文本区域的前后端对接完成,bug已经修复issue2. 自定义关系的添加与删 ...
- Linux零基础之shell基础编程入门
从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操 ...
- 算法:N-gram语法
一.N-gram介绍 n元语法(英语:N-gram)指文本中连续出现的n个语词.n元语法模型是基于(n - 1)阶马尔可夫链的一种概率语言模型,通过n个语词出现的概率来推断语句的结构.这一模型被广泛应 ...
- PDF转图片部分公式字符丢失问题解决的爬坑记录
现象 PDF教材导出到系统中,由程序将PDF转为图片后合并成一张大图供前端标注,但是在标注数学和化学学科的时候且源文件是PDF的情况下出现公式部分字符丢失的情况,如下图 原件 转换后效果 WTF! 转 ...
- c++中virtual 虚函数
转载: https://www.cnblogs.com/weiyouqing/p/7544988.html 在面向对象的C++语言中,虚函数(virtual function)是一个非常重要的概念. ...
- Luogu P1118 [USACO06FEB]数字三角形 Backward Digit Sums | 搜索、数学
题目链接 思路:设一开始的n个数为a1.a2.a3...an,一步一步合并就可以用a1..an表示出最后剩下来的数,不难发现其中a1..an的系数恰好就是第n层杨辉三角中的数.所以我们可以先处理出第n ...