bzoj3272 Zgg吃东西
题目描述:
题解:
线段树模拟费用流。
想法和种树有点类似。
每次取区间内权值和最大的一段,然后整体乘$-1$,代表再次选中时会去掉之前的影响。
线段树维护一堆东西……
小白逛公园双倍快乐。乘$-1$时交换正反。
[滑稽]
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = ;
template<typename T>
inline void read(T&x)
{
T f = ,c = ;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){c=c*+ch-'';ch=getchar();}
x = f*c;
}
int n,m;
int chg[][];
struct n_8
{
int w,wl,wr,wu,pl,pr,pll,prr;
n_8(){}
n_8(int w,int wl,int wr,int wu,int pl,int pr,int pll,int prr):w(w),wl(wl),wr(wr),wu(wu),pl(pl),pr(pr),pll(pll),prr(prr){}
};
void chkmax(int&a,int&b,int c,int d,int e,int f)
{
if(c>e)a=c,b=d;
else a=e,b=f;
}
void chkmax(int&a,int&b,int&c,int d,int e,int f,int g,int h,int i)
{
if(d>g)a=d,b=e,c=f;
else a=g,b=h,c=i;
}
void chkmin(int&a,int&b,int c,int d,int e,int f)
{
if(c<e)a=c,b=d;
else a=e,b=f;
}
void chkmin(int&a,int&b,int&c,int d,int e,int f,int g,int h,int i)
{
if(d<g)a=d,b=e,c=f;
else a=g,b=h,c=i;
}
void Swap(int&a,int&b)
{
swap(a,b);
a=-a,b=-b;
}
n_8 operator + (n_8 a,n_8 b)
{
n_8 c;
c.w = a.w+b.w;
chkmax(c.wl,c.pll,a.wl,a.pll,a.w+b.wl,b.pll);
chkmax(c.wr,c.prr,b.wr,b.prr,b.w+a.wr,a.prr);
chkmax(c.wu,c.pl,c.pr,a.wu,a.pl,a.pr,b.wu,b.pl,b.pr);
chkmax(c.wu,c.pl,c.pr,c.wu,c.pl,c.pr,a.wr+b.wl,a.prr,b.pll);
return c;
}
struct segtree
{
int w[N<<],wl[N<<],wr[N<<],wu[N<<],pl[N<<],pr[N<<],pll[N<<],prr[N<<];
int _wl[N<<],_wr[N<<],_wu[N<<],_pl[N<<],_pr[N<<],_pll[N<<],_prr[N<<];
bool res[N<<];
void update(int u)
{
w[u] = w[u<<]+w[u<<|];
chkmax(wl[u],pll[u],wl[u<<],pll[u<<],w[u<<]+wl[u<<|],pll[u<<|]);
chkmax(wr[u],prr[u],wr[u<<|],prr[u<<|],w[u<<|]+wr[u<<],prr[u<<]);
chkmin(_wl[u],_pll[u],_wl[u<<],_pll[u<<],w[u<<]+_wl[u<<|],_pll[u<<|]);
chkmin(_wr[u],_prr[u],_wr[u<<|],_prr[u<<|],w[u<<|]+_wr[u<<],_prr[u<<]);
chkmax(wu[u],pl[u],pr[u],wu[u<<],pl[u<<],pr[u<<],wu[u<<|],pl[u<<|],pr[u<<|]);
chkmax(wu[u],pl[u],pr[u],wu[u],pl[u],pr[u],wr[u<<]+wl[u<<|],prr[u<<],pll[u<<|]);
chkmin(_wu[u],_pl[u],_pr[u],_wu[u<<],_pl[u<<],_pr[u<<],_wu[u<<|],_pl[u<<|],_pr[u<<|]);
chkmin(_wu[u],_pl[u],_pr[u],_wu[u],_pl[u],_pr[u],_wr[u<<]+_wl[u<<|],_prr[u<<],_pll[u<<|]);
}
void reser(int u)
{
res[u]^=;
w[u] = -w[u];
Swap(wl[u],_wl[u]);Swap(wr[u],_wr[u]);Swap(wu[u],_wu[u]);
swap(pl[u],_pl[u]);swap(pr[u],_pr[u]);
swap(pll[u],_pll[u]);swap(prr[u],_prr[u]);
}
void pushdown(int u)
{
if(res[u])
{
reser(u<<);
reser(u<<|);
res[u] = ;
}
}
void build(int l,int r,int u)
{
if(l==r)
{
int x;read(x);
w[u] = wu[u] = _wu[u] = wl[u] = _wl[u] = wr[u] = _wr[u] = x;
pl[u]=pr[u]=pll[u]=prr[u]=_pl[u]=_pr[u]=_pll[u]=_prr[u]=l;
return ;
}
int mid = (l+r)>>;
build(l,mid,u<<);
build(mid+,r,u<<|);
update(u);
}
void insert(int l,int r,int u,int qx,int d)
{
if(l==r)
{
w[u] = wu[u] = _wu[u] = wl[u] = _wl[u] = wr[u] = _wr[u] = d;
return ;
}
pushdown(u);
int mid = (l+r)>>;
if(qx<=mid)insert(l,mid,u<<,qx,d);
else insert(mid+,r,u<<|,qx,d);
update(u);
}
void erase(int l,int r,int u,int ql,int qr)
{
if(l==ql&&r==qr)
{
reser(u);
return ;
}
pushdown(u);
int mid = (l+r)>>;
if(qr<=mid)erase(l,mid,u<<,ql,qr);
else if(ql>mid)erase(mid+,r,u<<|,ql,qr);
else erase(l,mid,u<<,ql,mid),erase(mid+,r,u<<|,mid+,qr);
update(u);
}
n_8 query(int l,int r,int u,int ql,int qr)
{
if(l==ql&&r==qr)return n_8(w[u],wl[u],wr[u],wu[u],pl[u],pr[u],pll[u],prr[u]);
pushdown(u);
int mid = (l+r)>>;
if(qr<=mid)return query(l,mid,u<<,ql,qr);
else if(ql>mid)return query(mid+,r,u<<|,ql,qr);
else return query(l,mid,u<<,ql,mid)+query(mid+,r,u<<|,mid+,qr);
}
}tr;
int main()
{
read(n);
tr.build(,n,);
read(m);
int op,x,y,w;
for(int i=;i<=m;i++)
{
read(op),read(x),read(y);
if(!op)tr.insert(,n,,x,y);
else
{
read(w);
n_8 tmp = tr.query(,n,,x,y);
int ans = ;
for(int j=;j<=w;j++)
{
if(tmp.wu>)
{
ans+=tmp.wu;
chg[j][]=tmp.pl,chg[j][]=tmp.pr;
tr.erase(,n,,tmp.pl,tmp.pr);
tmp = tr.query(,n,,x,y);
}else
{
w = j-;
break;
}
}
printf("%d\n",ans);
for(int j=;j<=w;j++)
tr.erase(,n,,chg[j][],chg[j][]);
}
}
return ;
}
压行大法好。
bzoj3272 Zgg吃东西的更多相关文章
- bzoj3272: Zgg吃东西&&3267: KC采花
口胡 我们容易得到一个费用流的做法,流出k的流量分配给各个点,各个点向下一个点流费用为它的价值的边,然后汇总到ed 观察发现对于流一次,相当于选择了一个区间 如果流了反向边,相当于减去了这一段 可以用 ...
- BZOJ3267/3272 KC采花/Zgg吃东西(线段树)
直接维护选k个子段时的最优解似乎也可以做,然而复杂度是O(nk2logn),显然跑不过. 考虑一种费用流做法.序列里每个点拆成入点和出点,源连入汇连出,入点和出点间连流量1费用ai的边,相邻点出点向入 ...
- 【CZY选讲·吃东西】
题目描述 一个神秘的村庄里有4家美食店.这四家店分别有A,B,C,D种不同的美食.LYK想在每一家店都吃其中一种美食.每种美食需要吃的时间可能是不一样的.现在给定第1家店A种不同的美食所需要吃的时间 ...
- 清北学堂模拟赛d2t5 吃东西(eat)
题目描述一个神秘的村庄里有4家美食店.这四家店分别有A,B,C,D种不同的美食.LYK想在每一家店都吃其中一种美食.每种美食需要吃的时间可能是不一样的.现在给定第1家店A种不同的美食所需要吃的时间a1 ...
- BZOJ3638[Codeforces280D]k-Maximum Subsequence Sum&BZOJ3272Zgg吃东西&BZOJ3267KC采花——模拟费用流+线段树
题目描述 给一列数,要求支持操作: 1.修改某个数的值 2.读入l,r,k,询问在[l,r]内选不相交的不超过k个子段,最大的和是多少. 输入 The first line contains inte ...
- 【STACK】Several待填的坑
待学的习: https://www.cnblogs.com/xiao-ju-ruo-xjr/p/9149792.html 待写的题: loj#3184:「CEOI2018」斐波那契表示法 luoguP ...
- 【BZOJ-3638&3272&3267&3502】k-Maximum Subsequence Sum 费用流构图 + 线段树手动增广
3638: Cf172 k-Maximum Subsequence Sum Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 174 Solved: 9 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 洛谷P1508 Likecloud-吃、吃、吃
题目背景 问世间,青春期为何物? 答曰:“甲亢,甲亢,再甲亢:挨饿,挨饿,再挨饿!” 题目描述 正处在某一特定时期之中的李大水牛由于消化系统比较发达,最近一直处在饥饿的状态中.某日上课,正当他饿得头昏 ...
随机推荐
- 安装 statconn 使R与c#交互
很久以前完成过,但是最近重新折腾发现全忘了,所以记下来. 1.安装 R 2.安装 R studio 3.去 http://rcom.univie.ac.at/download.html 下载 stat ...
- poj 2492 A Bug's Life【带权并查集】
就是给一个无向图判是否有奇环 用带权并查集来做,边权1表示连接的两个节点异性,否则同性,在%2意义下进行加法运算即可,最后判相同的时候也要%2,因为可能有负数 #include<iostream ...
- HTML实现单行时文字居中,多行文字时左对齐显示效果
css代码: div { width: 100px; padding: 5px; text-align: center; background-color: #5dffa0; } p { paddin ...
- js页面字段的必填验证方法
https://blog.csdn.net/fn_2015/article/details/73498462 <script type="text/javascript" s ...
- spring MVC 文件上传错误
1.The request sent by the client was syntactically incorrect () http://luanxiyuan.iteye.com/blog/187 ...
- UVa 1218 Perfect Service 完美的服务
***状态设计值得一看dp[u][0]表示u是服务器(以下v均指任意u的子结点,son指u的所有子结点)ap[u][0]=sum{dp[v][1]}+1//错误,服务器是可以和其他服务器相邻的dp[u ...
- iOS中自定义UITableViewCell的用法
1.先创建一个View继承 UITableViewCell并使用xib快速建立模型. #import <UIKit/UIKit.h> #import "Score.h" ...
- P1664 每日打卡心情好
题目背景 在洛谷中,打卡不只是一个简单的鼠标点击动作,通过每天在洛谷打卡,可以清晰地记录下自己在洛谷学习的足迹.通过每天打卡,来不断地暗示自己:我又在洛谷学习了一天,进而帮助自己培养恒心.耐心.细心. ...
- mySQL 从删库到跑路
问题: 使用python实现load data infile ...向mySQL中导入数据.虽然成功执行但是数据库中没增加记录. 解决: zz的我execute之后没有commit.
- VCS 查看代码覆盖率
代码覆盖率 代码覆盖率测试一般包括行覆盖,条件覆盖,FSM覆盖,翻转覆盖率等.在不同的代码级别有不同的覆盖率,Behavioral code包含line+condition+path(branch)+ ...