切题 (problem)(线段树+最大流最小割)

切题 problem

  • description
  • solution
  • code

description

在一个神秘的 JOSLFN 上,wzy 和 lqs2015 常年占据着切题榜的 rk1 和 rk2。现在他们在研究
如何快速造题并验题。
分工是这样的:有 n 个 wzy 负责造题,第 i 个 wzy 会造出恰好 ai 道题。有 m 个 lqs2015 负责
验题,第 j 个 lqs2015 最多能验 bj 道题。每个 wzy 需要把他造的每一道题都给一个 lqs2015 来验。
不过有一条限制,就是每个 wzy 的 ai 道题必须给不同的 lqs2015 ,否则这个 lqs2015 会因为验到了
来自同一个 wzy 的题而感到厌烦并且让所有 wzy 和 lqs2015 都消失。
在一旁瑟瑟发抖的 superay 想要知道,是否存在一种符合限制的验题的分配方案。
随着时间的推移,会有 q 次对 a, b 的修改。每次修改有如下四种:
• 1 i 表示将 ai 加 1。
• 2 i 表示将 ai 减 1。
• 3 j 表示将 bj 加 1。
• 4 j 表示将 bj 减 1。
superay 想知道每次修改之后还是否存在合法方案。

Input
第一行两个正整数 n, m。
第二行 n 个非负整数 a1, a2, ···, an。
第三行 m 个非负整数 b1, b2, ···, bm。
第四行一个正整数 q。
接下来 q 行,每行是如下四种之一:
• 1 i (1 ≤i ≤n)
• 2 i (1 ≤i ≤n)
• 3 j (1 ≤j ≤m)
• 4 j (1 ≤j ≤m)
保证任意时刻 a, b 都非负。

Output
输出 q 行,第 i 行表示在第 i 次操作之后的答案,有解输出 1,无解输出 0。

solution

subtask1: n,m,q<=50

这么小的数据,肯定是暴力基础分,直接贪心做

贪心:造题数越多的人越先处理,验题数越多的人越先验

显然,这是为了留下更多的验题人和越小需要不同验题人数的造题人


subtask2: n,m,q<=1000

当时以为是什么n2log⁡nn^2\log nn2logn的算法,整个数据结构

没想到原来是留给暴力网络流的

这是个最大网络流模板,如果告诉了是网络流,建图方式是显然的

超级源点SSS,超级汇点TTT

造题人和SSS连边,流量为aia_iai,验题人和TTT连边,流量为bib_ibi,然后每个造题人和每个验题人之间都有连边,流量为111

肯定的,网络流只有满流了才表示有解,即最大流为∑i=1nai\sum_{i=1}^na_ii=1nai

最后就是暴力跑网络流了


subtask3~4: n,m,q<=250000

subtask3\text{subtask3}subtask3可能是给正解写爆了的人准备的

通过subtask2\text{subtask2}subtask2,已经知道是明显的网络流了,但是数据显然不允许直接硬刚

显然,剩下的工作就是寻找优化

众所周知,最大网络流等于最小割

aia_iai从大到小排序,满流等价于∀k∈[0,n]\forall k\in[0,n]k[0,n],有∑i=1kai≤∑i=1mmin⁡(bi,k)\sum_{i=1}^ka_i\le \sum_{i=1}^m\min(b_i,k)i=1kaii=1mmin(bi,k)

(可以用最小割来理解,也可以用贪心的思路来理解)

巧妙地转化一下,设ckc_kck表示bi≥kb_i\ge kbik的个数,则∑i=1mmin⁡(bi,k)=∑i=1kci\sum_{i=1}^m\min(b_i,k)=\sum_{i=1}^kc_ii=1mmin(bi,k)=i=1kci

所以满流要求等价于,∀k∈[0,n]\forall k\in[0,n]k[0,n]∑i=1kci−ai≥0\sum_{i=1}^kc_i-a_i\ge 0i=1kciai0

这个可以用线段树来维护每个kkk∑i=1kci−ai\sum_{i=1}^kc_i-a_ii=1kciai最小值

  • 具体而言,记录sum=∑i=1naisum=\sum_{i=1}^na_isum=i=1naiaia_iai是已经排序后的结果)

    要求∑i=1kck−ak≥0\sum_{i=1}^k c_k-a_k\ge 0i=1kckak0,但是随着kkk的变化,aaa的累和也在变,不同的ckc_kck要大于的aka_kak累和也不一样

    我们不妨通过一些累加,使得最后要比较的对象都是sumsumsum

    即,ck←∑i=k+1naic_k\leftarrow \sum_{i=k+1}^na_icki=k+1nai

    所以线段树上每个kkk放的其实是∑i=1kci\sum_{i=1}^kc_ii=1kci

    最后就是比较线段树的最小值是否≥sum\ge sumsum即可

  • 虽然放的是∑i=1kci\sum_{i=1}^kc_ii=1kci,但我们还是通过∑i=1mmin⁡(bi,k)\sum_{i=1}^m\min(b_i,k)i=1mmin(bi,k)求得的

    bbb从小到大排序后,枚举kkk,用指针nownownow指向最后一个≤k\le kkbib_ibi

    后面[now+1,n][now+1,n][now+1,n]的和自然是k×(n−now)k\times (n-now)k×(nnow)

    nownownow个的bib_ibi,可以前缀和预处理,上面累加的区间aia_iai同理

接下来就是考虑四种操作对线段树造成的影响

  • 操作1:ai+11:a_i+11:ai+1

    首先找到aia_iai排序后的区间[l,r][l,r][l,r](很有可能不只一个值为aia_iai

    只会对线段树上a[0,l)a[0,l)a[0,l)区间造成111的影响

    仔细想想,只有[0,l)[0,l)[0,l)才会得到后面部分[l,n][l,n][l,n]特殊手段的累加,最后比较对象才会是sumsumsum

    ai+1a_i+1ai+1后,假设重新排序就会在[l,r][l,r][l,r]前面,真正影响的是比aia_iai大的a[0,l)a[0,l)a[0,l)

  • 操作2:ai−12:a_i-12:ai1

    与操作111同理,只不过是对a[0,r)a[0,r)a[0,r)区间造成−1-11的影响

    ai−1a_i-1ai1后,假设重新排序就会在[l,r][l,r][l,r]后面,[l,r][l,r][l,r]也被影响到

  • 操作3:bi+13:b_i+13:bi+1

    只有原本满足ck≥bi+1c_k\ge b_i+1ckbi+1ckc_kck才会+1+1+1

  • 操作4:bi−14:b_i-14:bi1

    只有原本满足ck≥bic_k\ge b_ickbickc_kck才会−1-11

都是区间加减的操作

code

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
#define int long long
#define maxn 250005
#define N 500005
int n, m, Q, sum;
int A[maxn], B[maxn], a[maxn], b[maxn], suma[maxn], sumb[maxn], c[maxn], tree[maxn];void add( int i, int x ) {i ++;for( ;i < N;i += i & -i ) tree[i] += x;
}int ask( int i ) {i ++; int ans = 0;for( ;i > 0;i -= i & -i ) ans += tree[i];return ans;
}#define lson now << 1
#define rson now << 1 | 1
int Min[maxn << 2], tag[maxn << 2];void build( int now, int l, int r ) {if( l == r ) { Min[now] = c[l]; return; };int mid = ( l + r ) >> 1;build( lson, l, mid );build( rson, mid + 1, r );Min[now] = min( Min[lson], Min[rson] );
}void pushdown( int now ) {Min[lson] += tag[now];tag[lson] += tag[now];Min[rson] += tag[now];tag[rson] += tag[now];tag[now] = 0;
}void modify( int now, int l, int r, int L, int R, int x ) {if( R < l or r < L or L > R ) return;if( L <= l and r <= R ) {Min[now] += x;tag[now] += x;return;}pushdown( now );int mid = ( l + r ) >> 1;modify( lson, l, mid, L, R, x );modify( rson, mid + 1, r, L, R, x );Min[now] = min( Min[lson], Min[rson] );
}signed main() {scanf( "%lld %lld", &n, &m );for( int i = 1;i <= n;i ++ ) {scanf( "%lld", &A[i] );add( A[i], 1 );a[i] = A[i];sum += a[i];}   for( int i = 1;i <= m;i ++ ) {scanf( "%lld", &B[i] );b[i] = B[i];}sort( a + 1, a + n + 1, []( int x, int y ) { return x > y; } );sort( b + 1, b + m + 1 );b[m + 1] = 1e9;for( int i = 1;i <= max( n, m );i ++ ) {suma[i] = suma[i - 1] + a[i];sumb[i] = sumb[i - 1] + b[i];}c[0] = sum;for( int i = 1, now = 0;i <= n;i ++ ) {while( b[now + 1] <= i ) now ++;c[i] = suma[n] - suma[i] + sumb[now] + i * ( m - now );}build( 1, 0, n );scanf( "%lld", &Q );while( Q -- ) {int opt, i;scanf( "%lld %lld", &opt, &i );switch( opt ) {case 1 : {sum ++;int x = n - ask( A[i] ) + 1;modify( 1, 0, n, 0, x - 1, 1 );add( A[i], -1 ), add( ++ A[i], 1 );break;}case 2 : {sum --;int x = n - ask( A[i] - 1 );modify( 1, 0, n, 0, x - 1, -1 );add( A[i], -1 ), add( -- A[i], 1 ); break;}case 3 : {modify( 1, 0, n, ++ B[i], n, 1 );break;}case 4 : {modify( 1, 0, n, B[i] --, n, -1 );break;}}if( Min[1] < sum ) printf( "0\n" );else printf( "1\n" );}return 0;
}

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

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

相关文章

通过 Azure Pipelines 实现持续集成之docker容器化

IntroAzure DevOps Pipeline 现在对于公开的项目完全免费&#xff0c;这对于开源项目来讲无疑是个巨大的好消息&#xff0c;在 Github 的 Marketplace 里有个 Azure Pipeline&#xff0c;就是微软的 Azure DevOps Pipeline。实现 Docker 容器化的持续集成实现的目标&#xff1a…

YBTOJ:最小数(欧拉函数)

解析 题意可以化为&#xff1a; 8∗10x−19kn08*\frac{10^x-1}{9}kn08∗910x−1​kn0 然后用 8 尽可能的消去 9n9n9n 中的2的幂次&#xff0c;随后问题转化为&#xff1a; 10x≡1(modn′)10^x\equiv 1\pmod {n}10x≡1(modn′) 然后…我就觉得这个是exbsgs了… 但其实完全不用阿…

Acwing 1082. 数字游戏

Acwing 1082. 数字游戏 题意&#xff1a; 现在大家决定玩一个游戏&#xff0c;指定一个整数闭区间 [a,b]&#xff0c;问这个区间内有多少个不降数。 题解&#xff1a; 利用数位dp的套路来做 我们还是利用前缀和来做 我们先求1~n中满足情况的个数 对于一个n位数&#xff0c;…

天下第一 txdy (LCT+双指针+线段树)

天下第一 txdydescriptionsolutioncodedescription djq_cpp 是天下第一的。 djq_cpp 给了你一个 n 个点 m 条边的无向图&#xff08;无重边自环&#xff09;&#xff0c;点标号为 1 ∼n。祂想要考考你&#xff0c; 有多少对整数对 (l, r) 满足&#xff1a; • 1 ≤l ≤r ≤n •…

Acwing 1083. Windy数

Acwing 1083. Windy数 题意&#xff1a; Windy 定义了一种 Windy 数&#xff1a;不含前导零且相邻两个数字之差至少为 2 的正整数被称为 Windy 数。 Windy 想知道&#xff0c;在 A 和 B 之间&#xff0c;包括 A 和 B&#xff0c;总共有多少个 Windy 数&#xff1f; 题解&am…

【招聘(南京)】南京纳龙科技有限公司招高级.net开发工程师

南京纳龙科技有限公司成立于2002年12月&#xff0c;隶属纳龙科技在南京成立的研发中心&#xff0c;坐落于南京市雨花台区。公司立志以守护人类心脏健康为使命&#xff0c;专注推动心电信息化技术的发展&#xff0c;为全国各级医疗机构提供心电检查、诊断一体化的解决方案。公司…

模板:k短路(可并堆)

所谓k短路&#xff0c;就是第k短的路。 &#xff08;逃&#xff09; 解析 给出一个有向图&#xff0c;求 s−ts-ts−t 的不严格第 k 短的路径。 A*算法 对于一个状态 (x,cost)(x,cost)(x,cost)&#xff0c;即到 xxx 时走过长度为 costcostcost&#xff0c;定义一个估价函数&a…

大鱼吃小鱼(fhq-treap/线段树二分+贪心)

大鱼吃小鱼descriptionsolutioncodedescription 《大鱼吃小鱼》是一款经典的儿童益智类游戏&#xff0c;在游戏中&#xff0c;玩家所操控的“大鱼”只能吃掉体积严格小于自己的“小鱼”&#xff0c;然后玩家所操控的“大鱼”的体积就会增加“小鱼”的体积这么多的量。 知名主…

Acwing 1081. 度的数量(以及本人对数位dp的浅薄理解)

题意&#xff1a; 求给定区间 [X,Y] 中满足下列条件的整数个数&#xff1a;这个数恰好等于 K 个互不相等的 B 的整数次幂之和。 题解&#xff1a; 数位DP 技巧1&#xff1a;[X,Y]>f(Y)-f(X-1) 技巧2&#xff1a;用树的方式来考虑。 在本题中&#xff0c;题意是问[X,Y]中…

EFCore动态切换Schema

最近做个分库分表项目&#xff0c;用到schema的切换感觉还是有些坑的&#xff0c;在此分享下。 先简要说下我们的分库分表分库分表规则我定的规则是&#xff0c;订单号&#xff08;数字&#xff09;除以16&#xff0c;得出的结果为这个订单所在的数据库&#xff0c;然后他的余数…

YBTOJ:工作评估(分块)

解析 首先想想 O(nm)O(nm)O(nm) 怎么做。 从左往右扫&#xff0c;不断把当前值和 x0x_0x0​ 取 max⁡\maxmax 即可。 考虑正解&#xff1a; 设 f(l,r,w)f(l,r,w)f(l,r,w) 为初始为 www&#xff0c;工作区间为 (l,r)(l,r)(l,r) 结束后的价值&#xff0c;s(l,r)∑ilrais(l,r)\s…

黑客(续) (压位高精+状压dp)

黑客&#xff08;续&#xff09;descriptionsolutioncodedescription 【问题描述】 在破解了世界首富 Bychaha 的银行账户后&#xff0c;知名黑客 pks 发现&#xff0c;要得到 Bychaha 的全部财产&#xff0c;必须再破解一道密码。 作为客户账户安全的最后一道防线&#xff0…

东莞.NET俱乐部线下技术沙龙-活动报名

自广州.NET技术俱乐部在2018年12月08日线下活动顺利开展后&#xff0c;东莞作为兄弟城市&#xff0c;也想通过线下活动的方式&#xff0c;点燃东莞.NET技术的熊熊之火。现决定先借助广州、深圳兄弟城市的帮助下&#xff0c;开展一场东莞方主办的线下活动&#xff0c;聚集东莞本…

Acwing 1084. 数字游戏 II

Acwing 1084. 数字游戏 II 题意&#xff1a; 指定一个整数闭区间 [a.b]&#xff0c;问这个区间内有多少个取模数。 取模数&#xff1a;这种数字必须满足各位数字之和 mod N 为 0。 题解&#xff1a; 数位dp 这里不细讲数位dp了&#xff0c;可以看看 Acwing 1081. 度的数量&…

ybtoj洛谷P3268:圆的异或并(扫描线)

解析 很神奇的一道题。 关键条件&#xff1a;任意两个圆无交。 把一个圆分成上下两个圆弧&#xff0c;那么所有圆弧的高度关系不会发生变化。 所以可以开一个 set&#xff0c;维护一个从左往右扫的扫描线&#xff0c;按照当前扫描线的横坐标定义比较符号&#xff0c;在圆的最…

如何撰写较受欢迎的技术文章

本来我这篇文章的标题是 “如何撰写受欢迎的技术文章”&#xff0c;但反复斟酌之下&#xff0c;还是加了一个“较”字&#xff0c;这主要是考虑我不是什么知名作者&#xff0c;写的文章大多也谈不上很受欢迎&#xff0c;贸然地谈“受欢迎” 是有点忐忑的&#xff0c;而改成现在…

朝鲜时蔬(分数据点写算法+毒瘤数学)

朝鲜时蔬decriptionsolutioncodedecription 对于一个有穷非空正整数集合S{x1,x2,x3,...,xn}⊂N(n≥1)S\{x_1,x_2,x_3,...,x_n\}\subset N^(n\ge 1)S{x1​,x2​,x3​,...,xn​}⊂N(n≥1)&#xff0c;定义其和sum(S)sum(S)sum(S)为所有元素的和 sum(S)x1...xnsum(S)x_1...x_nsum…

洛谷P7515:矩阵游戏(差分约束)

解析 如果没有元素均要在 [0,1e6][0,1e6][0,1e6] 的条件&#xff0c;可以很容易的构造出一个合法解。 那么我们就要通过调整得到的解&#xff0c;使所有数都在合法范围内。 注意到&#xff0c;每次给某一行/列依次1,-1,1,-1…这样仍然符合要求。 让每一行/列错开&#xff0c;…

Recursive sequence HDU - 5950

Recursive sequence HDU - 5950 题意&#xff1a; 给你一个式子&#xff1a;f[n]2f[n-2]f[n-1]n4 给你f[1]和f[2]&#xff0c;给你一个n&#xff0c;求f[n] f[1],f[2],n<231 题解&#xff1a; 很明显&#xff0c;矩阵快速幂&#xff0c;但是太久没做这种题&#xff0c;我…

使用Http-Repl工具测试ASP.NET Core 2.2中的Web Api项目

今天&#xff0c;Visual Studio中没有内置工具来测试WEB API。使用浏览器&#xff0c;只能测试http GET请求。您需要使用Postman&#xff0c;SoapUI&#xff0c;Fiddler或Swagger等第三方工具来执行WEB API的完整测试。在ASP.NET Core 2.2中&#xff0c;引入了一个名为“http-r…