首页 > 其他分享 >2024.2.22模拟赛T3 题解

2024.2.22模拟赛T3 题解

时间:2024-02-22 22:12:45浏览次数:25  
标签:2024.2 22 rs int 题解 void tot ls id

对于区间连边,可以线段树优化建图
对于单点连边,可以使用李超线段树维护迪杰斯特拉

code

#include<bits/stdc++.h>
using namespace std;
#define N 400005
#define int long long
#define pii pair<int,int> 
#define fir first
#define sec second
int n,m,tot;
int val[N];
const int inf=1e18;
vector<pii > G[N];
void cun(int x,int y,int z){
	G[x].push_back({y,z});
}
namespace JT{
	int rt1,rt2;
	int ls[N],rs[N];
	int build(int l,int r,int op){
		tot++;
		if(l==r){
			if(!op) cun(l,tot,0);
			else cun(tot,l,0);
			return tot;
		}
		int mid=(l+r)>>1,id=tot;
		ls[id]=build(l,mid,op);
		rs[id]=build(mid+1,r,op);
		if(!op) cun(ls[id],id,0),cun(rs[id],id,0);
		else cun(id,ls[id],0),cun(id,rs[id],0);
		return id;
	}
	void lk(int p,int l,int r,int x,int y,int id,int w){
		if(x<=l&&r<=y){
			if(!w) cun(p,id,0);
			else cun(id,p,w);
			return ;
		}
		int mid=(l+r)>>1;
		if(x<=mid) lk(ls[p],l,mid,x,y,id,w);
		if(mid<y) lk(rs[p],mid+1,r,x,y,id,w);
	}
}
namespace LCT{
	int tot;
	int c[N*4],ll[N*4],rr[N*4];
	pii mn[N*4];
	struct LINE{
		int x,y,k,b;
	}li[N];
	int cal(int x,int p){
		if(x<1||x>n) return inf;
		return li[p].k*x+li[p].b;
	}
	void up(int p){
		int ls=p*2,rs=p*2+1;
		ll[p]=min(ll[ls],ll[rs]);
		rr[p]=max(rr[ls],rr[rs]);
		pii p1={cal(ll[p],c[p]),ll[p]},p2={cal(rr[p],c[p]),rr[p]};
		mn[p]=min(p1,p2);
		mn[p]=min(mn[p],mn[ls]);
		mn[p]=min(mn[p],mn[rs]);
	}
	void build(int p,int l,int r){
		if(l==r){
			mn[p]={inf,0},ll[p]=rr[p]=l;
			return ;
		}
		int mid=(l+r)>>1;
		build(p*2,l,mid),build(p*2+1,mid+1,r);
		up(p);
	}
	void pre(){li[0]={1,n,0,inf};build(1,1,n);}
	void add(int p,int l,int r,int x){
		if(l==r){
			if(cal(l,x)<cal(l,c[p])) c[p]=x;
			mn[p]={cal(ll[p],c[p]),ll[p]};
			return ;
		}
		int mid=(l+r)>>1;
		if(cal(mid,x)<cal(mid,c[p])) swap(x,c[p]);
		if(cal(l,x)<cal(l,c[p])) add(p*2,l,mid,x);
		if(cal(r,x)<cal(r,c[p])) add(p*2+1,mid+1,r,x);
		up(p);
	}
	void ding(int p,int l,int r,int x,int y,int u){
		if(x<=l&&r<=y){
			add(p,l,r,u);
			return ;
		}
		int mid=(l+r)>>1;
		if(x<=mid) ding(p*2,l,mid,x,y,u);
		if(mid<y) ding(p*2+1,mid+1,r,x,y,u);
		up(p);
	}
	void dell(int p,int l,int r,int x){
		if(l==r){
			mn[p]={inf,0};
			assert(rr[p]);
			ll[p]=n+1,rr[p]=0;
			return ;
		}
		int mid=(l+r)>>1;
		if(x<=mid) dell(p*2,l,mid,x);
		else dell(p*2+1,mid+1,r,x);
		up(p);
	}
	void ins(int x,int y,int k,int b){
		if(x>y) return ;
		li[++tot]={x,y,k,b};
		ding(1,1,n,x,y,tot);
	}
}
int dis[N],u[N];
priority_queue<pii,vector<pii >,greater<pii > > q;
void add(int x){
	LCT::ins(1,x-1,-val[x],dis[x]+val[x]*x);
	LCT::ins(x+1,n,val[x],dis[x]-val[x]*x);
}
void del(int x){
	u[x]=1;
	if(x<=n) LCT::dell(1,1,n,x);
}
pii gt_qm(){
	if(q.empty()) return {inf,0};
	pii p=q.top();
	while(u[p.sec]){
		q.pop();
		if(q.empty()) return {inf,0};
		p=q.top();
	}
	return p;
}
void dij(){
	memset(dis,9,sizeof(dis));
	LCT::pre();
	dis[1]=0,q.push({0,1});
	for(int zu=1,x;zu<=tot;zu++){
		pii p1=gt_qm();
		pii p2=LCT::mn[1];
		if(p1<=p2) x=p1.sec,dis[x]=min(dis[x],p1.fir),q.pop();
		else x=p2.sec,dis[x]=min(dis[x],p2.fir);
		//printf("dij: x=%lld p1=(%lld,%lld) p2=(%lld,%lld)\n",x,p1.fir,p1.sec,p2.fir,p2.sec);
		if(!x) break;
		del(x);
		for(auto p:G[x]){
			int y=p.fir,z=p.sec;
		//	printf("zhuan: %lld %lld\n",y,z);
			if(dis[y]>dis[x]+z) dis[y]=dis[x]+z,q.push({dis[y],y});
		}
		if(val[x]) add(x); 
	}
}
signed main(){
	freopen("tunnel.in","r",stdin);
	freopen("tunnel.out","w",stdout);
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++) scanf("%lld",&val[i]);
	tot=n,JT::rt1=JT::build(1,n,0),JT::rt2=JT::build(1,n,1);
	for(int i=1,sl,sr,tl,tr,w;i<=m;i++){
		scanf("%lld%lld%lld%lld%lld",&sl,&sr,&tl,&tr,&w);tot++;
		JT::lk(JT::rt1,1,n,sl,sr,tot,0),JT::lk(JT::rt2,1,n,tl,tr,tot,w);
	}
	dij();
	if(dis[n]<dis[0]) printf("%lld\n",dis[n]);
	else printf("-1\n");
	return 0;
}

标签:2024.2,22,rs,int,题解,void,tot,ls,id
From: https://www.cnblogs.com/hubingshan/p/18028324

相关文章

  • 2.22 闲话 & solution 『虽然我不是神/不像他们无所不能/却总畏惧一语成谶』
    有↑没有↓谁↑能够↓代↑替↓我↑(去考开学的一调)唐氏模拟赛,板子大战,全场都是板子,\(\textT3\)甚至还不如板子,\(byd\)题解居然是用的高贵的\(O(n\logn)\)算欧拉函数,唐\(\text{lxyt}\)复活赛打赢了可以去打\(\text{HEOI2024}\)了,体验名额DZ和xrlong的代码进行了大量对拍,仍......
  • 李宏毅2022机器学习HW3 Image Classification
    Homework3数据集下载在本地环境下进行实验总是令人安心,但是又苦于网上找不到数据集,虽然kaggle上有数据集但是下载存在问题于是有了一个天才的想法,间接从kaggle上下载(利用output文件夹中的文件是可下载这一机制将数据集从input文件夹拷贝到output文件夹),具体操作如下图等待数......
  • Visual Studio 2022 .Net 8 启用AOT publish enabled 发布失败
    .Net8NativeAOT的优势: 我使用VisualStudio2022创建了一个面向.NET8的控制台应用程序。我在创建项目时选中了启用本机AOT发布选项。它给出了以下错误: 错误文本:发布遇到错误。发布遇到错误。我们无法确定错误的原因。检查输出日志以获取更多详细信息。诊断......
  • 2024.2.22 LGJ Round
    A你需要求\(n\timesm\)格子里随机撒\(k\)个点,期望扫多少次使得相邻的格子没有同时有点。\(n\timesm\le80,k\le20\)。直接状压求出方案数即可。B你需要维护一个数组,支持区间求和或执行覆盖操作fori:=ltordoa[i]:=a[i-k]或区间回溯成一开始的数。可持久化平衡......
  • 2.21+2.22考试总结
    连续两天数组开小,\(D1T1\30+D2T2\60+D2T4\10\),一旦数组开大就\(A\)了\(qwq\)。Day1T1排序题目大意:给出一个长度为\(4n\)的序列\(a\),要求将其配对为\(n\)个四元组\(x_i,y_i,z_i,w_i\),求\(\max\sum\limits_{i=1}^n|x_iy_i-z_iw_i|\)。难度:三星(满分十星)发现绝......
  • 数星星题解补充
    题解中那个看似暴力的染色,实际上正确性显然,直接看75%的时间复杂度证明然后还是直接看75分的部分它的里面说是用set维护块的前驱后继,然后全网没有一篇这样的题解,似乎全世界就我一个用这个方法于是想了一中午终于想到如何维护:就是用set记录每一个块的最后一个的位置,由于是区间覆......
  • 闲话222
    今天是222欸......
  • P3870 分块题解
    这篇题解有点问题(分块标记处),但现在不想修,等有空修吧link分块是一种很神奇的暴力,学了它就会觉得什么都可以用分块做。分块的主要思想就是整块快速查询,散块暴力查询。比如说,分块可以在\(O(q\sqrt{n}+n)\)的时间复杂度内解决线段树模板题。回到本题,显然我们可以用每个块维护......
  • CF1372F Omkar and Modes 题解
    来个乱搞。思路考虑分治。对于最裸的暴力。我们可以调用solve(l,r)进行查询。假如这个区间的众数的出现次数是区间长度,那么可以直接退出,否则我们可以继续分治。我们把这个暴力进行加工一下。我们知道\(l\simr\)的区间众数后。查询\(l\simmid\)的区间众数,若完全......
  • CF1845F Swimmers in the Pool 题解
    思路考虑两个人什么时候会相遇。根据小学的相遇追及问题,两人会相遇的条件为:\[2\timesk\timesl=t\times(v1+v2)\]\[2\timesk\timesl=t\times(v1-v2)\]那么对于一个速度\(v\)。它可一相遇的次数即为:\[\frac{t\timesv}{2\timesl}\]当然,这样有可能会算重,也就是在相同......