发现了\(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 学习轨迹)的更多相关文章

  1. 【D3】D3学习轨迹-----学习到一定层度了再更新

    1.  首先了解SVG的基本元素 http://www.w3school.com.cn/svg/ 2.  了解d3的专有名词  http://www.cnblogs.com/huxiaoyun90/p ...

  2. 我的AngularJS学习轨迹

    开始接触Anguljar可能是在2013年初,那个时候的版本1.0.*,那个时候国内主要的中文资料AngularJS学习笔记:http://zouyesheng.com/angular.html,an ...

  3. ICML 2018 | 从强化学习到生成模型:40篇值得一读的论文

    https://blog.csdn.net/y80gDg1/article/details/81463731 感谢阅读腾讯AI Lab微信号第34篇文章.当地时间 7 月 10-15 日,第 35 届 ...

  4. jquery-mobile 学习笔记之中的一个(基础属性)

    写在前面 本文是依据w3c 学习轨迹,自己研习过程中记录下的笔记,仅仅供自己学习轨迹记录之用,不喜勿喷. 0 引入库 引入相应的文件: <link rel="stylesheet&qu ...

  5. arXiv 2015深度学习年度十大论文

    由康奈尔大学运营维护着的arXiv网站,是一个在学术论文还未被出版时就将之向所有人开放的地方.这里汇聚了无数科学领域中最前沿的研究,机器学习也包括在内.它反映了学术界当前的整体趋势,我们看到,近来发布 ...

  6. 2020-02-19Linux学习日记,第一天

    今天是2020-02-19第一次写博客.每天更新学习Linux的一些笔记. 主要是为了方便日后自己复习,也是为了督促自己学习.记录自己的学习轨迹! -------------------------- ...

  7. JSP复习整理(一)表单

    好久没更了,一周完成了SRDP,一周完成了课程设计,这一周就要好好回顾回顾Java Web的学习轨迹了. 用的eclipse Mars 一.表单 start.jsp <%@ page langu ...

  8. Python网络数据采集系列-------概述

    这是一个正在准备中的系列文章,主要参考的是<Web Scraping with Python_Collecting Data from the Modern Web-O'Reilly(2015) ...

  9. 理解asp.net中DropDownList编辑数据源,绑定数据库数据。

    一.理解asp.net绑定数据库 终于学习到了连接数据库部分的内容,杨中科老师视频看起来挺轻松的,如果是高清版就更ok了. 我发现我学习新的编程语言会有一个特点,都想要赶紧学习数据库,数据就是一切,有 ...

随机推荐

  1. spark 解决错误java.io.InvalidClassException

    今天遇到一个现场问题,任务报错java.io.InvalidClassException.在开发环境是没有报错的,正式环境报错.大概类似于下面这样(非报错原文,摘自网上同类博客) java.io.In ...

  2. 4.7 80--删除排序数组中的重复项 II

    因为python的list可以直接del List[index],因此直接使用了暴力方法,判断是否重复了两次,是的话直接使用del. 在转向使用Java时,因为暴力方法的局限,一直在找怎样对Java的 ...

  3. 【二食堂】Alpha - Scrum Meeting 3

    Scrum Meeting 3 例会时间:4.13 12:00 - 12:30 进度情况 组员 昨日进度 今日任务 李健 1. 继续学习前端知识,寻找一些可用的框架.issue 1. 搭建主页html ...

  4. SpringBoot加密配置属性

    一.背景 在系统中的运行过程中,存在很多的配置属性,比如: 数据库配置.阿里云配置 等等,这些配置有些属性是比较敏感的,是不应直接以明文的方式出现在配置文件中,因此对于这些配置我们就需要加密来处理. ...

  5. 2021.9.13考试总结[NOIP模拟52]

    T1 路径 考虑每一位的贡献,第$i$位每$2^i$个数会变一次,那么答案为$\sum_{i=1}^{log_2n} \frac{n}{2^i}$. $code:$ 1 #include<bit ...

  6. linux下uptime命令

    https://man.linuxde.net/uptime uptime命令能够打印系统总共运行了多长时间和系统的平均负载.uptime命令可以显示的信息显示依次为:现在时间.系统已经运行了多长时间 ...

  7. linux下软链接文件的拷贝

    最近在编译libnl库准备拷贝到其他机器中使用的时候出现无法拷贝问题,原因是sd卡是fat32文件系统格式,这种文件系统不支持linux下的ln软链接文件, void@void-ThinkPad-E4 ...

  8. mac bigsur 安装mysql步骤

    我首先下载的是mysql8.x,安装完后,在偏好设置里面,双击mysql图标,弹窗:未能载入偏好设置面板MySQL,重启无果,查攻略说是要安装5.7.x,在mysql官网上,下载5.7.29 强烈建议 ...

  9. 基于eNSP的NAT/NAPT协议仿真实践

    一. 基本原理 eNSP(Enterprise Network Simulation Platform)是一款由华为提供的.可扩展的.图形化 操作的网络仿真工具平台,主要对企业网络路由器.交换机进行软 ...

  10. Ubuntu 安装 mysql 报错 "update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在"

    解决方法: sudo cp /etc/mysql/my.cnf /etc/mysql/mysql.cnf 偷梁换柱-! 如果想更新mysql的源方法如下: wget http://dev.mysql. ...