牛客 Rabbit的数列 (线段树维护值为x的个数+区间覆盖)
https://ac.nowcoder.com/acm/contest/907/C
链接:https://ac.nowcoder.com/acm/contest/907/C
来源:牛客网
题目描述
初始时数列中每个数均为1,现在Rabbit要对这个数列进行Q次操作,每次操作给出四个数:X Y A B,首先查询数列中值为X的个数P,然后计算出L,R:
L=(A+(P+B)2)mod N
R=(A+(P∗B)2)mod N
并将范围[min(L,R),max(L,R)]内的所有数改为Y。
最后询问经过Q次操作后数列中出现次数最多的那个数出现了几次。
输入描述:
第一行三个整数N,C,Q。 接下来Q行,每行四个整数X,Y,A,B,表示一个操作。
输出描述:
输出一个整数,表示经过Q次操作后数列中出现次数最多的那个数出现的次数。
输出
2 分析:我们可以维护一个区间最大最小值,这样就可以在log的时间内知道值为x 的个数有多少的 。因为mn[x]=mx[x] 表示这个区间都为Y,故无需在向下查找
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+;
typedef long long ll;
int vis[maxn];
int lazy[maxn*],mx[maxn*],mn[maxn*]; void pushdown(int id,int l,int r)
{
if(lazy[id])
{
mx[id]=mn[id]=lazy[id];
if(l!=r)
{
lazy[id<<|]=lazy[id<<]=lazy[id];
mx[id<<]=mx[id<<|]=lazy[id];
mn[id<<]=mn[id<<|]=lazy[id];
}
lazy[id]=;
}
}
void update(int id,int l,int r,int ql,int qr,int v)
{
pushdown(id,l,r);
if(ql<=l&&r<=qr&&mx[id]==mn[id])
{
vis[mx[id]]-=(r-l+);
vis[v]+=(r-l+);
lazy[id]=v;
pushdown(id,l,r);
return ;
}
int mid=(l+r)>>;
if(ql<=mid) update(id<<,l,mid,ql,qr,v);
if(qr>mid) update(id<<|,mid+,r,ql,qr,v);
mx[id]=max(mx[id<<],mx[id<<|]);
mn[id]=min(mn[id<<],mn[id<<|]);
}
int main()
{ int n,c,q,x,y;
ll a,b;
scanf("%d%d%d",&n,&c,&q);
// memset(mn,1,sizeof(mn));
// memset(mx,1,sizeof(mx));
vis[]=n;
lazy[]=;
while(q--)
{
scanf("%d%d%lld%lld",&x,&y,&a,&b);
int p=vis[x];
int l=(a+(p+b)%n*(p+b)%n)%n+;
int r=(a+p*b%n*p%n*b%n)%n+;
if(l>r) swap(l,r);
update(,,n,l,r,y);
}
int ans=;
for(int i=;i<=c;i++)
ans=max(ans,vis[i]);
printf("%d\n",ans);
}
牛客 Rabbit的数列 (线段树维护值为x的个数+区间覆盖)的更多相关文章
- 牛客练习赛28-B(线段树,区间更新)
牛客练习赛28 - B 传送门 题目 qn姐姐最好了~ qn姐姐给你了一个长度为n的序列还有m次操作让你玩, 1 l r 询问区间[l,r]内的元素和 2 l r 询问区间[l,r]内的 ...
- DP+线段树维护矩阵(2019牛客暑期多校训练营(第二场))--MAZE
题意:https://ac.nowcoder.com/acm/contest/882/E 给你01矩阵,有两种操作:1是把一个位置0变1.1变0,2是问你从第一行i开始,到最后一行j有几种走法.你只能 ...
- 2019牛客暑期多校训练营(第二场)E 线段树维护dp转移矩阵
题意 给一个\(n\times m\)的01矩阵,1代表有墙,否则没有,每一步可以从\(b[i][j]\)走到\(b[i+1][j]\),\(b[i][j-1]\),\(b[i][j+1]\),有两种 ...
- 牛客多校第十场 F Popping Balloons 线段树维护稀疏矩阵
题意: 给定一个稀疏矩阵,里面有若干个气球,让你横着开三枪,竖着开三枪,问最多能打爆多少气球,要求相同方向,相邻两枪必须间隔r. 题解: 横向记录每列有多少个气球,分别在哪行上. 然后把这个数据改造成 ...
- Wannafly挑战赛22 D 整数序列 (线段树维护三角函数值)
链接:https://ac.nowcoder.com/acm/contest/160/D 来源:牛客网 整数序列 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语 ...
- [动态dp]线段树维护转移矩阵
背景:czy上课讲了新知识,从未见到过,总结一下. 所谓动态dp,是在动态规划的基础上,需要维护一些修改操作的算法. 这类题目分为如下三个步骤:(都是对于常系数齐次递推问题) 1先不考虑修改,不考虑区 ...
- 线段树维护矩阵【CF718C】 Sasha and Array
Description 有一个长为\(n\)的数列\(a_{1},a_{2}...a_{n}\),你需要对这个数列维护如下两种操作: \(1\space l \space r\space x\) 表示 ...
- 51nod 1376【线段树维护区间最大值】
引自:wonter巨巨的博客 定义 dp[i] := 以数字 i(不是下标 i)为结尾的最长上升长度 然后用线段树维护 dp[i]: 每个节点维护 2 个信息,一个是当前区间的最大上升长度,一个是最大 ...
- Codeforces 446C - DZY Loves Fibonacci Numbers(斐波那契数列+线段树)
Codeforces 题目传送门 & 洛谷题目传送门 你可能会疑惑我为什么要写 *2400 的题的题解 首先一个很明显的想法是,看到斐波那契数列和 \(10^9+9\) 就想到通项公式,\(F ...
随机推荐
- vue组件通信之父子组件通信
准备工作: 首先,新建一个项目,如果这里有不会的同学,可以参考我转载过的文章 http://www.cnblogs.com/Sky-Ice/p/8875958.html vue 脚手架安装及新建项目 ...
- CentOS7 iptables安装及操作
添加规则时的考量点: (1)要实现哪种功能:判断添加在哪张表上: (2)报文流经的路径:判断添加在哪个链上: 链上规则的次序: (1)同类规则(访问同一应用),匹配范围小的放上面: (2)不同类规则( ...
- Acwing‘803. 区间合并
(https://www.acwing.com/problem/content/805/) 给定 nn 个区间 [li,ri][li,ri],要求合并所有有交集的区间. 注意如果在端点处相交,也算有交 ...
- Fiddler用法整理
目 录 1 Fiddler的基本介绍 1.1 下载安装 1.2 适用平台 2 Fiddler的工作原理 3 同类工具 4 捕获非IE浏览器的会话 5 捕获不同请求的设置方法 5.1 Web HTTPS ...
- React父子组件间的传值
父组件: import React, { Component } from 'react'; import Child from './chlid'; class parent extends Com ...
- ecshop 2.7 PC 微信扫描支付配置教程
在ecshop支付过程中,有些是没有微信支付的,需要自己添加微信支付的模块,那么怎么添加呢,添加过程需要调试,本人花了很长时间才调试成功的pc微信扫描支付, 1,数据库添加微信支付方模块 2,后台设置 ...
- 本地主机访问远程linux系统服务器上的jupyter notebook
1,机器情况:服务器 centos python环境已经配置好了,在虚拟环境下安装了anaconda 并且在里面安装了jupyter notebook 2,主机是 windows ipytho ...
- 如何从mysql备份中提取单张表数据
1.先提取备份数据中的前50行出来,查看一下备份数据格式 head -50 bakdb.sql > head50.txt 类似下面的数据是我们所需要提取的: / ...
- Linux telnet、nc、ping监测状态
在工作中会遇到网络出现闪断丢包的情况,最终影响业务工常使用.可以业务服务器上发起监测. 1.通过telnet echo -e "\n" | telnet localhost 2 ...
- 补比赛——牛客OI周赛9-普及组
比赛地址 A 小Q想撸串 题目分析 普及T1水题惯例.字符串中找子串. Code #include<algorithm> #include<iostream> #include ...