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

值域线段树+势能线段树+扫描线

  • KiKi's K-Number
  • ball
  • The Child and Sequence
  • 「雅礼集训 2017 Day1」市场
  • Atlantis

KiKi’s K-Number

HDU-2852

权值线段树维护插入删除很简单

对于查询大于xxx的第kkk个,可以不用二分,转化一下

先查小于等于xxx的个数cntcntcnt,然后查排名为第cnt+kcnt+kcnt+k个值

#include <cstdio>
#define maxn 100000
#define lson num << 1
#define rson num << 1 | 1
struct node {int sum, cnt;
}t[maxn << 2 | 1];void build( int num, int l, int r ) {t[num].sum = t[num].cnt = 0;if( l == r ) return;int mid = l + r >> 1;build( lson, l, mid );build( rson, mid + 1, r );
}void modify( int num, int l, int r, int pos, int v ) {if( l == r ) { t[num].cnt += v, t[num].sum += v; return; }int mid = l + r >> 1;if( pos <= mid ) modify( lson, l, mid, pos, v );else modify( rson, mid + 1, r, pos, v );t[num].sum = t[lson].sum + t[rson].sum;
}int query_cnt( int num, int l, int r, int pos ) {if( l == r ) return t[num].cnt;int mid = l + r >> 1;if( pos <= mid ) return query_cnt( lson, l, mid, pos );else return query_cnt( rson, mid + 1, r, pos );
}int query( int num, int l, int r, int k ) {if( l == r ) return l;int mid = l + r >> 1;if( k <= t[lson].sum ) return query( lson, l, mid, k );else return query( rson, mid + 1, r, k - t[lson].sum );
}int query( int num, int l, int r, int L, int R ) {if( R < l || r < L ) return 0;if( L <= l && r <= R ) return t[num].sum;int mid = l + r >> 1;return query( lson, l, mid, L, R ) + query( rson, mid + 1, r, L, R );
}int main() {int n, opt, x, k, cnt, ans;while( ~ scanf( "%d", &n ) ) {build( 1, 1, maxn );while( n -- ) {scanf( "%d %d", &opt, &x );switch( opt ) {case 0 : { modify( 1, 1, maxn, x, 1 ); break; }case 1 : {if( ! query_cnt( 1, 1, maxn, x ) ) printf( "No Elment!\n" );else modify( 1, 1, maxn, x, -1 );break;}case 2 : {scanf( "%d", &k );cnt = query( 1, 1, maxn, 1, x );ans = query( 1, 1, maxn, cnt + k );if( ans == maxn ) printf( "Not Find!\n" );else printf( "%d\n", ans );break;}}}}return 0;
} 

ball

CF-12D

虚假的三维偏序

  • BBB离散化后作权值线段树下标
  • III降序排列,相同的按RRR升序排列
  • BiB_iBi后面[x+1,N][x+1,N][x+1,N]RRR最大值,如果最大值大于RiR_iRi,那么iii就会出局
    • 首先BiB_iBi后面,满足Bi<B′B_i<B'Bi<B
    • 其次按照III排序,天然满足Ii<I′I_i<I'Ii<I
    • 最后最大值Ri<R′R_i<R'Ri<R
  • RiR_iRi插到BiB_iBi对应下标上[1,x][1,x][1,x],维护区间RRR最大值
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 500005
#define lson num << 1
#define rson num << 1 | 1
struct node {int B, I, R;
}p[maxn];
int n, m, ans;
int x[maxn], t[maxn << 2], tag[maxn << 2];void pushdown( int num ) {t[lson] = max( t[lson], tag[num] ) ;t[rson] = max( t[rson], tag[num] ) ;tag[lson] = max( tag[lson], tag[num] );tag[rson] = max( tag[rson], tag[num] );tag[num] = 0;
}void modify( int num, int l, int r, int L, int R, int val ) {if( R < l or r < L ) return;if( L <= l and r <= R ) {t[num] = max( t[num], val );tag[num] = max( tag[num], val );return;}pushdown( num );int mid = l + r >> 1;modify( lson, l, mid, L, R, val );modify( rson, mid + 1, r, L, R, val );
}int query( int num, int l, int r, int pos ) {if( l == r ) return t[num];pushdown( num );int mid = l + r >> 1;if( pos <= mid ) return query( lson, l, mid, pos );else return query( rson, mid + 1, r, pos );
}int main() {scanf( "%d", &n );for( int i = 1;i <= n;i ++ ) scanf( "%d", &p[i].B );for( int i = 1;i <= n;i ++ ) scanf( "%d", &p[i].I );for( int i = 1;i <= n;i ++ ) scanf( "%d", &p[i].R );for( int i = 1;i <= n;i ++ ) x[i] = p[i].B;sort( x + 1, x + n + 1 );m = unique( x + 1, x + n + 1 ) - x - 1;for( int i = 1;i <= n;i ++ ) p[i].B = lower_bound( x + 1, x + m + 1, p[i].B ) - x;sort( p + 1, p + n + 1, []( node x, node y ) { return x.I == y.I ? x.R < y.R : x.I > y.I; } );for( int i = 1;i <= n;i ++ ) {if( query( 1, 1, m, p[i].B ) > p[i].R ) ans ++;modify( 1, 1, m, 1, p[i].B - 1, p[i].R );}printf( "%d\n", ans );return 0;
}

The Child and Sequence

CF-438D

区间求和很好维护

至于取模操作,由辗转相除法可知,取模后结果不超过原数的一半

所以最多log⁡\loglog次后取模就对其没有意义了

考虑维护区间最大值,如果最大值都比取模的数小,那么这个区间就没有操作的意义

否则就暴力往下取模

#include <cstdio>
#include <iostream>
using namespace std;
#define int long long 
#define maxn 100005
#define lson num << 1
#define rson num << 1 | 1
struct node {int sum, Max;
}t[maxn << 2];
int a[maxn];void build( int num, int l, int r ) {if( l == r ) { t[num].sum = t[num].Max = a[l]; return; }int mid = l + r >> 1;build( lson, l, mid );build( rson, mid + 1, r );t[num].Max = max( t[lson].Max, t[rson].Max );t[num].sum = t[lson].sum + t[rson].sum;
}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].sum;int mid = l + r >> 1;return query( lson, l, mid, L, R ) + query( rson, mid + 1, r, L, R );
}void modify( int num, int l, int r, int L, int R, int v ) {if( t[num].Max < v or R < l or r < L ) return;if( l == r ) { t[num].Max = t[num].sum = t[num].Max % v; return; }int mid = l + r >> 1;modify( lson, l, mid, L, R, v );modify( rson, mid + 1, r, L, R, v );t[num].Max = max( t[lson].Max, t[rson].Max );t[num].sum = t[lson].sum + t[rson].sum;
}void modify( int num, int l, int r, int pos, int val ) {if( l == r ) { t[num].Max = t[num].sum = val; return; }int mid = l + r >> 1;if( pos <= mid ) modify( lson, l, mid, pos, val );else modify( rson, mid + 1, r, pos, val );t[num].Max = max( t[lson].Max, t[rson].Max );t[num].sum = t[lson].sum + t[rson].sum;
}signed main() {int n, m, opt, l, r, x, k;scanf( "%lld %lld", &n, &m );for( int i = 1;i <= n;i ++ ) scanf( "%lld", &a[i] );	build( 1, 1, n );while( m -- ) {scanf( "%lld", &opt );switch ( opt ) {case 1 : {scanf( "%lld %lld", &l, &r );printf( "%lld\n", query( 1, 1, n, l, r ) );break;}case 2 : {scanf( "%lld %lld %lld", &l, &r, &x );modify( 1, 1, n, l, r, x );break;}case 3 : {scanf( "%lld %lld", &x, &k );modify( 1, 1, n, x, k );break;}}}return 0;
}

「雅礼集训 2017 Day1」市场

LOJ#6029

对于下取整的维护,考虑Δ=max−⌊maxxk⌋=min−⌊minnk⌋\Delta=\rm max-\lfloor\frac{maxx}{k}\rfloor=min-\lfloor\frac{minn}{k}\rfloorΔ=maxkmaxx=minkminn

则整个区间的每个数都会−Δ-\DeltaΔ,可以用区间加标记记录

否则就仍然暴力往下除

利用势能分析,足以通过

推荐好妹妹的本题势能分析题解戳我哦(づ ̄3 ̄)づ╭❤~

#include <cmath> 
#include <cstdio>
#include <iostream>
using namespace std;
#define inf 1e18
#define maxn 100005
#define int long long
#define lson num << 1
#define rson num << 1 | 1
struct node {int sum, Min, Max, tag;
}t[maxn << 2];
int a[maxn];void pushdown( int num, int l, int r ) {if( ! t[num].tag ) return;int mid = l + r >> 1;t[lson].Max += t[num].tag;t[lson].Min += t[num].tag;t[lson].tag += t[num].tag;t[lson].sum += t[num].tag * ( mid - l + 1 );t[rson].Max += t[num].tag;t[rson].Min += t[num].tag;t[rson].tag += t[num].tag;t[rson].sum += t[num].tag * ( r - mid );t[num].tag = 0;
}void pushup( int num ) {t[num].Min = min( t[lson].Min, t[rson].Min );t[num].Max = max( t[lson].Max, t[rson].Max );t[num].sum = t[lson].sum + t[rson].sum;
}void modify1( int num, int l, int r, int L, int R, int v ) {if( R < l or r < L ) return;if( L <= l and r <= R ) {t[num].Min += v;t[num].Max += v;t[num].tag += v;t[num].sum += v * ( r - l + 1 );return;}pushdown( num, l, r );int mid = l + r >> 1;modify1( lson, l, mid, L, R, v );modify1( rson, mid + 1, r, L, R, v );pushup( num );
}void modify2( int num, int l, int r, int L, int R, int v ) {if( r < L or R < l ) return;if( L <= l and r <= R ) {int maxx = ( int )floor( t[num].Max * 1.0 / v );int minn = ( int )floor( t[num].Min * 1.0 / v );if( t[num].Max - maxx == t[num].Min - minn ) {int x = t[num].Max - maxx;t[num].tag -= x;t[num].Max = maxx;t[num].Min = minn;t[num].sum -= ( r - l + 1 ) * x;return;}}pushdown( num, l, r );int mid = l + r >> 1;modify2( lson, l, mid, L, R, v );modify2( rson, mid + 1, r, L, R, v );pushup( num );
}pair < int, int > query( int num, int l, int r, int L, int R ) {if( r < L or R < l ) return make_pair( inf, 0 );if( L <= l and r <= R ) return make_pair( t[num].Min, t[num].sum );pushdown( num, l, r );int mid = l + r >> 1;pair < int, int > ans1 = query( lson, l, mid, L, R );pair < int, int > ans2 = query( rson, mid + 1, r, L, R );return make_pair( min( ans1.first, ans2.first ), ans1.second + ans2.second );
}void build( int num, int l, int r ) {if( l == r ) { t[num].Max = t[num].Min = t[num].sum = a[l], t[num].tag = 0; return; }int mid = l + r >> 1;build( lson, l, mid );build( rson, mid + 1, r );pushup( num );
}signed main() {int n, Q, opt, l, r, x;scanf( "%lld %lld", &n, &Q );for( int i = 1;i <= n;i ++ ) scanf( "%lld", &a[i] );build( 1, 1, n );while( Q -- ) {scanf( "%lld %lld %lld", &opt, &l, &r );l ++, r ++;switch ( opt ) {case 1 : { scanf( "%lld", &x ); modify1( 1, 1, n, l, r, x ); break; }case 2 : { scanf( "%lld", &x ); modify2( 1, 1, n, l, r, x ); break; }case 3 : { printf( "%lld\n", query( 1, 1, n, l, r ).first ); break; }case 4 : { printf( "%lld\n", query( 1, 1, n, l, r ).second ); break; }}}return 0;
}

Atlantis

HDU-1542

线段树维护扫描线的模板题

离散化xxx坐标,矩阵左右成为线段树区间,遇到矩阵的下面一条线+1+1+1,上面一条线−1-11

扫描线是维护线段(可以看做是维护边,信息放在两点间),平常线段树是维护点(信息发在单点上)

所以写法会有边界的丢丢不同

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxn 205
#define lson num << 1
#define rson num << 1 | 1
struct node {double l, r, h; int op;node(){}node( double L, double R, double H, int Op ) {l = L, r = R, h = H, op = Op;}
}g[maxn];
double x[maxn], t[maxn << 2];
int tag[maxn << 2];bool cmp( node u, node v ) { return u.h < v.h; }void pushup( int num, int l, int r ) {if( tag[num] ) t[num] = x[r] - x[l];else if( l + 1 == r ) t[num] = 0;else t[num] = t[lson] + t[rson];
}void modify( int num, int l, int r, int L, int R, int val ) {if( R <= l or r <= L ) return;if( L <= l and r <= R ) {tag[num] += val;pushup( num, l, r );return;}int mid = l + r >> 1;modify( lson, l, mid, L, R, val );modify( rson, mid, r, L, R, val );pushup( num, l, r );
}int main() {int T = 0, n; double x1, y1, x2, y2;while( scanf( "%d", &n ) and n ) {for( int i = 1;i <= n;i ++ ) {scanf( "%lf %lf %lf %lf", &x1, &y1, &x2, &y2 );x[i] = x1, x[i + n] = x2;g[i] = node( x1, x2, y1, 1 );g[i + n] = node( x1, x2, y2, -1 );}n <<= 1;sort( x + 1, x + n + 1 );sort( g + 1, g + n + 1, cmp );int m = unique( x + 1, x + n + 1 ) - x - 1;memset( t, 0, sizeof( t ) );memset( tag, 0, sizeof( tag ) );double ans = 0;for( int i = 1;i < n;i ++ ) {int l = lower_bound( x + 1, x + m + 1, g[i].l ) - x;int r = lower_bound( x + 1, x + m + 1, g[i].r ) - x;modify( 1, 1, m, l, r, g[i].op );ans += t[1] * ( g[i + 1].h - g[i].h );}printf( "Test case #%d\nTotal explored area: %.2f\n\n", ++ T, ans );}return 0;
}

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

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

相关文章

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。所有…

loj#2788-「CEOI2015 Day1」管道【树上差分】

正题 题目链接:https://loj.ac/p/2788 题目大意 给出nnn个点mmm条边的一张图&#xff0c;求它的所有割边。 1≤n≤105,1≤m≤61061\leq n\leq 10^5,1\leq m\leq 6\times 10^61≤n≤105,1≤m≤6106&#xff0c;内存限制16MB 解题思路 我们存不下所有的边&#xff0c;但是nnn很…

Acwing -- 单调队列优化的DP问题

文章目录引入acwing154 滑动窗口应用135 最大子序和1088.旅行问题AcWing 1087. 修剪草坪28AcWing 1089. 烽火传递AcWing 1090. 绿色通道AcWing 1091. 理想的正方形引入 acwing154 滑动窗口 题目链接 题解 应用 闫氏最优化问题分析法 135 最大子序和 题目&#xff1a; 输入…

模板:半平面交(计算几何)

所谓半平面交&#xff0c;就是和“半平先生”当面交谈。顾名思义&#xff0c;这是一个源于日本的算法。 &#xff08;逃&#xff09; 前言 感觉应用很灵活的一个算法&#xff0c;一切有两个变量的线性规划问题都可以转化为半平面交。 有时可能要注意取等问题&#xff08;指射…

Codeforces Round #740 (Div. 2, based on VK Cup 2021 - Final (Engine)) A-F全题解

Codeforces Round #740 (Div. 2, based on VK Cup 2021 - Final (Engine)) 文章目录A. Simply Strange SortB. Charmed by the GameC. Deep Down BelowD1/D2. Up the StripE. Bottom-Tier ReversalsF. Top-Notch InsertionsA. Simply Strange Sort 签到题&#xff0c;暴力做 …

[小技巧]C#中如何为枚举类型添加描述方法

背景在我们的日常开发中&#xff0c;我们会经常使用枚举类型。有时我们只需要显示枚举的值或者枚举值对应名称&#xff0c; 但是在某些场景下&#xff0c;我们可能需要将枚举值显示为不同的字符串。例&#xff1a; 当前我们有如下枚举Level这个枚举有4个可选值B, N, G, VG。 现…

Loj#3320-「CCO 2020」旅行商问题

正题 题目链接:https://loj.ac/p/3320 题目大意 有一张nnn个点的无向完全图&#xff0c;每一条边是红色或者蓝色&#xff0c;对于每个点sss求从这个点出发的一条尽量短的经过所有点的路径。 1≤n≤20001\leq n\leq 20001≤n≤2000 解题思路 显然地猜测一下最短的长度肯定是n…

AcWing 1087. 修剪草坪28

AcWing 1087. 修剪草坪 题意: 有n个数&#xff0c;不能选超过连续的k个数&#xff0c;问所能选的最大值是多少&#xff1f; 题解&#xff1a; 我们首先分析dp过程&#xff1a; dp[i]表示选择完前i个数的最大值 sum[i]表示前i项和 对于第i个数&#xff0c;它有两个情况&#…