题目描述:

bz

题解:

线段树模拟费用流。

想法和种树有点类似。

每次取区间内权值和最大的一段,然后整体乘$-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吃东西的更多相关文章

  1. bzoj3272: Zgg吃东西&&3267: KC采花

    口胡 我们容易得到一个费用流的做法,流出k的流量分配给各个点,各个点向下一个点流费用为它的价值的边,然后汇总到ed 观察发现对于流一次,相当于选择了一个区间 如果流了反向边,相当于减去了这一段 可以用 ...

  2. BZOJ3267/3272 KC采花/Zgg吃东西(线段树)

    直接维护选k个子段时的最优解似乎也可以做,然而复杂度是O(nk2logn),显然跑不过. 考虑一种费用流做法.序列里每个点拆成入点和出点,源连入汇连出,入点和出点间连流量1费用ai的边,相邻点出点向入 ...

  3. 【CZY选讲·吃东西】

    题目描述 一个神秘的村庄里有4家美食店.这四家店分别有A,B,C,D种不同的美食.LYK想在每一家店都吃其中一种美食.每种美食需要吃的时间可能是不一样的.现在给定第1家店A种不同的美食所需要吃的时间 ...

  4. 清北学堂模拟赛d2t5 吃东西(eat)

    题目描述一个神秘的村庄里有4家美食店.这四家店分别有A,B,C,D种不同的美食.LYK想在每一家店都吃其中一种美食.每种美食需要吃的时间可能是不一样的.现在给定第1家店A种不同的美食所需要吃的时间a1 ...

  5. BZOJ3638[Codeforces280D]k-Maximum Subsequence Sum&BZOJ3272Zgg吃东西&BZOJ3267KC采花——模拟费用流+线段树

    题目描述 给一列数,要求支持操作: 1.修改某个数的值 2.读入l,r,k,询问在[l,r]内选不相交的不超过k个子段,最大的和是多少. 输入 The first line contains inte ...

  6. 【STACK】Several待填的坑

    待学的习: https://www.cnblogs.com/xiao-ju-ruo-xjr/p/9149792.html 待写的题: loj#3184:「CEOI2018」斐波那契表示法 luoguP ...

  7. 【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 ...

  8. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  9. 洛谷P1508 Likecloud-吃、吃、吃

    题目背景 问世间,青春期为何物? 答曰:“甲亢,甲亢,再甲亢:挨饿,挨饿,再挨饿!” 题目描述 正处在某一特定时期之中的李大水牛由于消化系统比较发达,最近一直处在饥饿的状态中.某日上课,正当他饿得头昏 ...

随机推荐

  1. 与adb相关的问题,比如掉线问题、Android Studio 提示Session 'app':Error Installing APK、找不到设备

    这一篇帖子 会写的比较简单 不过相信大家也可能遇到这些问题   为了怕自己忘记  记录下来  顺便也和大家一起分享 描述:在一些机型上安装软件 提示卸载原先的软件  但是又安装不上新软件 DELETE ...

  2. poj1308【并查集】

    = =.如果输入的两个数相等.就不是一颗树啊,不能自己指向自己. 水.(瞎开的数组). //#include <bits/stdc++.h> #include<iostream> ...

  3. bzoj 4197: [Noi2015]寿司晚宴【状压dp】

    一个数内可能多个的质因数只有小于根号n的,500内这样的数只有8个,所以考虑状压 把2~n的数处理出小于根号500的质因数集压成s,以及大质数p(没有就是1),然后按p排序 根据题目要求,拥有一个质因 ...

  4. bzoj 3277: 串 & bzoj 3473: 字符串【后缀自动机||后缀数组】

    建一个广义后缀自动机(每加完一个串都返回root),在parent树上dpsum记录合法长度,打着时间戳往上跳,最后每个串在自动机上跑一变统计答案即可. 后缀数组理解起来可能方便一点,但是难写,就只说 ...

  5. android ViewPager 与Fragment

    ViewPager 左右滑动数据显示 1. 整体布局 FragmentLayout 容器包裹Fragment <?xml version="1.0" encoding=&qu ...

  6. $.ajax从后台取数据 然后做字符串拼接的例子

  7. linux添加开机启动脚本

    [root@mysql ~]# ll /etc/rc.local lrwxrwxrwx. 1 root root 13 Mar 12 22:20 /etc/rc.local -> rc.d/rc ...

  8. 一个Nice的生活主题博客模板

    https://www.bitcron.com/ https://api.bitcron.com/ https://chopstack.com/

  9. 总结 - 常见的JavaScript兼容性问题

    添加事件的方法 (元素, 绑定的事件类型, 事件触发的方法) addHandler: function (element, type, handler) { if (element.addEventL ...

  10. 507 Perfect Number 完美数

    对于一个 正整数,如果它和除了它自身以外的所有正因子之和相等,我们称它为“完美数”.给定一个 正整数 n, 如果他是完美数,返回 True,否则返回 False示例:输入: 28输出: True解释: ...