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

文章目录

  • Rmq Problem / mex
  • Boring Queries
  • Colorful Squares

Rmq Problem / mex

luogu4137

aia_iai建权值线段树

再加上可持久化

对于第RRR个版本的线段树,每个叶子xxx存的是ai=xa_i=xai=x的所有iii中最大的小于RRR的位置iii

那么询问[L,R][L,R][L,R]就转化成RRR版本线段树中所有小于LLL的叶子中的最小值

#include <cstdio>
#include <iostream>
using namespace std;
#define maxn 200005
int n, Q, cnt;
int a[maxn], rt[maxn];
struct node { int l, r, Min; }t[maxn * 50];void modify( int lst, int &now, int l, int r, int val, int pos ) {if( ! now ) now = ++ cnt;if( l == r ) { t[now].Min = pos; return; }int mid = ( l + r ) >> 1;if( val <= mid ) {t[now].r = t[lst].r;modify( t[lst].l, t[now].l, l, mid, val, pos );}else {t[now].l = t[lst].l;modify( t[lst].r, t[now].r, mid + 1, r, val, pos );}t[now].Min = min( t[t[now].l].Min, t[t[now].r].Min );
}int query( int now, int l, int r, int ti ) {if( l == r ) return l;int mid = ( l + r ) >> 1;if( t[t[now].l].Min <= ti ) return query( t[now].l, l, mid, ti );else return query( t[now].r, mid + 1, r, ti );
}int main() {scanf( "%d %d", &n, &Q );for( int i = 1;i <= n;i ++ ) scanf( "%d", &a[i] );for( int i = 1;i <= n;i ++ ) {a[i] = min( a[i], n );modify( rt[i - 1], rt[i], 0, n, a[i], i );}for( int i = 1, l, r;i <= Q;i ++ ) {scanf( "%d %d", &l, &r );printf( "%d\n", query( rt[r], 0, n, l - 1 ) );}return 0;
}

Boring Queries

CF1422F

ai∈[1,2e5]→a_i\in[1,2e5]\rightarrowai[1,2e5] aia_iai分解质因子后,最多只会有一个>2e5≈450>\sqrt{2e5}≈450>2e5450的质因数

而在450内的质因数有87

所以按质因数大小分块

预处理aia_iai含有的小于450的质因数primej\rm prime_jprimej的个数

lcm\rm lcmlcm可以表示为∏max⁡lrpi\prod\max_l^rp_imaxlrpi(每一个质因数的个数最大值的乘积)

对于每个质因数开一个ststst表,开878787个就行,预处理出该质因数在a[l,r]a[l,r]a[l,r]内出现次数的最大值

剩下的一个>450>450>450的质因数,利用线段树来维护区间[l,r][l,r][l,r]内所有这些大质因数乘积

  • 如果没有就往里面扔111
  • 如果有
    • 考虑对于区间[l,r][l,r][l,r]内多次出现的xxx只能统计一次
    • prei:aipre_i:a_iprei:ai上一次出现的位置
    • 只在区间[l,r][l,r][l,r]xxx第一次出现的时候把xxx统计进答案
    • 这些位置的特点是prei≤l−1pre_i\le l-1preil1
    • 所以相当于∀l≤i≤r∏i[prei≤l−1]ai\forall_{l\le i\le r} \prod_i\Big[pre_i\le l-1\Big]a_iliri[preil1]ai
    • 主席树维护,rt[r]rt[r]rt[r]的叶子维护该值距离rrr最近的位置
    • 当时候直接查rt[l−1]rt[l-1]rt[l1]就行

跟第一题很类似的主席树维护

#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;
#define mod 1000000007
#define maxn 200005
struct node { int l, r, val; }t[maxn * 20];
int n, Q, cnt, tot;
bool vis[455];
int prime[90], a[maxn], rt[maxn], nxt[maxn], pos[maxn];
int mi[90][20];
char st[90][maxn][20];void sieve() {for( int i = 2;i <= 450;i ++ ) {if( ! vis[i] ) prime[++ cnt] = i;for( int j = 1;j <= cnt and i * prime[j] <= 450;j ++ ) {vis[i * prime[j]] = 1;if( i % prime[j] == 0 ) break;}}
}void build() {for( int k = 1;k <= cnt;k ++ )for( int j = 1;j < 20;j ++ )for( int i = 1;i + ( 1 << j ) - 1 <= n;i ++ )st[k][i][j] = max( st[k][i][j - 1], st[k][i + ( 1 << j - 1 )][j - 1] );
}int query( int k, int l, int r ) {int i = log2( r - l + 1 );return max( st[k][l][i], st[k][r - ( 1 << i ) + 1][i] );
}void build( int &now, int l, int r ) {if( ! now ) now = ++ tot;t[now].val = 1;if( l == r ) return;int mid = l + r >> 1;build( t[now].l, l, mid );build( t[now].r, mid + 1, r );
}void modify( int now, int l, int r, int pos, int val ) {if( l == r ) { t[now].val = val; return; }int mid = l + r >> 1;if( pos <= mid ) modify( t[now].l, l, mid, pos, val );else modify( t[now].r, mid + 1, r, pos, val );t[now].val = 1ll * t[t[now].l].val * t[t[now].r].val % mod;
}void modify( int lst, int &now, int l, int r, int pos, int val ) {if( ! now ) now = ++ tot;if( l == r ) { t[now].val = val; return; }int mid = l + r >> 1;if( pos <= mid ) {t[now].r = t[lst].r;modify( t[lst].l, t[now].l, l, mid, pos, val );}else {t[now].l = t[lst].l;modify( t[lst].r, t[now].r, mid + 1, r, pos, val );}t[now].val = 1ll * t[t[now].l].val * t[t[now].r].val % mod;
}int query( int now, int l, int r, int L, int R ) {if( ! now or r < L or R < l ) return 1;if( L <= l and r <= R ) return t[now].val;int mid = ( l + r ) >> 1;return 1ll * query( t[now].l, l, mid, L, R ) * query( t[now].r, mid + 1, r, L, R ) % mod;
}int main() {sieve();scanf( "%d", &n );for( int i = 1;i <= n;i ++ ) {scanf( "%d", &a[i] );for( int j = 1;j <= cnt;j ++ )if( a[i] % prime[j] == 0 )while( a[i] % prime[j] == 0 )st[j][i][0] ++, a[i] /= prime[j];}build();build( rt[0], 1, n );for( int i = 1;i <= n;i ++ ) {if( ! pos[a[i]] ) modify( rt[0], 1, n, i, a[i] );else nxt[pos[a[i]]] = i;pos[a[i]] = i;}for( int i = 1;i <= n;i ++ )if( nxt[i] ) modify( rt[i - 1], rt[i], 1, n, nxt[i], a[nxt[i]] );else rt[i] = rt[i - 1];for( int i = 1;i <= cnt;i ++ ) {mi[i][0] = 1;for( int j = 1;j < 20;j ++ )mi[i][j] = 1ll * mi[i][j - 1] * prime[i] % mod;}scanf( "%d", &Q );int lst = 0, l, r;while( Q -- ) {scanf( "%d %d", &l, &r );l = ( l + lst ) % n + 1;r = ( r + lst ) % n + 1;if( l > r ) swap( l, r );int ans = 1;for( int i = 1;i <= cnt;i ++ )ans = 1ll * ans * mi[i][query( i, l, r )] % mod;ans = 1ll * ans * query( rt[l - 1], 1, n, l, r ) % mod;printf( "%d\n", lst = ans );}return 0;
}

Colorful Squares

CodeForces-gym102979-C

二分正方形边长,转化为判断性问题

考虑扫描线

对于大小为ddd的正方形,先把xi=xx_i=xxi=x的点加入,再在x=xi+d+1x=x_i+d+1x=xi+d+1的时候删除

最后判断集合中是否存在一个yyy,满足[y−d,y][y-d,y][yd,y]内的不同颜色种类数达到kkk

现在先加一个点[x0,y0][x_0,y_0][x0,y0]进集合,那么[y0−d,y][y_0-d,y][y0d,y]这个区间内就有c0c_0c0这种颜色

tit_itiy=iy=iy=i时被多少种不同颜色覆盖

  • 加一个点[x0,y0][x_0,y_0][x0,y0]对应的就是[y0−d,y][y_0-d,y][y0d,y]的区间加
  • 删除一个点[x0,y0][x_0,y_0][x0,y0]就是区间减
  • 判断是否存在kkk种颜色就是区间max\rm maxmax是否等于kkk

当然可能[y0−d,y][y_0-d,y][y0d,y]这个区间之前已经被c0c_0c0颜色覆盖过一部分,对于之前被覆盖过的区间就不需要操作

所以区间修改前还要调整计算真正的区间

这个调整不会很复杂

因为没被覆盖的区间不会被覆盖过的区间拆分开,没被覆盖的区间一定是完整的一段

#include <set>
#include <cstdio>
#include <vector>
#include <iostream>
using namespace std;
#define maxn 250005
#define lson num << 1
#define rson num << 1 | 1
struct tree { int Max, tag; }t[maxn << 2]; //线段树维护区间[l,r]出现不同颜色的种类数 
vector < pair < int, int > > pos[maxn]; //横坐标为x[i]的点集合
multiset < int > col[maxn]; //颜色为c[i]的点的y坐标集合
int n, k;void pushdown( int num ) {t[lson].Max += t[num].tag;t[lson].tag += t[num].tag;t[rson].Max += t[num].tag;t[rson].tag += t[num].tag;t[num].tag = 0;
}void build( int num, int l, int r ) {t[num].Max = t[num].tag = 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 L, int R, int x ) {if( R < L or R < l or r < L ) return;if( L <= l and r <= R ) { t[num].Max += x, t[num].tag += 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].Max = max( t[lson].Max, t[rson].Max );
}bool check( int d ) {for( int i = 0;i <= n;i ++ ) col[i].clear();build( 1, 1, n );int L, R;for( int i = 1;i <= n;i ++ ) {for( auto now : pos[i] ) {//枚举横坐标为i的所有点int y = now.first, c = now.second;/*now点覆盖的y坐标为[y-d,y]但是这段区间中不能和重复出现过的颜色区间有交e.g. 颜色1 覆盖了[2,4] 又有颜色1能覆盖[3,5] 那么只能对[5,5]进行线段树加上颜色1的操作因为边长都是d 所以覆盖区间不可能一长一短导致区间分裂 每个点影响的区间都是一段完整不分裂的区间 */if( col[c].find( y ) != col[c].end() ) {//如果颜色c在纵坐标y的一条横扫描线上出现过 不再加入 col[c].insert( y );continue;}else col[c].insert( y );//[L,R]表示颜色c的now点真正贡献的区间 接下来就是求解范围限制 auto l = col[c].lower_bound( y );//找到颜色c中第一个大于等于y的点位置的纵坐标 if( l == col[c].begin() ) L = max( 1, y - d );//没有比现在now的纵坐标更小的点了 下限可以取完 防止溢出1 else L = max( *( --l ) + 1, y - d ); //--l第一个小于y的点位置纵坐标+1和覆盖左端点取max 避免重复 auto r = col[c].upper_bound( y );//找到颜色中第一个大于y的点 if( r == col[c].end() ) R = y;//没有比现在now点纵坐标更大的点了 else R = min( *r - d - 1, y );//点的覆盖区间有没有包含现在的now点 //要保证覆盖区间是合法的L<=R 这个可以在线段树最开始的时候判断 modify( 1, 1, n, L, R, 1 );}if( i - d - 1 > 0 ) {for( auto now : pos[i - d - 1] ) {//删掉与现在横坐标距离>d的点 因为是一个一个枚举 每次只用删去距离恰好为d+1的点 更小x的点肯定在前面就被其它的i'删掉了 int y = now.first, c = now.second;col[c].erase( col[c].find( y ) );if( col[c].find( y ) != col[c].end() ) continue;//如果纵坐标y这里还有点 那么此时删去的点对线段树内值不会造成影响//否则就同样的找到颜色c的这个now点真正贡献的区间auto l = col[c].lower_bound( y );if( l == col[c].begin() ) L = max( 1, y - d );else L = max( *( --l ) + 1, y - d );auto r = col[c].upper_bound( y );if( r == col[c].end() ) R = y;else R = min( *r - d - 1, y );modify( 1, 1, n, L, R, -1 );}}if( t[1].Max == k ) return 1;}return 0;
}int main() {scanf( "%d %d", &n, &k );for( int i = 1, x, y, c;i <= n;i ++ ) {scanf( "%d %d %d", &x, &y, &c );pos[x].push_back( make_pair( y, c ) );}n = maxn - 5;int l = 0, r = n, ans;while( l <= r ) {int mid = l + r >> 1;if( check( mid ) ) ans = mid, r = mid - 1;else l = mid + 1;}printf( "%d\n", ans );return 0;
}

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

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

相关文章

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;组成 其键值满足二叉树性质 即点的左子…

K - Triangle 计蒜客 - 42405

K - Triangle 计蒜客 - 42405 题意&#xff1a; 给你一个三角形的三点&#xff0c;再给你三角形边上一个点&#xff0c;让你求另一个点(也要在三角形上)&#xff0c;使得平分三角形的面积 题解: 计算几何 三角形的三边ab&#xff0c;ac&#xff0c;bc 如果点p在ab上&#x…

P2508-[HAOI2008]圆上的整点【数学】

正题 题目链接:https://www.luogu.com.cn/problem/P2508 题目大意 一个在(0,0)(0,0)(0,0)的圆心&#xff0c;半径为rrr&#xff0c;求圆有多少个整点。 1≤r≤21091\leq r\leq 2\times 10^91≤r≤2109 解题思路 设这个点为(x,y)(x,y)(x,y)&#xff0c;那么有x2y2r2x^2y^2r^2…

如何为ASP.NET Core设置客户端IP白名单验证

本篇博文中展示了如何在ASP.NET Core应用程序中设置IP白名单验证的3种方式。你可以使用一下3种方式&#xff1a;使用中间件检查每个请求的远程IP地址使用Action过滤器为指定的Controller或action方法添加针对远程IP地址的检查使用IPageFilter为Razor Pages应用添加针对远程IP地…

CodeForces - 140C New Year Snowmen

CodeForces - 140C New Year Snowmen 题意&#xff1a; 现在来做雪人&#xff0c;每个雪人由三个不同大小的雪球构成&#xff1a;一个大的&#xff0c;一个中等的&#xff0c;一个小的。现在有 n 个雪球半径分别为 r1, r2, …, rn. 为了做雪人&#xff0c;三个雪球的大小必须…

洛谷P4389:付公主的背包(多项式、生成函数)

对于一些生成函数累乘的题目&#xff0c;也许可以通过求 ln⁡\lnln 转化为累加问题从而完成简化。 解析 不难写出对于单个物品 kkk 的生成函数&#xff1a; ∑i1xVi11−xVK\sum_{i1}x^{Vi}\frac{1}{1-x^{V_K}}i1∑​xVi1−xVK​1​ 那么答案的生成函数就是所有物品的函数的卷积…

数据结构之fhq-treap——Chef and Sets,[HNOI2012]永无乡,Play with Chain,[NOI2005]维修数列(结构体版代码)

因为非常板&#xff0c;所以主要是代码Tyvj 1728 普通平衡树Chef and Sets[HNOI2012]永无乡Play with Chain[NOI2005]维修数列题目很水&#xff0c;所以可能会出现代码部分细节出锅&#xff0c;但确实这些代码是能过得 还请多多包涵 Tyvj 1728 普通平衡树 luogu3369 #include…

让ASP.NET Core支持GraphQL之-GraphQL的实现原理

众所周知RESTful API是目前最流行的软件架构风格之一&#xff0c;它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁&#xff0c;更有层次&#xff0c;更易于实现缓存等机制。RESTful的优越性是毋庸置疑的&#xff0c;不过GraphQL也可以作为一种补充&am…

CodeForces 1514A Perfectly Imperfect Array

CodeForces 1514A Perfectly Imperfect Array 题意&#xff1a; 给你n个数&#xff0c;是否存在一个数不是平方数 题解&#xff1a; 先开方&#xff0c;转int&#xff0c;判断是否等于平方 代码&#xff1a; #include<bits/stdc.h> #define debug(a,b) printf(&quo…

另一个博客

在博客园搞了个博客&#xff0c;目前来说两边会同时更新的。 有些题目不放出来&#xff0c;都写在来博客园那边&#xff0c;虽然你们也不知道密码 链接:https://www.cnblogs.com/QuantAsk/

洛谷P4173:残缺的字符串(FFT、通配符匹配)

解析 通配符匹配的经典题。 设单词串为 AAA,文章串为 BBB。 把 AAA 翻转一下&#xff0c;判断问题就能转化为一个卷积的形式&#xff1a; F(p)&i0m−1match(Ai1,Bp−i)F(p)\&_{i0}^{m-1}match(A_{i1},B_{p-i})F(p)&i0m−1​match(Ai1​,Bp−i​) match(a,b)match(…

[2021-09-02 contest]CF1251C,可达性统计(bitset优化dp),Boomerang Tournament(状压dp),小蓝的好友(mrx)(treap平衡树)

文章目录CF1251C Minimize The Integeracwing164&#xff1a;可达性统计Facebook Hacker Cup 2016 Round 1 Boomerang Tournament[Zjoi2012]小蓝的好友(mrx)CF1251C Minimize The Integer ………………… 给你一个大整数aaa&#xff0c;它由nnn位数字&#xff0c;也可能有前导…

Entity Framework 的一些性能建议

点击上方蓝字关注“汪宇杰博客”这是一篇我在2012年写的老文章&#xff0c;至今适用&#xff08;没错&#xff0c;我说的就是适用于EF Core&#xff09;。因此使用微信重新推送&#xff0c;希望能帮到大家。自从我用了EF&#xff0c;每次都很关心是否有潜在的性能问题。所以每次…