数据结构二之线段树Ⅰ——Count Color,Hotel,Transformation,Tree Generator™

普通的下标线段树

  • Count Color
  • Hotel
  • Transformation
  • Tree Generator™

Count Color

POJ2777

查询区间内颜色种类数,观察到颜色种类数只有30,完全可以状压成整型存储,没有必要开30棵线段树

区间内有这颜色就置为111,没有这个颜色就是000

非常简单

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define maxn 100005
#define maxc 32
#define lson num << 1
#define rson num << 1 | 1
int n, T, m;
struct node {int tag, ans;
}t[maxn << 2];void pushdown( int num ) {if( ! t[num].tag ) return;t[lson].ans = t[lson].tag = t[num].tag;t[rson].ans = t[rson].tag = t[num].tag;t[num].tag = 0;
}void modify( int num, int l, int r, int L, int R, int x ) {if( r < L or R < l ) return;if( L <= l and r <= R ) {t[num].ans = t[num].tag = 1 << x;return;}pushdown( num );int mid = ( l + r ) >> 1;modify( lson, l, mid, L, R, x );modify( rson, mid + 1, r, L, R, x );t[num].ans = t[lson].ans | t[rson].ans;
}void build( int num, int l, int r ) {t[num].ans = 1 << 1, t[num].tag = 0;if( l == r ) return;int mid = ( l + r ) >> 1;build( lson, l, mid );build( rson, mid + 1, r );
}int query( int num, int l, int r, int L, int R ) {if( R < l or r < L ) return 0;if( L <= l and r <= R ) return t[num].ans;pushdown( num );int mid = ( l + r ) >> 1;return query( lson, l, mid, L, R ) | query( rson, mid + 1, r, L, R );
}int main() {scanf( "%d %d %d", &n, &T, &m );build( 1, 1, n );char opt[5]; int l, r, x;while( m -- ) {scanf( "%s %d %d", opt, &l, &r );if( l > r ) swap( l, r );if( opt[0] == 'C' ) {scanf( "%d", &x );modify( 1, 1, n, l, r, x );}else {int ans = query( 1, 1, n, l, r );printf( "%d\n", __builtin_popcount( ans ) );			}}return 0;
}

Hotel

POS3667

主要考察对于区间多个性质的维护

维护最长连续空白区间,前缀最长,后缀最长,区间长度,以及区间下标左右端点

主要考察代码实现能力,思维量并不高

较简单

#include <cstdio>
#include <iostream>
using namespace std;
#define maxn 50005
#define lson num << 1
#define rson num << 1 | 1
struct node {int l, r, len, Max, lmax, rmax, tag;
/*
len 区间长度
Max 最长的连续空白区间
lmax 区间左端开始向右连续的空白区间长度
rmax 区间右端开始向左连续的空白区间长度 
*/ 
}t[maxn << 2];
int n, m;void build( int num, int l, int r ) {t[num].len = t[num].Max = t[num].lmax = t[num].rmax = r - l + 1;t[num].l = l, t[num].r = r, t[num].tag = 0;if( l == r ) return;int mid = l + r >> 1;build( lson, l, mid );build( rson, mid + 1, r );
}void pushup( int num ) {if( t[lson].lmax == t[lson].len ) t[num].lmax = t[lson].len + t[rson].lmax;else t[num].lmax = t[lson].lmax;if( t[rson].rmax == t[rson].len ) t[num].rmax = t[rson].len + t[lson].rmax;else t[num].rmax = t[rson].rmax;t[num].Max = max( t[lson].rmax + t[rson].lmax, max( t[lson].Max, t[rson].Max ) );
}void pushdown( int num ) {if( ! t[num].tag ) return;else if( ~ t[num].tag ) {t[lson].lmax = t[lson].rmax = t[lson].Max = 0;t[rson].lmax = t[rson].rmax = t[rson].Max = 0;}else {t[lson].lmax = t[lson].rmax = t[lson].Max = t[lson].len;t[rson].lmax = t[rson].rmax = t[rson].Max = t[rson].len;}t[lson].tag = t[rson].tag = t[num].tag;t[num].tag = 0;
}void modify( int num, int l, int r, int L, int R, int k ) {if( R < l || r < L ) return;if( L <= l && r <= R ) {if( ~ k ) t[num].lmax = t[num].rmax = t[num].Max = 0;else t[num].lmax = t[num].rmax = t[num].Max = t[num].len;t[num].tag = k;return;}pushdown( num );int mid = ( l + r ) >> 1;modify( lson, l, mid, L, R, k );modify( rson, mid + 1, r, L, R, k );pushup( num );
}int query( int num, int l, int r, int k ) {pushdown( num );if( t[num].l == t[num].r ) return l;int mid = t[num].l + t[num].r >> 1;if( t[lson].Max >= k ) return query( lson, l, r, k );else if( t[rson].lmax + t[lson].rmax >= k ) return mid - t[lson].rmax + 1;else return query( rson, mid + 1, r, k );
}int main() {scanf( "%d %d", &n, &m );build( 1, 1, n );int opt, x, d, pos;while( m -- ) {scanf( "%d", &opt );if( opt & 1 ) {scanf( "%d", &d );if( t[1].Max < d ) printf( "0\n" );else {printf( "%d\n", pos = query( 1, 1, n, d ) );modify( 1, 1, n, pos, pos + d - 1, 1 );}}else {scanf( "%d %d", &x, &d );modify( 1, 1, n, x, x + d - 1, -1 );}}return 0;
}

Transformation

HDU4578

因为p∈[1,3]p\in [1,3]p[1,3],所以直接线段树大暴力维护数不同次方的和

  • tag : 赋值标记
  • add : 加标记
  • mul : 乘标记
  • sum1 : 区间内数的一次方和
  • sum2 : 区间内数的二次方和
  • sum3 : 区间内数的三次方和

标记内有高低优先顺序,赋值第一,乘法第二,加法第三
(a+x)2=a2+x2+2ax(a+x)^2=a^2+x^2+2ax (a+x)2=a2+x2+2ax

(a1+x)2+(a2+x)2+...+(an+x)2=(a12+a22+...+an2)+2x(a1+a2+...+an)+nx2(a_1+x)^2+(a_2+x)^2+...+(a_n+x)^2=(a_1^2+a_2^2+...+a_n^2)+2x(a_1+a_2+...+a_n)+nx^2 (a1+x)2+(a2+x)2+...+(an+x)2=(a12+a22+...+an2)+2x(a1+a2+...+an)+nx2

(a+x)3=a3+3a2x+3ax2+x3(a+x)^3=a^3+3a^2x+3ax^2+x^3 (a+x)3=a3+3a2x+3ax2+x3

(a1+x)3+...+(an+x)3=(a13+...+an3)+3x(a12+...+an2)+3x2(a1+...+an)+nx3(a_1+x)^3+...+(a_n+x)^3=(a_1^3+...+a_n^3)+3x(a_1^2+...+a_n^2)+3x^2(a_1+...+a_n)+nx^3 (a1+x)3+...+(an+x)3=(a13+...+an3)+3x(a12+...+an2)+3x2(a1+...+an)+nx3

通过公示可以看出,计算加法也有优先顺序,三次方第一,二次方第二,一次方第三

主要考察维护性质标记间的优先顺序,对代码实现能力要求更高,思维含量不大,中档

#include <cstdio>
#define mod 10007
#define maxn 100005
#define int long long
#define lson num << 1
#define rson num << 1 | 1
struct node {int l, r, sum1, sum2, sum3, add, mul, tag;void update1( int x ) {add = ( add + x ) % mod;sum3 = ( sum3 + 3 * x * sum2 + 3 * x * x * sum1 + ( r - l + 1 ) * x * x * x ) % mod;sum2 = ( sum2 + 2 * x * sum1 + ( r - l + 1 ) * x * x ) % mod;sum1 = ( sum1 + x * ( r - l + 1 ) ) % mod;}void update2( int x ) {add = add * x % mod;mul = mul * x % mod;sum3 = sum3 * x * x * x % mod;sum2 = sum2 * x * x % mod;sum1 = sum1 * x % mod;}void update3( int x ) {tag = x;mul = 1;add = 0;sum3 = x * x * x * ( r - l + 1 ) % mod;sum2 = x * x * ( r - l + 1 ) % mod;sum1 = x * ( r - l + 1 ) % mod;}
}t[maxn << 2];node operator + ( node x, node y ) {node ans;ans.l = x.l, ans.r = y.r;ans.tag = ans.add = 0, ans.mul = 1;ans.sum1 = ( x.sum1 + y.sum1 ) % mod;ans.sum2 = ( x.sum2 + y.sum2 ) % mod;ans.sum3 = ( x.sum3 + y.sum3 ) % mod;return ans;
}void build( int num, int l, int r ) {t[num].sum1 = t[num].sum2 = t[num].sum3 = 0;t[num].add = t[num].tag = 0, t[num].mul = 1;t[num].l = l, t[num].r = r;if( l == r ) return;int mid = l + r >> 1;build( lson, l, mid );build( rson, mid + 1, r );
}void pushdown( int num, int l, int r ) {if( t[num].tag ) {t[lson].update3( t[num].tag );t[rson].update3( t[num].tag );}if( t[num].mul ^ 1 ) {t[lson].update2( t[num].mul );t[rson].update2( t[num].mul );}if( t[num].add ) {t[lson].update1( t[num].add );t[rson].update1( t[num].add );}t[num].tag = t[num].add = 0, t[num].mul = 1;
}void modify1( int num, int l, int r, int L, int R, int x ) {if( r < L || R < l ) return;if( L <= l && r <= R ) { t[num].update1( x ); return; }pushdown( num, l, r );int mid = l + r >> 1;modify1( lson, l, mid, L, R, x );modify1( rson, mid + 1, r, L, R, x );t[num] = t[lson] + t[rson];
}void modify2( int num, int l, int r, int L, int R, int x ) {if( r < L || R < l ) return;if( L <= l && r <= R ) { t[num].update2( x ); return; }pushdown( num, l, r );int mid = l + r >> 1;modify2( lson, l, mid, L, R, x );modify2( rson, mid + 1, r, L, R, x );t[num] = t[lson] + t[rson];
}void modify3( int num, int l, int r, int L, int R, int x ) {if( r < L || R < l ) return;if( L <= l && r <= R ) { t[num].update3( x ); return; }pushdown( num, l, r );int mid = l + r >> 1;modify3( lson, l, mid, L, R, x );modify3( rson, mid + 1, r, L, R, x );t[num] = t[lson] + t[rson];
}node query( int num, int l, int r, int L, int R ) {if( L <= l && r <= R ) return t[num];pushdown( num, l, r );int mid = l + r >> 1;if( R <= mid ) return query( lson, l, mid, L, R );else if( mid < L ) return query( rson, mid + 1, r, L, R );else return query( lson, l, mid, L, R ) + query( rson, mid + 1, r, L, R );
}signed main() {int n, m, opt, l, r, c;while( scanf( "%lld %lld", &n, &m ) and n and m ) {build( 1, 1, n );while( m -- ) {scanf( "%lld %lld %lld %lld", &opt, &l, &r, &c );switch ( opt ) {case 1 : { modify1( 1, 1, n, l, r, c ); break; }case 2 : { modify2( 1, 1, n, l, r, c ); break; }case 3 : { modify3( 1, 1, n, l, r, c ); break; }case 4 : { node ans = query( 1, 1, n, l, r );switch ( c ) {case 1 : { printf( "%lld\n", ans.sum1 ); break; }case 2 : { printf( "%lld\n", ans.sum2 ); break; }case 3 : { printf( "%lld\n", ans.sum3 ); break; }}break;}}}}return 0;
}

Tree Generator™

CF1149C

引理:树上直径为一段连续区间去掉匹配括号的最大长度

显然,因为匹配的括号在树上就是对应的影响再次回到原点

括号匹配是线段树维护的一种模板,左括号为111,右括号为−1-11

显然将匹配括号去掉后,区间形如))))((((可以只有()

考虑合并答案

假设这个区间的左子区间有右括号aaa个,左括号bbb个,右子区间有右括号c个,左括号b个

那么这个区间合并的答案就是a+∣b−c∣+d=max(a+b−c+d,a−b+c+d)\rm a+|b-c|+d=max(a+b-c+d,a-b+c+d)a+bc+d=max(a+bc+d,ab+c+d)

在形式上需要维护

  • x=a+b\rm x=a+bx=a+b : 一个区间去掉匹配括号之后的后缀右括号加上后缀左括号的最大值
  • y=a−b\rm y=a-by=ab : 一个区间去掉匹配括号之后的后缀右括号减去后缀左括号的最大值
  • z=−c+d\rm z=-c+dz=c+d : 一个区间去掉匹配括号之后的前缀左括号减去前缀右括号的最大值
  • w=c+d\rm w=c+dw=c+d : 一个区间去掉匹配括号之后的前缀左括号加上前缀右括号的最大值

前缀/后缀指从区间左端/右端开始的连续一段

由下往上儿子更新父亲

  • 考虑维护xxx

    • 最优划分点在右边
      • 直接右儿子t[rson].x\rm t[rson].xt[rson].x更新
    • 最优划分点在左边
      • 则一定包含右儿子区间,形如)))((
      • 假设在左儿子的最佳划分点后面aaa个右括号,bbb个左括号
      • 右儿子剩下lll个左括号,rrr个右括号
      • 左右儿子括号匹配后
        • x=a+∣b−r∣+l=max(a+b−r+l,a−b+r+l)\rm x=a+|b-r|+l=max(a+b-r+l,a-b+r+l)x=a+br+l=max(a+br+l,ab+r+l)
      • 同时a+b=t[lson].x;a−b=t[lson].y;l=t[rson].l;r=t[rson].r\rm a+b=t[lson].x;a-b=t[lson].y;l=t[rson].l;r=t[rson].ra+b=t[lson].x;ab=t[lson].y;l=t[rson].l;r=t[rson].r
  • 考虑维护yyy

    • 最优划分点在右边

      • 直接右儿子t[rson].y\rm t[rson].yt[rson].y更新
    • 最优划分点在左边

      • 则一定包含右儿子区间
      • 假设在左儿子的最佳划分点后面aaa个右括号,bbb个左括号
      • 右儿子剩下lll个左括号,rrr个右括号
      • 左右儿子括号匹配后
        • 1.1 b≥r\rm b\ge rbr : 右儿子不再有右括号,左儿子剩b−r\rm b-rbr个左括号y=a−l−(b−r)\rm y=a-l-(b-r)y=al(br)
        • 1.2 b<r\rm b<rb<r : 左儿子不再有左括号,右儿子剩r−b\rm r-brb个右括号y=(r−b)+a−l\rm y=(r-b)+a-ly=(rb)+al
      • 显然一个加大于000的数,一个减大于000的数
      • max\rm maxmax选择1.2更新,不用像xxx一样分情况
      • 同时a−b=t[lson].y;l=t[rson].l;r=t[rson].r;y=r(−b+a)−l=r−l+t[lson].y\rm a-b=t[lson].y;l=t[rson].l;r=t[rson].r;y=r(-b+a)-l=r-l+t[lson].yab=t[lson].y;l=t[rson].l;r=t[rson].r;y=r(b+a)l=rl+t[lson].y
  • 考虑zzz

    • 最优划分点在左边

      • 直接左儿子t[lson].z\rm t[lson].zt[lson].z更新
    • 最优划分点在右边

      • 则一定包含左儿子区间

      • 假设在右儿子的最佳划分点前面ccc个右括号,ddd个左括号

      • 左儿子剩下lll个左括号rrr个右括号

      • 左右儿子括号匹配

        • 1.1 l≥c\rm l\ge clc 右儿子不再有右括号,左儿子剩l−c\rm l-clc个左括号,y=d+(l−c)−r\rm y=d+(l-c)-ry=d+(lc)r

        • 1.2 l<c\rm l<cl<c 左儿子不再有左括号,右儿子剩c−l\rm c-lcl个右括号,y=d−(c−l)−r\rm y=d-(c-l)-ry=d(cl)r

      • 显然一个加大于000的数,一个减大于000的数

      • max\rm maxmax选择1.1更新

      • 同时−c+d=t[rson].zl=t[lson].lr=t[lson].rz=d+l−c−r=(−c+d)+l−r\rm -c+d=t[rson].z l=t[lson].l r=t[lson].rz=d+l-c-r=(-c+d)+l-rc+d=t[rson].zl=t[lson].lr=t[lson].rz=d+lcr=(c+d)+lr

  • 考虑kkk

    • 最优划分点在左边
      • 直接左儿子t[lson].w\rm t[lson].wt[lson].w更新
    • 最优划分点在右边
      • 则一定包含左儿子区间
      • 假设在右儿子的最佳划分点前面ccc个右括号,ddd个左括号
      • 左儿子剩下lll个左括号,rrr个右括号
      • 左右儿子括号匹配后
        • x=d+∣l−c∣+r=max(d+l−c+r,d+c−l+r)\rm x=d+|l-c|+r=max(d+l-c+r,d+c-l+r)x=d+lc+r=max(d+lc+r,d+cl+r)
      • 同时−c+d=t[rson].zc+d=t[rson].wl=t[lson].lr=t[lson].r\rm -c+d=t[rson].z c+d=t[rson].w l=t[lson].l r=t[lson].rc+d=t[rson].zc+d=t[rson].wl=t[lson].lr=t[lson].r

困难

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define maxn 300005
#define lson num << 1
#define rson num << 1 | 1
struct node {//全是取最大值//全是区间内去掉匹配括号后 形如)))))(( int x;	//后缀左括号加后缀右括号 int y;	//后缀右括号减后缀左括号 int z;	//前缀左括号减前缀右括号 int w;	//前缀左括号加前缀右括号 int l;	//区间内未匹配左括号数量 int r;	//区间内未匹配有括号数量 int ans;//区间内的最长直径答案 //前缀/后缀指从区间左端/右端开始的连续一段s[i] 
}t[maxn << 2];
int n, m;
char s[maxn];void pushup( int num ) {//左右儿子区间会有左儿子的左括号和右儿子的有括号匹配情况 if( t[lson].l > t[rson].r ) {t[num].l = t[lson].l - t[rson].r + t[rson].l;t[num].r = t[lson].r;}else {t[num].l = t[rson].l;t[num].r = t[lson].r + t[rson].r - t[lson].l;}/*后缀左括号加后缀右括号 1.最优划分点在右边    直接右儿子t[rson].x更新 2.最优划分点在左边  则一定包含右儿子区间 形如)))(( 假设在左边儿子的最佳划分点后面有a个右括号b个左括号 右边儿子剩下l个左括号r个右括号 左右儿子括号匹配后x=a+|b-r|+l=max(a+b-r+l,a-b+r+l)同时已知有 a+b=t[lson].x a-b=t[lson].y l=t[rson].l r=t[rson].r*/t[num].x = max( t[rson].x, max( t[lson].x - t[rson].r + t[rson].l, t[lson].y + t[rson].r + t[rson].l ) );/*后缀右括号减后缀左括号1.最优划分点在右边    直接右儿子t[rson].y更新 2.最优划分点在左边  则一定包含右儿子区间假设在左边儿子的最佳划分点后面有a个右括号b个左括号 右边儿子剩下l个左括号r个右括号 左右儿子括号匹配1.1 b>=r  右儿子不再有右括号 左儿子剩b-r个左括号   y=a-l-(b-r)1.2 b<r   左儿子不再有左括号 右儿子剩r-b个右括号   y=(r-b)+a-l显然一个加大于0的数 一个减大于0的数max选择1.2更新 不用像x一样分情况 同时已知有 a-b=t[lson].y l=t[rson].l r=t[rson].ry=r(-b+a)-l=r-l+t[lson].y*/t[num].y = max( t[rson].y, t[lson].y + t[rson].r - t[rson].l );/*前缀左括号减前缀右括号 1.最优划分点在左边    直接左儿子t[lson].z更新 2.最优划分点在右边  则一定包含左儿子区间假设在右边儿子的最佳划分点前面有c个右括号d个左括号 左边儿子剩下l个左括号r个右括号 左右儿子括号匹配1.1 l>=c  右儿子不再有右括号 左儿子剩l-c个左括号   y=d+(l-c)-r1.2 l<c   左儿子不再有左括号 右儿子剩c-l个右括号   y=d-(c-l)-r显然一个加大于0的数 一个减大于0的数max选择1.1更新 同时已知有-c+d=t[rson].z l=t[lson].l r=t[lson].rz=d+l-c-r=(-c+d)+l-r*/t[num].z = max( t[lson].z, t[rson].z + t[lson].l - t[lson].r );/*前缀左括号加前缀右括号1.最优划分点在左边    直接左儿子t[lson].w更新 2.最优划分点在右边    则一定包含左儿子区间 假设在右儿子的最佳划分点前面有c个右括号d个左括号 左儿子剩下l个左括号r个右括号 左右儿子括号匹配后x=d+|l-c|+r=max(d+l-c+r,d+c-l+r)同时已知有 -c+d=t[rson].z c+d=t[rson].w l=t[lson].l r=t[lson].r*/t[num].w = max( t[lson].w, max( t[lson].l + t[lson].r + t[rson].z, t[lson].r - t[lson].l + t[rson].w ) );/*合并答案 1.就是左儿子或右儿子的答案2.假设这个区间的左子区间有右括号a个左括号b个 右子区间有右括号c个左括号b个那么这个区间从中间合并的答案就是a+|b-c|+d=max(a+b-c+d,a-b+c+d)同时已知有a+b=t[lson].x a-b=t[lson].y -c+d=t[rson].z c+d=t[rson]w */t[num].ans = max( max( t[lson].ans, t[rson].ans ), max( t[lson].x + t[rson].z, t[lson].y + t[rson].w ) );
}void modify( int num, int k ) {t[num].x = 1;t[num].y = max( -k, 0 );t[num].z = max( k, 0 );t[num].l = k == 1;t[num].r = k == -1;t[num].w = 1;t[num].ans = 1;
}void build( int num, int l, int r ) {if( l == r ) { modify( num, s[l] == '(' ? 1 : -1 ); return; }int mid = l + r >> 1;build( lson, l, mid );build( rson, mid + 1, r );pushup( num );
}void modify( int num, int l, int r, int pos, int k ) {if( l == r ) { modify( num, k ); return; }int mid = l + r >> 1;if( pos <= mid ) modify( lson, l, mid, pos, k );else modify( rson, mid + 1, r, pos, k );pushup( num );
}int main() {scanf( "%d %d %s", &n, &m, s + 1 );n = strlen( s + 1 );build( 1, 1, n );printf( "%d\n", t[1].ans );while( m -- ) {int x, y;scanf( "%d %d", &x, &y );modify( 1, 1, n, x, s[y] == '(' ? 1 : -1 );modify( 1, 1, n, y, s[x] == '(' ? 1 : -1 );swap( s[x], s[y] );printf( "%d\n", t[1].ans );}return 0;
}

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

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

相关文章

计算几何全家桶

文章目录前言精度点/向量相关表示向量基本运算角度相关向量夹角旋转直线/线段相关表示点与线求点到直线垂足求点关于直线的对称点点与直线的位置关系点与直线的距离线与线直线与直线的位置关系共线与垂直判断线段与线段是否相交求直线与直线的交点角平分线中垂线多边形表示求多…

uoj#750-[UNR #6]小火车【二分,折半,鸽笼原理】

正题 题目链接:https://uoj.ac/problem/750 题目大意 给出nnn个数字和一个ppp&#xff0c;保证2n>p2^n> p2n>p。现在要求一个序列www满足wi∈[−1,1]w_i\in[-1,1]wi​∈[−1,1]&#xff0c;使得∑i1nwiai≡0(modp)\sum_{i1}^nw_ia_i\equiv 0\pmod p∑i1n​wi​ai​≡…

Sequence Pair Weight

Sequence Pair Weight 题意&#xff1a; 一个数组a&#xff0c;其中两个一样的数的贡献为1&#xff0c;问这个数组的所有子串的贡献和是多少? 题解&#xff1a; 举例&#xff1a; 对于[1&#xff0c;2&#xff0c;1&#xff0c;2&#xff0c;1&#xff0c;1&#xff0c;4]…

什么是量子计算机?用一个简单例子来解释

译者&#xff1a;王亮 作者&#xff1a;YK Sugi 原文&#xff1a;http://t.cn/EZAElk0Hi&#xff0c;大家好&#xff01;不久前&#xff0c;我参观了加拿大温哥华的D-Wave Systems公司&#xff0c;这是一家制造前沿量子计算机的公司。我在那里学到了很多关于量子计算机的知识&a…

CodeForces616:Educational Round 5

文章目录前言A Comparing Two Long Integers\text{A Comparing Two Long Integers}A Comparing Two Long IntegersDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeB Dinner with Emma\text{B Dinner with Emma}B Dinner with Emm…

CF1534F2-Falling Sand (Hard Version)

正题 题目链接:https://www.luogu.com.cn/problem/CF1534F2 题目大意 有一个n∗mn*mn∗m个网格&#xff0c;有的网格上有沙子&#xff0c;一个沙子被刷新后会下落到底并且刷新沿途中四周四连通的沙子&#xff0c;你可以选择一些沙子手动刷新。 现在要求第iii列至少有aia_iai…

数据结构二之线段树Ⅱ——KiKi‘s K-Number,ball,The Child and Sequence,「雅礼集训 2017 Day1」市场,Atlantis

值域线段树势能线段树扫描线KiKis K-NumberballThe Child and Sequence「雅礼集训 2017 Day1」市场AtlantisKiKi’s K-Number HDU-2852 权值线段树维护插入删除很简单 对于查询大于xxx的第kkk个&#xff0c;可以不用二分&#xff0c;转化一下 先查小于等于xxx的个数cntcntc…

Codeforces Round #721 (Div. 2)

Codeforces Round #721 (Div. 2) 题号题目难度知识点AAnd Then There Were KBPalindrome Game (easy version)CPalindrome Game (hard version)DSequence Pair WeightEMEX TreeFPartition Game

解决Azure DevOps部署到Azure后.NET Core网站无法启动的问题

点击上方蓝字关注“汪宇杰博客”最近我遭遇了一个奇怪的问题。使用Azure DevOps配置CI/CD管线&#xff0c;自动部署到Azure App Service以后&#xff0c;.NET Core的网站竟然会启动失败。我们来看看如何解决这个问题。查找问题首先&#xff0c;幸好&#xff0c;这是个staging环…

CF1286E-Fedya the Potter Strikes Back【KMP,RMQ】

正题 题目链接:https://www.luogu.com.cn/problem/CF1286E 题目大意 定义一个字符串sss的权值为对于每个sL∼Rs1∼R−L1s_{L\sim R}s_{1\sim R-L1}sL∼R​s1∼R−L1​的区间&#xff0c;会产生min⁡iLRwi\min_{iL}^Rw_iminiLR​wi​的贡献。 现在开始时sss为空串&#xff0c…

模板:二维凸包(计算几何)

所谓凸包&#xff0c;就是一个凸出来的包 &#xff08;逃&#xff09; 前言 计算集合的第一课。 关键特征&#xff1a;周长最小。此时一定是凸包。 解析 定义 凸包&#xff1a;在平面上能包含所有给定点的最小凸多边形叫做凸包。 性质&#xff1a;凸包的周长是所有能包含给…

[AtCoder Beginner Contest 215] A-G题解

文章目录A - Your First JudgeB - log2(N)C - One More aab aba baaD - Coprime 2E - Chain ContestantF - Dist Max 2G - Colorful Candies 2atcoder题目链接 A - Your First Judge 签到题 #include <cstdio> #include <iostream> using namespace std; string…

Acwing 135 最大子序和

Acwing 135 最大子序和 题目&#xff1a; 输入一个长度为 n 的整数序列&#xff0c;从中找出一段长度不超过 m 的连续子序列&#xff0c;使得子序列中所有数的和最大。 题解&#xff1a; 我们把这个问题的集合分成n份&#xff0c;第k份表示以A[k]结尾的最大连续子序列是多少…

.net core自定义高性能的Web API服务网关

网关对于服务起到一个统一控制处理的作用&#xff0c;也便于客户端更好的调用&#xff1b;通过网关可以灵活地控制服务应用接口负载&#xff0c;故障迁移&#xff0c;安全控制&#xff0c;监控跟踪和日志处理等。由于网关在性能和可靠性上都要求非常严格&#xff0c;所以针对业…

微软宣布 Visual Studio 2019 将于4月2日正式发布

微软于去年发布了 Visual Studio 2019 预览版。今天&#xff0c;该公司宣布 Visual Studio 2019 正式版将于4月2日发布。微软在公告中表示&#xff1a;“欢迎加入我们在4月2号当天举办的 VS 2019 线上发布活动&#xff0c;这是一款更加现代化、创新且实用的生产力工具”。据悉&…

CF1427F-Boring Card Game【贪心】

正题 题目链接:https://www.luogu.com.cn/problem/CF1427F 题目大意 有一个1∼6n1\sim 6n1∼6n的序列&#xff0c;两个人轮流操作&#xff0c;每次取走连续的三个数字。 现在给出先手取走的数字集合&#xff0c;要求构造方案。 保证有解 1≤n≤2001\leq n\leq 2001≤n≤200…

模板:旋转卡壳(计算几何)

所谓旋转卡壳&#xff0c;就是旋转起来的卡壳 &#xff08;逃&#xff09; 前言 前置知识&#xff1a;凸包 个人感觉很像 two-pointers 算法。 能够在优秀的线性时间复杂度内完成总多求最值&#xff08;周长、面积…&#xff09;的神奇操作。 解析 给出情境&#xff1a; 给…

Acwing 1088.旅行问题

Acwing 1088.旅行问题 题目&#xff1a; 一个环形公路&#xff0c;由n个车站&#xff0c;每个站有若干升汽油&#xff08;有的站可能油量为零&#xff09;&#xff0c;每升油可以让汽车行驶一千米。 从某个车站出发&#xff0c;一直按顺时针&#xff08;或逆时针&#xff09;…

[AtCoder Regular Contest 125] A-F全题解

文章目录A - Dial UpB - SquaresC - LIS to Original SequenceD - Unique SubsequenceE - SnackF - Tree Degree Subset Sum网址链接A - Dial Up 签到题 特判一下有没有0/1在目标串中出现而没在原串出现 除了第一次0/1数字互换时&#xff0c;需要从a1a_1a1​左右找距离最近的…

DotNetty 实现 Modbus TCP 系列 (三) Codecs Handler

DotNetty 实现 Modbus TCP 系列 (一) 报文类DotNetty 实现 Modbus TCP 系列 (二) ModbusFunction 类图及继承举例DotNetty 作为一个半成品&#xff0c;我们不需要关注细节的实现&#xff0c;只需要关注自己的业务即可&#xff0c;所以最主要的就是处理 Codecs 和 Handler。所有…