草庐IT

CF1682F MCMF?

羽秋 2023-03-28 原文

题意:

费用流,其实bushi
给你长为\(n\)的序列\(a\),\(b\)\(a\)单增,\(b\)有正有负。
\(q\)次询问\([l,r]\),保证\(\sum\limits_{i=l}^rb_i=0\),将区间\([l,r]\)中每个值当节点,\(b_i<0\)的连S,\(b_i>0\)的连T,容量为\(abs(b_i)\)。两两点连边,容量为inf,费用为\(abs(a_i-a_j)\)。问最小费用最大流。

思路:

显然有一个感性的贪心思路:每次尽量会去抵消前面最近的需要抵消的流量,抵消后自己剩余的留量就留给后面抵消。这样就可以从前枚举\(l~r\),考虑每个点贡献对前面流单位流量贡献\(a_i\),后面\(-a_i\)
关键是前后分别流多少?
\(s_i\)\(b_i\)求前缀和。

  • \(b_i<0\)
    1.\(s_{i-1}-s_{l-1}<=0\)\(s_{l-1}>=s_{i-1}\) :全部贡献给后面,贡献\(-a_i*b_i\)
    2.\(0<s_{i-1}-s_{l-1}<-b_i\)\(s_i<s_{l-1}<s_{i-1}\) :\((s_{i-1}+s_i-2*s_{l-1})*a_i\)
    3.\(s_{i-1}-s_{l-1}>=-b_i\)\(s_{l-1}<=s_{i}\) \(a_i*b_i\)
  • \(b_i>0\)
    第一、三种情况和前面是一样的,第二种情况变号……

发现询问跟\(i\)\(s_{l}\)有关,如果用主席树处理好了每个\(i\)的贡献,记录一个版本,具体修改三次区间修改即可,操作2要维护两个值(关于/不关于\(s_{l-1}\))。这样询问,直接\(rt_{l-1}\)\(rt_r\)版本差分单点查询。

ps.不建议写,非常卡空间,官方有更好写的树状数组写法,也可以离线线段树,当然我是为了练主席树。

code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
const int M=1e7+5e6;
const int mod=1e9+7;
int m,n,rt[N],q;
ll sum[N],s[N],a[N],b[N],val[N];
struct segment {
	int nd,p,q,ls[M],rs[M],va[M],vab[M];
	ll w1,w2,part;
	void Update(int &x,int l,int r,int lst) {
		if(x<=part){x=++nd;if(lst){ls[x]=ls[lst],rs[x]=rs[lst];va[x]=va[lst],vab[x]=vab[lst];}}
		if(p<=l&&r<=q) {if(w1)va[x]=(va[x]+w1)%mod;vab[x]=(vab[x]+w2)%mod;return;}
		int mid=(l+r)>>1;
		if(p<=mid)Update(ls[x],l,mid,ls[lst]);
		if(q>mid)Update(rs[x],mid+1,r,rs[lst]);
	}
	void Query(int x,int y,int l,int r) {
//		printf("!x=%d y=%d [%d,%d]  w1=%lld w2=%lld\n",x,y,l,r,va[y]-va[x],vab[y]-vab[x]);
		w1=(w1+va[y]-va[x])%mod;w2=(w2+vab[y]-vab[x])%mod;
		if(l==r) {return;}
		int mid=(l+r)>>1;
		(p<=mid)?Query(ls[x],ls[y],l,mid):Query(rs[x],rs[y],mid+1,r);
	}
	void init() {
		for(int i=1;i<=n;i++) {
			part=nd;
//			printf("i=%d ~~~\n",i);
			int opt=(b[i]<0)?-1:1,l,r;
			if(opt<0) {l=s[i],r=s[i-1];}
			else {l=s[i-1],r=s[i];}
			w1=-a[i]*b[i]%mod,w2=0,p=0,q=l,Update(rt[i],1,m,rt[i-1]);
			w1=a[i]*b[i]%mod,w2=0,p=r,q=m,Update(rt[i],1,m,rt[i-1]);
			if(r-l<=1)continue;
			w1=-opt*(sum[i-1]+sum[i])*a[i]%mod,w2=2*opt*a[i]%mod,p=l+1,q=r-1,Update(rt[i],1,m,rt[i-1]);
		}
	}
}S;
void in_puts() {
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++) {scanf("%lld",&a[i]);}
	for(int i=1;i<=n;i++) {scanf("%lld",&b[i]);s[i]=sum[i]=val[i]=s[i-1]+b[i];sum[i]%=mod;}
	sort(val,val+1+n);
	m=unique(val,val+1+n)-val;
	for(int i=0;i<=n;i++) {s[i]=lower_bound(val,val+m,s[i])-val+1;}
} 
int main() {
	in_puts();
	S.init();
	for(int i=1;i<=q;i++) {
		int l,r;scanf("%d%d",&l,&r);
		S.w1=S.w2=0,S.p=s[l-1];S.Query(rt[l-1],rt[r],1,m);
		ll ans=S.w2*sum[l-1]+S.w1;
		printf("%lld\n",(ans%mod+mod)%mod);
	}
	return 0;
}

有关CF1682F MCMF?的更多相关文章

  1. javascript - 使用 javascript 获取 Cloudflare 的 HTTP_CF_IPCOUNTRY header ? - 2

    有很多关于如何使用javascript获取httpheader的问题,但由于某些原因,它们没有显示HTTP_CF_IPCOUNTRYheader。如果我尝试使用phpecho$_SERVER["HTTP_CF_IPCOUNTRY"];,它会工作,所以CF工作得很好。是否可以使用javascript获取此header? 最佳答案 @Quentin的回答是正确的,适用于任何试图访问服务器header的javascript客户端。但是,由于这个问题特定于Cloudlfare,并且特定于在HTTP_CF_IPCOUNTRYheader中正常

  2. javascript - CF连接到云 Controller - 2

    我使用以下库连接到云Controllerhttps://github.com/prosociallearnEU/cf-nodejs-clientconstendpoint="https://api.mycompany.com/";constusername="myuser";constpassword="mypass";constCloudController=new(require("cf-client")).CloudController(endpoint);constUsersUAA=new(require("cf-client")).UsersUAA;constApps=new

  3. linux - 构建 cf-cli : go build runtime: linux/386 must be bootstrapped using make. bash 时出错 - 2

    CloudFoundry的CLI工具位于cloudfoundry/cli是用围棋写的。我正在尝试构建CLI工具但出现此错误:gobuildruntime:linux/386必须使用make.bash引导如何解决这个问题?下面是cli/bin/build-all.sh脚本的内容:#!/bin/bashset-eset-xOUTDIR=$(dirname$0)/../outGOARCH=amd64GOOS=windows$(dirname$0)/build&&cp$OUTDIR/cf$OUTDIR/cf-windows-amd64.exeGOARCH=386GOOS=windows$(di

  4. c# - XmlSerializer 在 .NET 3.5 和 CF.NET 3.5 之间有所不同 - 2

    我有一个在CF.NET和.NET下运行的库,但两者之间的序列化不同。因此,在CF.NET下生成的XML文件在.NET下不可读,这对我来说是个大问题!这里是代码示例:[Serializable,XmlRoot("config")]publicsealedclassRemoteHost:IEquatable{//...}publicclassProgram{publicstaticvoidMain(){RemoteHosthost=newRemoteHost("A");Listhosts=newList();hosts.Add(host);XmlSerializerser=newXmlSe

  5. Windows CF_DIB 到剪贴板中的 CF_BITMAP - 2

    我完全没有使用过Windows编程,但现在我有一个问题想在某个程序中修复。我需要将图像放置到Windows剪贴板,并且我有指向有效DIB(设备独立位图)的原始指针(在我的实验中,dibheader版本为3)。该程序使用具有延迟剪贴板渲染的模型,这意味着首先我们使用SetClipboardData(CF_DIB,NULL)然后在WM_RENDERFORMAT消息上程序将实际数据放入剪贴板使用SetClipboardData(format,dibDataPointer)。当我打开clipbrd.exe(在windowsxp上)并选择DIBView时,我可以毫无问题地看到图像。但是在msdn

  6. c# - 序列在 EF CF 迁移中包含多个元素错误 - 2

    我创建了一些模型,添加了迁移,然后执行了更新数据库操作,但在我最后一次更新数据库操作时,我收到了错误消息:Sequencecontainsmorethanoneelement您可以在下面找到我的迁移配置:context.Categories.AddOrUpdate(p=>p.CategoryName,newCategory{CategoryName="Sport"},newCategory{CategoryName="Music"});context.Subcategories.AddOrUpdate(p=>p.SubcategoryName,newSubcategory{Subcat

  7. c# - ZXing.Net 在 CF 中将字符串编码为二维码 - 2

    如何使用ZXing.Net将我的字符串编码为二维码?我已经可以解码了,但是编码有问题。它有一条错误消息:没有可用于AZTEC格式的编码器。这是我的代码:IBarcodeWriterwriter=newBarcodeWriter();BitmapbarcodeBitmap;varresult=writer.Encode("Hello").ToBitmap();barcodeBitmap=newBitmap(result);pictureBox1.Image=barcodeBitmap; 最佳答案 您没有完全初始化BarcodeWrit

  8. c# - 检测 USB 连接——C# .Net CF 3.5 - 2

    我有一个应用程序(.NetCompactFramework3.5)在WindowsMobile6.1设备上运行,我想检测USB连接何时发生变化(连接或断开连接)。我最初使用SystemProperty.CradlePresent属性来触发事件,但我想知道这是否仅在连接的设备具有ActiveSync时才有效?我将通过USB从未运行ActiveSync的Linux设备接收连接。我仍然可以使用SystemProperty.CradlePresent来检测USB的连接/断开连接吗?或者我是否需要探索其他选项来检测USB事件?谢谢。 最佳答案

  9. c# - 如何在 c# .net CF 3.5 中使用 XmlDocument 向 xml 添加属性 - 2

    我需要为元素“aaa”创建一个前缀为“xx”的属性“abc”。以下代码添加了前缀,但它也将namespaceUri添加到元素。要求的输出:我的代码:XmlNodenode=doc.SelectSingleNode("//mybody");XmlElementele=doc.CreateElement("aaa");XmlAttributenewAttribute=doc.CreateAttribute("xx","abc",namespace);newAttribute.Value="ddd";ele.Attributes.Append(newAttribute);node.Inser

  10. php - api调用后Wordpress使cf7无效 - 2

    这是我的问题,我安装了用于wordpress的联系表7,在wpcf7_before_send_mail期间我调用了API,如果API返回错误,我需要使表单无效,然后我需要使请求无效并返回错误从API调用返回。我在API失败时将标志设置为false,错误消息也被存储,但尽管我导致失败,但我的表单正在成功通过。add_action("wpcf7_before_send_mail","wpcf7_send_contact_builder");functionwpcf7_send_contact_builder($form){$submission=WPCF7_Submission::get_

随机推荐