bzoj3638

费用流+线段树

看见这个题我们马上就能想到费用流,设立源汇,分别向每个点连接容量为1费用为0的边,然后相邻的点之间连边,费用为点权,跑费用流就行了,但是很明显这样会超时,那么我们要优化一下,我们观察费用流的过程,发现对于点与点之间的边,每次取一段区间相当于把正向边改为反向边,费用变负,于是我们可以用线段树来模拟这个过程,像费用流一样贪心地选取区间的最大子段和,然后取反,每次取k次,然后恢复。这样就好了

但是写的时候有很多问题,比如如何返回一个区间?结构体!参考了popoqqq大神的代码,发现我们可以通过重载小于号直接对结构体取max,这样就十分好写了

然后这道题有点卡常,一定要在重载的时候把传入参数变成const+引用,这样在cf上快了200ms

这就是传说中的五倍经验吗

#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
namespace IO 
{const int Maxlen = N * 50;char buf[Maxlen], *C = buf;int Len;inline void read_in(){Len = fread(C, 1, Maxlen, stdin);buf[Len] = '\0';}inline void fread(int &x) {x = 0;int f = 1;while (*C < '0' || '9' < *C) { if(*C == '-') f = -1; ++C; }while ('0' <= *C && *C <= '9') x = (x << 1) + (x << 3) + *C - '0', ++C;x *= f;}inline void read(int &x){x = 0;int f = 1; char c = getchar();while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); }while(c >= '0' && c <= '9') { x = (x << 1) + (x << 3) + c - '0'; c = getchar(); }x *= f;}inline void read(long long &x){x = 0;long long f = 1; char c = getchar();while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); }while(c >= '0' && c <= '9') { x = (x << 1ll) + (x << 3ll) + c - '0'; c = getchar(); }x *= f;} 
} using namespace IO;
struct data {int l, r, v;data() {}data(int l, int r, int v) : l(l), r(r), v(v) {}friend bool operator < (const data &a, const data &b) { return a.v < b.v; }friend data operator + (const data &a, const data &b) { return data(a.l, b.r, a.v + b.v); }
}; 
struct node {data lmax, rmax, mx, mn, lmin, rmin, sum;int tag;node() {}node(int x, int v) {lmax = rmax = mx = mn = lmin = rmin = sum = data(x, x, v);}friend node operator + (const node &a, const node &b) {node c;if(a.tag == -1) return b;if(b.tag == -1) return a;c.tag = 0;c.sum = a.sum + b.sum;c.lmax = max(a.lmax, a.sum + b.lmax);c.lmin = min(a.lmin, a.sum + b.lmin);c.rmax = max(b.rmax, a.rmax + b.sum);c.rmin = min(b.rmin, a.rmin + b.sum);c.mx = max(max(a.mx, b.mx), a.rmax + b.lmax);c.mn = min(min(a.mn, b.mn), a.rmin + b.lmin);return c; }   
} tree[N << 2], st[21];
int n, q;
int a[N];
void paint(node &o)
{swap(o.lmax, o.lmin);swap(o.rmax, o.rmin);swap(o.mx, o.mn);o.sum.v *= -1;o.lmax.v *= -1;o.lmin.v *= -1;o.rmax.v *= -1;o.rmin.v *= -1;o.mx.v *= -1;o.mn.v *= -1;o.tag ^= 1;
}
void pushdown(int x)
{if(tree[x].tag <= 0) return;paint(tree[x << 1]);paint(tree[x << 1 | 1]);tree[x].tag ^= 1;
}
void build(int l, int r, int x)
{if(l == r){tree[x] = node(l, a[l]);return;}int mid = (l + r) >> 1;build(l, mid, x << 1);build(mid + 1, r, x << 1 | 1);tree[x] = tree[x << 1] + tree[x << 1 | 1];
}
node query(int l, int r, int x, int a, int b)
{if(l > b || r < a) return tree[0];if(l >= a && r <= b) return tree[x];pushdown(x);    int mid = (l + r) >> 1;return (query(l, mid, x << 1, a, b)) + (query(mid + 1, r, x << 1 | 1, a, b)); 
}
void reverse(int l, int r, int x, int a, int b)
{if(l > b || r < a) return;if(l >= a && r <= b){paint(tree[x]);return;}pushdown(x);int mid = (l + r) >> 1;reverse(l, mid, x << 1, a, b);reverse(mid + 1, r, x << 1 | 1, a, b);tree[x] = tree[x << 1] + tree[x << 1 | 1];
}
void update(int l, int r, int x, int pos, int v)
{if(l == r){tree[x] = node(l, v);return;}pushdown(x);int mid = (l + r) >> 1;if(pos <= mid) update(l, mid, x << 1, pos, v);else update(mid + 1, r, x << 1 | 1, pos, v);tree[x] = tree[x << 1] + tree[x << 1 | 1];
}
int main()
{read_in();fread(n);for(int i = 1; i <= n; ++i) fread(a[i]);tree[0].tag = -1;build(1, n, 1);fread(q);while(q--){int opt, l, r, v;fread(opt);if(opt == 0){fread(l);fread(v);update(1, n, 1, l, v);}if(opt == 1){fread(l);fread(r);fread(v);int sum = 0, top = 0;while(v--){node ans = query(1, n, 1, l, r);if(ans.mx.v <= 0) break;reverse(1, n, 1, ans.mx.l, ans.mx.r);node tmp = query(1, n, 1, ans.mx.l, ans.mx.r);st[++top] = ans;sum += ans.mx.v;}printf("%d\n", sum);for(int i = top; i; --i) reverse(1, n, 1, st[i].mx.l, st[i].mx.r);}} return 0;
} 
View Code

 

转载于:https://www.cnblogs.com/19992147orz/p/7549892.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571950.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android module 引用libs里面的so文件_Android中的JNI开发,你了解多少?

一&#xff0c;什么是任务及管理任务是用户在执行某项工作时与之互动的一系列 Activity 的集合。一、步骤&#xff0c;修改build.gradle&#xff0c;添加cmakelists&#xff0c;写JNI接口&#xff0c;写c&#xff0c;这个是不是流水线的方式集成&#xff0c;不了解每一步是做什…

zabbix中mysql连不上的排错_zabbix监控软件的使用排错

在linux系统中&#xff0c;几乎所有运行的服务都会产生相对就的日志(log)&#xff0c;所运行的程序在出错时都会有错误提示&#xff0c;即使没有任何提示也可以通过“echo $”来查看运行是否成功。使用zabbix已经有一段时间了&#xff0c;整理一下遇到过的问题和解决的方法以。…

Tomcat之Windows环境下配置多个服务器

在应对多项目多端口的情况配置一个服务器是远不能满足开发条件的。例如微信公众号回调域名只接受80端口&#xff0c;而其他项目一般为默认的8080或者自定义的其他的端口。 废话多说&#xff0c;直入主题 准备条件&#xff1a;tomcat文件夹&#xff0c;notepad2 1.Apache官网上下…

mysql optimizer组件_MySQL Optimizer

最后更新&#xff1a;2018-10-09当前版本&#xff1a;1.9.1应用大小&#xff1a;8.8 MB应用语言&#xff1a;英文系统要求&#xff1a;OS X 10.11 或更高应用描述&#xff1a;MySQL和MariaDB优化工具MySQL Optimizer 简介&#xff1a;MySQL Optimizer for Mac(MySQL和MariaDB优…

nagios mysql 监控_nagios监控mysql

说明&#xff1a;被监控客户端要先安装mysql,必须安装mysql-devel,再安装nagios-plugins&#xff0c;nrpea、进入mysql,新建一个nagiosdb数据库&#xff0c;并授权mysql –uroot –p123456create database nagiosdb;grant all on nagiosdb.* [email protected] identified by &…

java 反射的效率_如何提高使用Java反射的效率?

前言在我们平时的工作或者面试中&#xff0c;都会经常遇到“反射”这个知识点&#xff0c;通过“反射”我们可以动态的获取到对象的信息以及灵活的调用对象方法等&#xff0c;但是在使用的同时又伴随着另一种声音的出现&#xff0c;那就是“反射”很慢&#xff0c;要少用。难道…

个人项目-数独

项目源代码的Github链接 https://github.com/yaoling1997/softwareFirstHomework 需求分析 一、生成数独 命令&#xff1a;sudoku.exe -c n 要求&#xff1a; (1)输出到sudoku.txt (2)不重复 (3)1<n<1000000 (4)可以处理异常情况&#xff0c;如&#xff1a;sudoku.exe -c…

navicat premium 连接出现的问题

1、listener does not currently know of service requested in connect descriptor 2、问题截图&#xff1a; 3、问题原因&#xff1a;服务名或者SID不正确 4、改正方法&#xff1a;打开 图中tnsnames.ora文件 找到 XE就是服务名 正确连接&#xff1a; 转载于:https://www.cnb…

quartz java spring_从零开始学 Java - Spring 使用 Quartz 任务调度定时器

生活的味道睁开眼看一看窗外的阳光&#xff0c;伸一个懒腰&#xff0c;拿起放在床一旁的水白开水&#xff0c;甜甜的味道&#xff0c;晃着尾巴东张西望的猫猫&#xff0c;在窗台上舞蹈。你向生活微笑&#xff0c;生活也向你微笑。请你不要询问我的未来&#xff0c;这有些可笑。…

excel查重复_智学网怎么登录 智学网怎么查分数 智学网统一登录平台网址

阅读本文前&#xff0c;请您先点击上面的蓝色字体&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到最新文章了。每天都有分享。完全是免费订阅&#xff0c;请放心关注。注&#xff1a;本文转载自网络&#xff0c;不代表本平台立场&#xff0c;仅供读者参考&…

树莓派Java程序运行_树莓派上Java程序作为linux服务并开机自动启动

http://www.iigrowing.cn/shu_mei_pai_shang_java_cheng_xu_zuo_wei_linux_fu_wu_bing_kai_ji_zi_dong_qi_dong.html刚刚买了&#xff0c; 树莓派&#xff0c; 准备做一些程序&#xff0c; 放到树莓派上&#xff0c; 平时树莓派上不接显示器等各种设备&#xff0c;直接随着adsl…

小程序 mathjs渲染公式_Mac 3D渲染和动画制作----KeyShot 9 Pro

KeyShot 9 Pro for Mac是应用在Mac上的一款3D渲染和动画制作软件&#xff0c;keyshot是您快速创建精彩视觉效果所需的一切。在实时3D渲染工作流程显示结果即时&#xff0c;缩短了创建逼真的产品拍摄的时间。从科学上准确的材料和环境预设到高级材料编辑和动画&#xff0c;创建交…

用AsyncTask来获取网络图片

先看下运行结束 这里有两个Button 点击第一个Button运行的结果&#xff01;第一张有一个旋转的灰色圈圈&#xff01; 点击第二个Button运行的结果如下&#xff1a;带进度条的 ok,看下实现方法 先在配置清单中加一个访问网络的权限&#xff01; <uses-permission android:nam…

bilibili有电脑版吗_哪个手机便签软件有电脑版?有跨平台的桌面便签软件吗 - 学显...

如果仔细观察的话&#xff0c;你会发现&#xff1a;现在很多手机桌面上都有一款名叫“便签”的app小软件。其实&#xff0c;这是手机系统自带的一款备忘小工具&#xff0c;是为了方便用户记事而设计的。也就是说&#xff0c;平时如果有什么事儿需要记下来的话&#xff0c;就可以…

win10关机后自动重启_安卓手机重启和关机后再开机,区别原来这么大!别不当回事...

现在大家用智能手机&#xff0c;只会在以下几种情况关机&#xff0c;一种是用到没电&#xff0c;自动关机了。另一种是手机有点卡顿&#xff0c;通过关机再开机的方式&#xff0c;释放RAM内存&#xff0c;提高手机运行速度。而现在的很多手机&#xff0c;比如小米手机&#xff…

前端周报:前端面试题及答案总结;JavaScript参数传递的深入理解

1、2017前端面试题及答案总结 |掘金技术征文 "金三银四&#xff0c;金九银十"&#xff0c;用来形容求职最好的几个月。但是随着行业的饱和&#xff0c;初中级前端er就业形势不容乐观。 行业状态不可控&#xff0c;我们能做的当然只是让自己变得更加具有竞争力。 今年…

python二级考试真题_全国BIM技能等级考试真题全套(一/二级,全专业,28套)

BIM技能等级考试即将到来&#xff0c;你准备好了吗&#xff1f;今日为大家整理了一套网友上传的BIM等级考试全套真题&#xff0c;供大家学习参考~BIM一级真题解析课程限免&#xff1a;(点我)全国BIM技能等级考试真题解析(一级)仅限6月5日一天免费第一期全国BIM技能等级考试一级…

Awk使用方法简介

AWK AWK简介&#xff1a;awk是一个强大的文本分析工具&#xff0c;相对于grep的查找&#xff0c;sed的编辑&#xff0c;awk在其对数据分析并生成报告时&#xff0c;显得尤为强大。简单来说awk就是把文件逐行的读入&#xff0c; 以空格为默认分隔符将每行切片…

矩形波如何傅立叶展开_金科文化会不会连续拉板?两位同学展开激辩

【编者按&#xff1a;金科文化是我们昨晚理论上留下的两道作业题之一&#xff0c;要求同学们根据课程内容&#xff0c;判断一下它是否符合连板青云的条件&#xff1f;后市如何预判&#xff1f;操作计划怎么制定&#xff1f;今天&#xff0c;很多同学就此展开了分析和讨论。今晚…

java web 不用框架_MyShop-不用框架的基础javaweb项目

javaweb基础开发Servletjspmysqlhtmlcssjs(找一个前端模板&#xff0c;一大堆html,自己写的没有模板的美观)数据库设计来一个最基础的用户表drop table ifexists myshop_user;create table myshop_user(USER_ID varchar(32) not null,USER_NAME varchar(20) not null,USER_PASS…