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,一经查实,立即删除!

相关文章

import python settings from_Python的Django框架中settings文件的部署建议

django在一个项目的目录结构划分方面缺乏必要的规范&#xff0c;因此不同人的项目组织形式也千奇百怪&#xff0c;而且也很难说谁的做法就比较好。我根据自己的项目组织习惯&#xff0c;发布了一个项目dj-scaffold。前些天在reddit上为我的项目dj-scaffold打了个“广告”(见&am…

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

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

一个带关闭按钮的Div窗口,很漂亮

<html><head><title>JSCSS实现带关闭按钮的DIV弹出窗口</title><script> function locking(){ document.all.ly.style.display"block"; document.all.ly.style.widthdocument.body.clientWidth; document.all.ly.style.heightdocu…

windows进入mysql改user_windows下如何修改mysql数据库密码

先要声明一点&#xff0c;大部分情况下&#xff0c;修改MySQL是需要有mysql里的root权限的&#xff0c;所以一般用户无法更改密码&#xff0c;除非请求管理员。方法一使用phpmyadmin&#xff0c;这是最简单的了&#xff0c;修改mysql库的user表&#xff0c;不过别忘了使用PASSW…

LeetCode 406. Queue Reconstruction by Height

原题链接在这里&#xff1a;https://leetcode.com/problems/queue-reconstruction-by-height/description/ 题目&#xff1a; Suppose you have a random list of people standing in a queue. Each person is described by a pair of integers (h, k), where h is the height …

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

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

Unity读取服务器声音文件

Unity读取服务器声音文件 功能1.在网站的根目录放置一个声音文件Alarm01.wav&#xff08;这个是window系统自带的找不到这个格式的可以直接在C盘搜索&#xff09;2.在WebManager.cs脚本中添加clipPath、audio、m_downloadClip属性和DownloadSound&#xff08;&#xff09;函数&…

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

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

中信银行MySQL面试_【深圳中信银行信用卡中心面试】面试题_面试经验_面试流程-看准网...

面试官的问题&#xff1a;问SpringMVC的流程。答请求→DispatcherServlet→Handler→Controller→DispatcherServlet →ModelAndView→View。问线程池的几个参数有哪些&#xff0c;都是做什么的。答当一个任务通过execute(Runnable)方法欲添加到线程池时&#xff1a;1、 如果此…

Vue中计算属性与class,style绑定

var vmnew Vue({ el:#app, data:{ a:2, }, computed:{ //这里的b是计算属性&#xff1a;默认getter b:{ get:function(){ return this.a1 }, set:function(newValue){ this.anewValue-3 } } } }); console.log(vm.b);//3 vm.a3; console.log(vm…

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 &…

新建文件的UID和GID

默认情况下&#xff1a;新建文件的用户ID为操作当前文件进程的有效用户ID&#xff08;参考以前文章&#xff09;&#xff0c;新建文件的组ID为操作当前文件的进程的有效组ID 特殊情况&#xff1a;当当前新建文件的目录的SET-GID位被设置时&#xff0c;那么新建文件的组ID将继承…

mysql 1157_更新时出现MySQL错误1157,但是我在where子句中使用主键

我有个1157错误错误代码:1175您正在使用安全更新模式,并且尝试更新没有使用键列的WHERE的表。若要禁用安全模式,请在“首选项”->“SQL编辑器”中切换该选项并重新连接。当我试图执行这个语句时UPDATE ipSETip_countryCode GB,ip_countryName United Kingdom,ip_city Lon…

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…

java list 重复数据_java 查找list中重复数据实例详解

java 查找list中重复数据实例详解需求&#xff1a;查找一个List集合中所有重复的数据&#xff0c;重复的数据可能不止一堆&#xff0c;比如&#xff1a;aa, bb, aa, bb, cc , dd, aa这样的数据。如果有重复数据&#xff0c;则给这些重复数据加上编号&#xff0c;上述数据改为&a…

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;仅供读者参考&…