首页 > 其他分享 >luogu P7219 [JOISC2020] 星座 3

luogu P7219 [JOISC2020] 星座 3

时间:2022-08-27 20:24:02浏览次数:85  
标签:return int luogu ll Tree JOISC2020 P7219 Ro define

题面传送门

实在没东西写了,随便拉一道题凑数。

首先看这个东西就感觉只和两个点有关,事实上也是这样。

关于最大值的问题肯定要把笛卡尔树建立出来,然后最大值变成两个点的LCA的权值。

根据NOID1T2那题的方法设\(f_{i,j}\)为\(i\)子树内最高的为\(j\)的最小代价,这样合并两个子树的时候可以枚举两边最高的点的高度,如果小于等于当前点权值就可以合并。

对于笛卡尔树上新增的点的问题,可以考虑,只有当前小于等于\(A_x\)的位置可以转移,而且转移之后剩下的点要加上这个权值。

容易发现上述过程可以用一个线段树合并维护,时间复杂度\(O(n\log n)\)

code:

#include<bits/stdc++.h>
#define Gc() getchar() 
#define Me(x,y) memset(x,y,sizeof(x))
#define Mc(x,y) memcpy(x,y,sizeof(x))
#define d(x,y) ((k+1)*(x)+(y))
#define R(n) (rnd()%(n)+1)
#define Pc(x) putchar(x)
#define LB lower_bound
#define UB upper_bound
#define PB push_back
using ll=long long;using db=double;using lb=long db;using ui=unsigned;using ull=unsigned ll;
using namespace std;const int N=2e5+5,M=N*50+5,K=2e3+5,mod=998244353,Mod=mod-1;const db eps=1e-5;const ll INF=1e18;
int L[N],R[N],A[N],st[N],H,n,m,x,y,z,Ro[N];ll g[N],F1,F2;struct Ques{int x,y;};vector<Ques> S[N];bool cmp(Ques x,Ques y){return x.x<y.x;}
namespace Tree{
	ll f[M],g[M];int L[M],R[M],cnt;void PF(int x,ll w){x&&(f[x]+=w,g[x]+=w);}void P(int v){g[v]&&(PF(L[v],g[v]),PF(R[v],g[v]),g[v]=0);}void Up(int v){f[v]=min(L[v]?f[L[v]]:INF,R[v]?f[R[v]]:INF);}
	void Ins(int x,ll y,int &v,int l=0,int r=n){!v&&(f[v=++cnt]=INF);f[v]=min(f[v],y);if(l==r) return;int m=l+r>>1;P(v);x<=m?Ins(x,y,L[v],l,m):Ins(x,y,R[v],m+1,r);}
	ll Qry(int x,int y,int &v,int l=0,int r=n){if(!v||y<l||x>r) return INF;if(x<=l&&r<=y)return f[v];int m=l+r>>1;P(v);return min(x<=m?Qry(x,y,L[v],l,m):INF,y>m?Qry(x,y,R[v],m+1,r):INF);}
	int Merge(int x,int y,int z,int l=0,int r=n){if(!x||!y) {ll G1=Qry(0,z,x,l,r),G2=Qry(0,z,y,l,r);PF(x,F2);PF(y,F1);F1=min(F1,G1);F2=min(F2,G2);return x|y;}if(l==r){l<=z&&(F1=min(F1,f[x]),F2=min(F2,f[y]));f[x]=min(f[x]+F2,f[y]+F1);return x;}P(x);P(y);int m=l+r>>1;L[x]=Merge(L[x],L[y],z,l,m);R[x]=Merge(R[x],R[y],z,m+1,r);return Up(x),x;}
	void print(int &v,int l=0,int r=n){if(!v) return;if(l==r) {printf("%d %lld\n",l,f[v]);return;}P(v);int m=l+r>>1;print(L[v],l,m);print(R[v],m+1,r);}
}
void Solve(int x){Tree::Ins(0,0,Ro[x]);int i,j;ll Ts;
	if(L[x]) {Solve(L[x]);F1=F2=INF;Ro[x]=Tree::Merge(Ro[x],Ro[L[x]],A[x]);}if(R[x]) {Solve(R[x]);F1=F2=INF;Ro[x]=Tree::Merge(Ro[x],Ro[R[x]],A[x]);}
	//printf("%d\n",x);Tree::print(Ro[x]);Pc('\n');
	if(S[x].size()) Ts=Tree::Qry(0,A[x],Ro[x]);for(Ques i:S[x]) Tree::Ins(i.x,Ts-i.y,Ro[x]);for(Ques i:S[x]) Tree::PF(Ro[x],i.y);
	//printf("%d\n",x);Tree::print(Ro[x]);Pc('\n');
}
int main(){
	freopen("1.in","r",stdin);
	int i,j;scanf("%d",&n);for(i=1;i<=n;i++) scanf("%d",&A[i]);scanf("%d",&m);while(m--) scanf("%d%d%d",&x,&y,&z),S[x].PB((Ques){y,z});
	A[0]=1e9;for(i=1;i<=n;i++) {while(A[i]>A[st[H]]) H--;L[i]=R[st[H]];R[st[H]]=i;st[++H]=i;}Solve(R[0]);printf("%lld\n",Tree::f[Ro[R[0]]]);
}

标签:return,int,luogu,ll,Tree,JOISC2020,P7219,Ro,define
From: https://www.cnblogs.com/275307894a/p/16631367.html

相关文章

  • Luogu1310 表达式的值 - 模拟 -
    题目链接:https://www.luogu.com.cn/problem/P1310题解:先考虑没有括号的情况,显然可以根据+的位置划分成若干段,每段的结果必须为0如何处理?因为每段+之间必然均为,答案就......
  • 【luogu AT2377】Blue and Red Tree(思维)(STL)(启发式合并)
    BlueandRedTree题目链接:luoguAT2377题目大意给你一棵树,每次你可以选一条路径,删掉其中的一条边,然后把路径两断点编号在另一个一样点数的图上连边。然后给你一个要求......
  • [LuoGu8482]Number
    Description[LuoGu8482]NumberSolution可以当作一种经典案例给定数字后乘积如何最大Code#include<bits/stdc++.h>usingnamespacestd;#defineN800010structre......
  • luogu P5311 [Ynoi2011] 成都七中
    题面传送门首先考虑暴力怎么做。按照UNRD2T2找到每个联通块最高点的套路,我们可以找到每个询问点的祖先中,这个点到祖先路径上的点全部位于\([l,r]\)区间中的最浅的祖先,那么......
  • 【luogu AT2366】Prefix Median(DP)
    PrefixMedian题目链接:luoguAT2366题目大意给你一个长度为2n-1的序列,你可以任意排序它们,问你有多少个不同的b数组。b数组的第i位为a数组1~2i-1区间的数的......
  • 【luogu P2508】圆上的整点(高斯素数模板)
    圆上的整点题目链接:luoguP2508题目大意给你一个圆,问你圆周上有多少个点的坐标是整点。思路考虑一个东西叫做高斯整数。其实它是复数,是\(a+bi\)中\(a,b\)都是整......
  • luogu P1488 肥猫的游戏
    肥猫的游戏P1488肥猫的游戏-洛谷|计算机科学教育新生态(luogu.com.cn)题目描述野猫与胖子,合起来简称肥猫,是一个班的同学,他们也都是数学高手,所以经常在一起讨论数......
  • luogu P1721 [NOI2016] 国王饮水记
    题面传送门首先我们发现,一定不会有低于\(h_1\)的参与操作的过程。然后考虑一个\(x\)与比它大的\(y<z\),则发现一定是先\((x,y)\),再\((\frac{x+y}{2},z)\)更好。因为这样......
  • luogu P8293 [省选联考 2022] 序列变换
    题面传送门因为WC2022考了这种构造,所以下意识将括号序列建树。手玩一下发现第一个操作实际上是干了这个事情:也就是说把用其中一个括号将另一个同层括号在树上移到了下......
  • luoguP3521 [POI2011]ROT-Tree Rotations【线段树】
    你要写热,就不能只写热。要写酷暑,写骄阳,写他人耳闻便生恐的炙烤和炎灼。要写白日出门一刻便肤色黝黑,背心透彻。写求雨心切,写出行伞遮。写夜晚不停的风扇和蝉聒。写鸡......