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学习系列之一: python相关环境的搭建
前言 学习python和使用已经一年多了,这段时间抽空整理了一下以前的笔记,方便日后查阅. Python介绍 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Pytho ...
- 【UE4 C++】 Datatable 读写、导入导出 CSV/Json
Datatable 读取行数据 1. 创建结构体 继承自 FTableRowBase USTRUCT(BlueprintType) struct FSimpleStruct :public FTabl ...
- [对对子队]团队任务拆解Alpha
Alpha阶段主要目标 完成游戏场景的基本实现(不要求美术资源) 完成游戏UI的基本实现(不要求美术资源) 制作第一部分的关卡(顺序语句,制作3-5关) 完成第一部分关卡和游戏基本逻辑的测试 任务分解 ...
- 使用vuex简单的实现系统中的状态管理
最近项目中用到了vue,其中状态的集中管理使用到了vuex,因此就学习vuex做一个简单的记录.vuex的官方网址如下: https://vuex.vuejs.org/zh-cn/ vuex 当我们 ...
- 热身训练1 Calculator
题目出处:Calculator 简要题意: 你有一个确定的函数,f(x)=+...*...^...,其中共有n个操作,从左到右依次计算. 共有m次询问,我们每次询问,1.会修改f(x)中的操作:2.输 ...
- [LGP1866]编号
传送门 题意:找n个数,使得 $ 1 \leq a_i \leq Maxnumber_i $ 求有多少种组合 这题我们可以看到,还有一种无解的情况 我们可以先判断无解的情况 首先把Maxnumber数 ...
- 你知道怎么从jar包里获取一个文件的内容吗
目录 背景 报错的代码 原先的写法 编写测试类 找原因 最终代码 背景 项目里需要获取一个excle文件,然后对其里的内容进行修改,这个文件在jar包里,怎么尝试都读取不成功,但是觉得肯定可以做到,因 ...
- Gitee图床设置
https://gitee.com/ 创建新仓库 点击右上角加号->新建仓库,填写基本信息后点击下面的创建即可 https://gitee.com/projects/new 创建新令牌 点击设置 ...
- filter tools
// 过滤商品分类 Vue.filter("cateFilter", (data) => { let tmp = ["一级分类", "二级分 ...
- 03 | 变量的解构赋值 | es6
变量的解构赋值 数组的解构赋值 基本用法 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 以前,为变量赋值,只能直接指定值. let a ...