数据结构之线段树Ⅴ——(李超线段树)Robot,Product Sum,Building Bridges,Jump mission

文章目录

  • Robot
  • Product Sum
  • Building Bridges
  • Jump mission

Robot

BZOJ3938

机器人每次一旦改变速度,直到下一次改变速度为止

这一时间段内机器人的位置下标可以用一次函数表示

如果知道时刻t1t_1t1即将改变速度的机器人位置,以及最近的下一次机器人速度再次变化的时刻t2t_2t2

利用数学工具,可以算出这条线段的解析式(两点式计算)

(t1,d)−(t2,d+v(t2−t1))\big(t_1,d\big)-\big(t_2,d+v(t_2-t_1)\big)(t1,d)(t2,d+v(t2t1))

机器人的多次更换速度,那么一个机器人的位置其实就是若干条折线

将操作按照时间排序,记录上一次同一个机器人的操作时间,速度等然后计算出线段

李超数就可以查询ttt时刻的最远值了(位置有正负所以计算后要取绝对值哦)

还有时间ttt的离散化,线段树内存不允许开[0,1e9][0,1e9][0,1e9]这么大

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
#define int long long
#define inf 1e9
#define maxn 600005
#define lson num << 1
#define rson num << 1 | 1
struct node{int k, b;node(){}node( int K, int B ) { k = K, b = B; }
}t[maxn << 2];struct query { int ti, k, x, opt; }q[maxn];int d[maxn], Time[maxn], V[maxn], lst_t[maxn], lst_v[maxn], T[maxn], val[maxn];
bool vis[maxn];
int m;void build( int num, int l, int r ) {t[num] = node( 0, 0 );if( l == r ) return;int mid = l + r >> 1;build( lson, l, mid );build( rson, mid + 1, r );
}int Fabs( int x ) { return x < 0 ? -x : x; }int calc( node l, int x ) { return Fabs( l.k * T[x] + l.b ); }bool cover( node lst, node now, int x ) { return calc( lst, x ) < calc( now, x ); }void insert( int num, int l, int r, node now ) {if( cover( t[num], now, l ) and cover( t[num], now, r ) ) {t[num] = now;return;}if( l == r ) return;int mid = l + r >> 1;if( cover( t[num], now, mid ) ) swap( t[num], now );if( cover( t[num], now, l ) ) insert( lson, l, mid, now );if( cover( t[num], now, r ) ) insert( rson, mid + 1, r, now );
}void modify( int num, int l, int r, int L, int R, node now ) {if( R < l or r < L ) return;if( L <= l and r <= R ) { insert( num, l, r, now ); return; }int mid = l + r >> 1;modify( lson, l, mid, L, R, now );modify( rson, mid + 1, r, L, R, now );
}int query( int num, int l, int r, int x ) {if( l == r ) return calc( t[num], x );int mid = l + r >> 1, ans;if( x <= mid ) ans = query( lson, l, mid, x );else ans = query( rson, mid + 1, r, x );return max( ans, calc( t[num], x ) );
}int find( int x ) { return lower_bound( T + 1, T + m + 1, x ) - T; }signed main() {int n, Q; char opt[10];scanf( "%lld %lld", &n, &Q );	build( 1, 0, maxn );for( int i = 1;i <= n;i ++ ) {scanf( "%lld", &d[i] );modify( 1, 0, maxn, 0, 0, node( 0, d[i] ) );}T[++ m] = 0;for( int i = 1;i <= Q;i ++ ) {scanf( "%lld %s", &q[i].ti, opt );T[++ m] = q[i].ti;if( opt[0] == 'c' ) {q[i].opt = 0;scanf( "%lld %lld", &q[i].k, &q[i].x );lst_t[i] = Time[q[i].k], Time[q[i].k] = q[i].ti;lst_v[i] = V[q[i].k], V[q[i].k] = q[i].x;}else q[i].opt = 1;}sort( T + 1, T + m + 1 );m = unique( T + 1, T + m + 1 ) - T - 1;for( int i = 1;i <= Q;i ++ )if( q[i].opt ) continue;else {int dt = q[i].ti - lst_t[i];int y = dt * lst_v[i] + d[q[i].k];int k = lst_v[i];int b = y - q[i].ti * k;modify( 1, 0, m, find( lst_t[i] ), find( q[i].ti ), node( k, b ) );d[q[i].k] = y;}for( int i = Q;i;i -- )if( vis[q[i].k] ) continue;else {vis[q[i].k] = 1;int dt = inf - q[i].ti;int y = dt * q[i].x + d[q[i].k];int k = q[i].x;int b = y - inf * k;modify( 1, 0, m, find( q[i].ti ), m, node( k, b ) );}for( int i = 1;i <= n;i ++ )if( ! vis[i] ) modify( 1, 0, m, 0, m, node( 0, d[i] ) );for( int i = 1;i <= Q;i ++ )if( q[i].opt ) printf( "%lld\n", query( 1, 0, m, find( q[i].ti ) ) );return 0;
}

Product Sum

CF631E

S=∑i=1ni∗aiS=\sum_{i=1}^ni*a_iS=i=1niai

考虑当位置iii的数插到位置jjj的时,权值的变化

  • j<ij<ij<i,位置iii的数往前插

    • ∀k∈[1,j)⋃(i,n]k∗ak\forall k\in[1,j)\bigcup (i,n]\quad k*a_kk[1,j)(i,n]kak没有变化

    • ∀k∈[j,i)\forall k\in[j,i)k[j,i) 每个数都会往后移一位,k∗ak←(k+1)∗akk*a_k\leftarrow (k+1)*a_kkak(k+1)akSSS增加∑k=ji−1ak\sum_{k=j}^{i-1}a_kk=ji1ak

    • iii前移i−ji-jij位到jjji∗ai←j∗aii*a_i\leftarrow j*a_iiaijaiSSS减少(i−j)ai(i-j)a_i(ij)ai

    • fif_ifi :考虑第iii个位置往前移动到某个位置时的最大权值,sumi=∑j=1iajsum_i=\sum_{j=1}^ia_jsumi=j=1iaj

    • 从小到大枚举i

    • fi=min⁡{S+sumi−1−sumj−1+(i−j)ai}=S+sumi−1+i⋅ai+min⁡{−j∗ai−sumj−1}f_i=\min\Big\{S+sum_{i-1}-sum_{j-1}+(i-j)a_i\Big\}=S+sum_{i-1}+i·a_i+\min\Big\{-j*a_i-sum_{j-1}\Big\} fi=min{S+sumi1sumj1+(ij)ai}=S+sumi1+iai+min{jaisumj1}

    • −j-jj看做直线斜率kkk−sumj−1-sum_{j-1}sumj1看做直线截距bbbaia_iai就是因变量xxx

  • j>ij>ij>i,位置iii的数往后插

    • ∀k∈[1,i)⋃(j,n]k∗ak\forall k\in[1,i)\bigcup (j,n]\quad k*a_kk[1,i)(j,n]kak没有变化

    • ∀k∈(i,j]\forall k\in(i,j]k(i,j] 每个数都会往前移一位,k∗ak←(k−1)∗akk*a_k\leftarrow (k-1)*a_kkak(k1)akSSS减少∑k=i+1jak\sum_{k=i+1}^ja_kk=i+1jak

    • iii后移j−ij-iji位到jjji∗ai←j∗aii*a_i\leftarrow j*a_iiaijaiSSS增加(j−i)ai(j-i)a_i(ji)ai

    • fif_ifi :考虑第iii个位置往移动后到某个位置时的最大权值,sumi=∑j=1iajsum_i=\sum_{j=1}^ia_jsumi=j=1iaj

    • 从大到小枚举i

    • fi=min⁡{S−(sumj−sumi)+(j−i)ai}=S+sumi−i⋅ai+min⁡{j∗ai−sumj}f_i=\min\Big\{S-(sum_j-sum_i)+(j-i)a_i\Big\}=S+sum_i-i·a_i+\min\Big\{j*a_i-sum_j\Big\} fi=min{S(sumjsumi)+(ji)ai}=S+sumiiai+min{jaisumj}

    • jjj看做直线斜率kkk−sumj-sum_{j}sumj看做直线截距bbbaia_iai就是因变量xxx

#include <cstdio>
#include <iostream>
using namespace std;
#define int long long
#define inf 1e18
#define maxn 1000000
#define lson num << 1
#define rson num << 1 | 1
struct node {int k, b;node(){}node( int K, int B ) { k = K, b = B; }
}t[( maxn + 5 ) << 3];void build( int num, int l, int r ) {t[num] = node( 0, -inf );if( l == r ) return;int mid = l + r >> 1;build( lson, l, mid );build( rson, mid + 1, r );
}int calc( node l, int x ) { return l.k * x + l.b; }int cover( node lst, node now, int x ) { return calc( lst, x ) < calc( now, x ); }void insert( int num, int l, int r, node now ) {if( cover( t[num], now, l ) and cover( t[num], now, r ) ) {t[num] = now;return;}if( l == r ) return;int mid = l + r >> 1;if( cover( t[num], now, mid ) ) swap( t[num], now );if( cover( t[num], now, l ) ) insert( lson, l, mid, now );if( cover( t[num], now, r ) ) insert( rson, mid + 1, r, now );
}int query( int num, int l, int r, int x ) {if( l == r ) return calc( t[num], x );int mid = l + r >> 1, ans = 0;if( x <= mid ) ans = query( lson, l, mid, x );else ans = query( rson, mid + 1, r, x );return max( ans, calc( t[num], x ) );
}int A[maxn], sum[maxn], ans, ret;
int n;
signed main() {scanf( "%lld", &n );for( int i = 1;i <= n;i ++ ) scanf( "%lld", &A[i] );for( int i = 1;i <= n;i ++ ) sum[i] = sum[i - 1] + A[i];for( int i = 1;i <= n;i ++ ) ans += i * A[i];ret = ans;build( 1, -maxn, maxn );insert( 1, 1, n, node( 1, 0 ) );for( int i = 2;i <= n;i ++ ) {ret = max( ret, ans + sum[i - 1] - A[i] * i + query( 1, -maxn, maxn, A[i] ) );insert( 1, -maxn, maxn, node( i, - sum[i - 1] ) );}build( 1, -maxn, maxn );insert( 1, -maxn, maxn, node( n, -sum[n] ) );for( int i = n - 1;i;i -- ) {ret = max( ret, ans + sum[i] - A[i] * i + query( 1, -maxn, maxn, A[i] ) );insert( 1, -maxn, maxn, node( i, - sum[i] ) );}printf( "%lld\n", ret );return 0;
}

Building Bridges

LOJ2483

dpi:dp_i:dpi: 使1−i1-i1i联通的最小花费

考虑暴力dpdpdp转移,枚举桥建筑在jjjiii根柱子之间

dpi=min⁡{dpj+∑k=j+1i−1wk+(hi−hj)2}dp_i=\min\Big\{dp_j+\sum_{k=j+1}^{i-1}w_k+(h_i-h_j)^2\Big\}dpi=min{dpj+k=j+1i1wk+(hihj)2}

前缀和优化,sumi=∑j=1iwjsum_i=\sum_{j=1}^iw_jsumi=j=1iwj
dpi=min⁡{dpj+sumi−1−sumj+hi2−2hihj+hj2}=sumi−1+hi2+min⁡{−2hj∗hi+dpj−sumj+hj2}dp_i=\min\Big\{dp_j+sum_{i-1}-sum_{j}+h_i^2-2h_ih_j+h_j^2\Big\}\\ =sum_{i-1}+h_i^2+\min\Big\{-2h_j*h_i+dp_j-sum_j+h_j^2\Big\} dpi=min{dpj+sumi1sumj+hi22hihj+hj2}=sumi1+hi2+min{2hjhi+dpjsumj+hj2}

#include <cstdio>
#include <iostream>
using namespace std;
#define int long long
#define maxn 1000000
#define lson num << 1
#define rson num << 1 | 1
#define inf 1e18
struct node {int k, b;node(){}node( int K, int B ) { k = K, b = B; }
}t[( maxn + 5 ) << 2];int calc( node l, int x ) { return l.k * x + l.b; }bool cover( node lst, node now, int x ) { return calc( lst, x ) > calc( now, x ); }void build( int num, int l, int r ) {t[num] = node( 0, inf );if( l == r ) return;int mid = l + r >> 1;build( lson, l, mid );build( rson, mid + 1, r );
}void insert( int num, int l, int r, node now ) {if( cover( t[num], now, l ) and cover( t[num], now, r ) ) {t[num] = now;return;}if( l == r ) return;int mid = l + r >> 1;if( cover( t[num], now, mid ) ) swap( t[num], now );if( cover( t[num], now, l ) ) insert( lson, l, mid, now );if( cover( t[num], now, r ) ) insert( rson, mid + 1, r, now );
}int query( int num, int l, int r, int x ) {if( l == r ) return calc( t[num], x );int mid = l + r >> 1, ans;if( x <= mid ) ans = query( lson, l, mid, x );else ans = query( rson, mid + 1, r, x );return min( ans, calc( t[num], x ) );
}int h[maxn], w[maxn], dp[maxn], sum[maxn];signed main() {int n;scanf( "%lld", &n );for( int i = 1;i <= n;i ++ ) scanf( "%lld", &h[i] );for( int i = 1;i <= n;i ++ ) scanf( "%lld", &w[i] );for( int i = 1;i <= n;i ++ ) sum[i] = sum[i - 1] + w[i];build( 1, 0, maxn );insert( 1, 0, maxn, node( -2 * h[1], -sum[1] + h[1] * h[1] ) );for( int i = 2;i <= n;i ++ ) {dp[i] = sum[i - 1] + h[i] * h[i] + query( 1, 0, maxn, h[i] );insert( 1, 0, maxn, node( -2 * h[i], dp[i] - sum[i] + h[i] * h[i] ) );}printf( "%lld\n", dp[n] );return 0;
}

Jump mission

CodeChef

dpi:dp_i:dpi:iii座山停留的最小花费

考虑暴力dpdpdp转移,枚举上一次停留在jjj
dpi=min⁡{dpj+Ai+hi2−2hihj+hj2}=Ai+hi2+min⁡{−2hj∗hi+dpj+hj2}dp_i=\min\Big\{dp_j+A_i+h_i^2-2h_ih_j+h_j^2\Big\}=A_i+h_i^2+\min\Big\{-2h_j*h_i+dp_j+h_j^2\Big\} dpi=min{dpj+Ai+hi22hihj+hj2}=Ai+hi2+min{2hjhi+dpj+hj2}
从小到大枚举iii,利用前面枚举过的山当jjj,这只能保证j<ij<ij<i的条件

然而本题多了一个Pj<PiP_j<P_iPj<Pi的限制

这个时候只有献出神祭——树套树,将PPP利用树状数组嵌套在李超线段树外面

自然内存就会多一些,看着开就行了

#include <cstdio>
#include <iostream>
using namespace std;
#define int long long
#define inf 5e18
#define maxn 600000
struct node {int k, b;node(){ k = 0, b = inf; }node( int K, int B ) { k = K, b = B; }
}t[maxn * 80];
int lson[maxn * 80], rson[maxn * 80];
int cnt;int calc( node l, int x ) { return l.k * x + l.b; }bool cover( node lst, node now, int x ) { return calc( lst, x ) > calc( now, x ); }void insert( int &num, int l, int r, node now ) {if( ! num ) num = ++ cnt, t[num] = node( 0, inf );if( cover( t[num], now, l ) and cover( t[num], now, r ) ) {t[num] = now;return;}if( l == r ) return;int mid = ( l + r ) >> 1;if( cover( t[num], now, mid ) ) swap( t[num], now );if( cover( t[num], now, l ) ) insert( lson[num], l, mid, now );if( cover( t[num], now, r ) ) insert( rson[num], mid + 1, r, now );
}int query( int num, int l, int r, int x ) {if( ! num ) return inf;if( l == r ) return calc( t[num], x );int mid = ( l + r ) >> 1, ans;if( x <= mid ) ans = query( lson[num], l, mid, x );else ans = query( rson[num], mid + 1, r, x );return min( ans, calc( t[num], x ) );
}int p[maxn], a[maxn], h[maxn], dp[maxn], root[maxn];
int n;int lowbit( int i ) { return i & -i; }void add( int i, node l ) {for( ;i <= n;i += lowbit( i ) ) insert( root[i], 1, maxn, l );
}int query( int i, int x ) {int ans = inf;for( ;i;i -= lowbit( i ) ) ans = min( ans, query( root[i], 1, maxn, x ) );return ans;
}signed main() {scanf( "%lld", &n );for( int i = 1;i <= n;i ++ ) scanf( "%lld", &p[i] );for( int i = 1;i <= n;i ++ ) scanf( "%lld", &a[i] );for( int i = 1;i <= n;i ++ ) scanf( "%lld", &h[i] );dp[1] = a[1], add( p[1], node( -2 * h[1], h[1] * h[1] + dp[1] ) );for( int i = 2;i <= n;i ++ ) {dp[i] = a[i] + h[i] * h[i] + query( p[i], h[i] );add( p[i], node( - 2 * h[i], h[i] * h[i] + dp[i] ) );}printf( "%lld\n", dp[n] );return 0;
}

李超数注意两点即可

  • 推出能够转化成直线解析式的转移方程式
  • 确定线段树点的区间范围,究竟是哪个值做线段树区间,是否需要离散化

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

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

相关文章

模板:拉格朗日插值(多项式)

所谓拉格朗日插值&#xff0c;就是在“拉格朗日”进行的一项民俗活动。拉格朗日通常在每年2月的第82个星期三。 &#xff08;逃&#xff09; 前言 非常强大的算法。 当可以证明某个函数是一个 kkk 次多项式时&#xff0c;我们就可以插入 k1k1k1 个函数值并快速的求出我们要求…

程序员修神之路--分布式缓存的一条明路(附代码)

菜菜呀&#xff0c;由于公司业务不断扩大&#xff0c;线上分布式缓存服务器扛不住了呀程序员主力 Y总如果加硬件能解决的问题&#xff0c;那就不需要修改程序菜菜我是想加服务器来解决这个问题&#xff0c;但是有个问题呀程序员主力 Y总&#xff1f;&#xff1f;&#xff1f;菜…

2019 ICPC Asia Nanjing Regional

题号题目难度知识点AA Hard Problem签到题思维题BChessboardCDigital Path签到题dfs记忆化搜索DHolesEObservationFPaper GradingGPoker GameHPrince and Princess四稳铜快银思维题ISpace StationJSpyKTriangle三题快铜计算几何

uoj#751-[UNR #6]神隐【交互】

正题 题目链接:https://uoj.ac/problem/751 题目大意 有一棵nnn个点的树&#xff0c;你每次可以选择一个边集&#xff0c;交互库会返回你所有联通块&#xff0c;要求这棵树。 n≤2000n\leq 2000n≤2000&#xff0c;操作次数不超过141414。 或 n≤131072n\leq 131072n≤131072…

模板:快速莫比乌斯变换(FMT)+快速沃尔什变换(FWT)(多项式)

文章目录前言解析OR定义变换&#xff1a;逆变换代码AND代码XOR定义变换逆变换代码所谓快速沃尔什变换&#xff0c;就是快速的沃尔玛什锦专柜变换 &#xff08;逃&#xff09; 前言 正常卷积的定义&#xff1a;ck∑ijkaibjc_k\sum_{ijk}a_ib_jck​∑ijk​ai​bj​。 可以用FFT…

[AtCoder Beginner Contest 216] 题解

文章目录A - Signed DifficultyB - Same NameC - Many BallsD - Pair of BallsE - Amusement ParkF - Max Sum CountingG - 01Sequence比赛链接A - Signed Difficulty 签到题 #include <cstdio> int x, y; char c; int main() {scanf( "%d%c%d", &x, &am…

长沙.NET技术社区正式成立

感谢大家的关注&#xff0c;请允许我冒昧的向大家汇报长沙.NET技术社区第一次交流会的会议进展情况。活动过程汇报2019年2月17日&#xff0c;继深圳&#xff0c;广州&#xff0c;西安&#xff0c;成都&#xff0c;苏州相继成立了.net社区之后&#xff0c;酝酿已久的长沙.net社区…

A Hard Problem

A Hard Problem 题意&#xff1a; 给定一个n&#xff0c;要求找到最小的正数k&#xff0c;使得在集合T中任意选K个数&#xff0c;其中存在两个不同的u和v&#xff0c;u是v的因子 题解&#xff1a; 一开始想偏了&#xff0c;往质因数方向想了&#xff0c;然后因为1e9的以内的…

hdu7207-Find different【burnside引理】

正题 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid7207 题目大意 一个序列aaa&#xff0c;和它相同的序列当且仅当能通过以下操作实现相同&#xff1a; 将a1a_1a1​丢到ana_nan​&#xff0c;其余的向前移动一位。令所有ai(ai1)%ma_i(a_i1)\%mai​(ai​1)%m 对于n…

洛谷P6097:【模板】子集卷积(FWT)

解析 完全可以当一道 DP 题而不是模板来做。 首先第一个条件&#xff1a; i∣jki|jki∣jk 比较简单&#xff0c;直接上FWT板子即可。 考虑第二个条件&#xff1a;i&j0i\&j0i&j0。若设 ∣x∣|x|∣x∣ 表示二进制下 1 的个数&#xff0c;那么就有&#xff1a; ∣i∣…

Asp.NetCore轻松学-部署到 IIS 进行托管

前言经过一段时间的学习&#xff0c;终于来到了部署服务这个环节&#xff0c;.NetCore 的部署方式非常的灵活多样&#xff0c;但是其万变不离其宗&#xff0c;所有的 Asp.NetCore 程序都基于端口的侦听&#xff0c;在部署的时候仅需要配置侦听地址、端口&#xff08;一个或者多…

线段树/扫描线问卷调查反馈——Rmq Problem / mex(主席树),Boring Queries(二分+st表+主席树),Colorful Squares(扫描线)

文章目录Rmq Problem / mexBoring QueriesColorful SquaresRmq Problem / mex luogu4137 对aia_iai​建权值线段树 再加上可持久化 对于第RRR个版本的线段树&#xff0c;每个叶子xxx存的是aixa_ixai​x的所有iii中最大的小于RRR的位置iii 那么询问[L,R][L,R][L,R]就转化成…

C - Digital Path 计蒜客 - 42397 05-29

C - Digital Path 计蒜客 - 42397 题意&#xff1a; 题意就是给出一个n ∗ m的数字矩阵每个矩阵元素之间只能上下左右走&#xff0c;而且下一个位置必须比当前位置的数字大1&#xff0c;入口和出口必须数边缘元素&#xff0c;求可以有多少条路径。 题解&#xff1a; 第一反…

响应式编程知多少 | Rx.NET 了解下

1. 引言An API for asynchronous programming with observable streams. ReactiveX is a combination of the best ideas from the Observer pattern, the Iterator pattern, and functional programming.ReactiveX 使用可观察数据流进行异步编程的API。 ReactiveX结合了观察者…

数据结构之trie树——First! G,电子字典,Type Printer,Nikitosh and xor

文章目录[USACO12DEC]First! G[JSOI2009]电子字典[IOI2008] Type PrinterNikitosh and xor[USACO12DEC]First! G luogu3065 考虑每一个字符串成为答案的可能 这意味着从字典树根到字符串最后一位就恰好对应重新定义的字典序 在第iii层的时候&#xff0c;想要走特定点&#…

H - Prince and Princess 计蒜客 - 42402

H - Prince and Princess 计蒜客 - 42402 题意: 你现在要寻找公主&#xff0c;有三种人&#xff0c;第一种是说真话的人(至少为1&#xff0c;因为公主是说真话的人)&#xff0c;第二种人是只会说假话的&#xff0c;第三种是胡说八道的(说的话真假都有可能)。现在给你三种人的…

模板:min-max容斥离散随机变量的几何分布(洛谷P3175:[HAOI2015]按位或)

前言 见到一道神题&#xff0c;学会两个知识点… 都是数学。 min-max容斥 给出式子&#xff1a; max⁡(S)∑T⊂S(−1)∣T∣1min⁡(T)\max(S)\sum_{T\sub S}(-1)^{|T|1}\min(T)max(S)T⊂S∑​(−1)∣T∣1min(T) min⁡(S)∑T⊂S(−1)∣T∣1max⁡(T)\min(S)\sum_{T\sub S}(-1)^…

杭电多校杂题收录

前言 和学长学弟一起打的hdu多校&#xff0c;打的很菜没啥难题收录&#xff0c;因为难的我都不会做。 正题 hdu7152-Copy 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid7152 题目大意 nnn个数字的序列aaa&#xff0c;mmm次操作&#xff0c;每次将一段[l,r][l,r][l,r…

.NET Core中的验证组件FluentValidation的实战分享

今天有人问我能不能出一篇FluentValidation的教程&#xff0c;刚好今天在实现我们的.NET Core实战项目之CMS的修改密码部分的功能中有用到FluentValidation&#xff0c;所以就以修改用户密码为实例来为大家进行一下ASP.NET Core中的验证组件FluentValidation的实战分享&#xf…

笛卡尔树详解带建树模板及例题运用(Largest Submatrix of All 1’s,洗车 Myjnie,Removing Blocks,SPOJ PERIODNI)

文章目录笛卡尔树介绍例题Largest Submatrix of All 1’s应用「POI2015」洗车 Myjnie[AGC028B] Removing BlocksSPOJ PERIODNI笛卡尔树 介绍 笛卡尔树是一种数据结构&#xff0c;每个点由两个值&#xff0c;键值key和权值val&#xff0c;组成 其键值满足二叉树性质 即点的左子…