牛客网练习赛36 Ribbit的数列 分块
题目描述
Rabbit得到了一个长度为N的数列(数列编号从0到N−1)。数列中每个数vali满足1<=vali<=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次操作后数列中出现次数最多的那个数出现的次数。
示例1
输入
复制
4 2 1 2 2 1 1
输出
复制
2
备注:
1<=N,C,Q<=1e5
1<=X,Y<=C,1<=A,B<=1e8
A,B通过随机产生
思路:
因每次更改对于一整个区间赋为相同的值因此可以用lazy标记某一块中是否全部为相同的值,每次分裂合并时进行查询。
分块,维护区间中某值出现的次数。
#include <math.h>
#include <algorithm>
#include <stdio.h>
#include <set>
#include <map>
#include <string.h>
#include <string>
#include<iostream>
using namespace std;
const int M=1e5+100;
int a[M];
int B,belong[M],lazy[M],r[M],l[M],num;
//map<int,int>mp[M];
int sum[M];//记录某值在序列中出现的次数
void build(int n)
{B=sqrt(n);num=n/B;if(n%B){num++;}for(int i=1;i<=num;i++){l[i]=B*(i-1)+1;r[i]=B*i;}r[num]=n;for(int i=1;i<=num;i++){lazy[i]=-1;for(int j=l[i];j<=r[i];j++){belong[j]=i;a[j]=1;}}sum[1]=n;
}
void push_down(int x)//在更新跟查找时,如果要进入某一段,首先释放lazy标记,然后在再区间中查找
{if(lazy[x]!=-1){for(int i=l[x];i<=r[x];i++){a[i]=lazy[x];}lazy[x]=-1;}
}
void update(int x,int y,int v)
{if(belong[x]==belong[y]){if(lazy[belong[x]]!=-1)push_down(belong[x]);for(int i=x;i<=y;i++){sum[a[i]]--;sum[v]++;a[i]=v;}}else{int b_st=belong[x];if(lazy[b_st]!=-1)push_down(b_st);for(int i=x;i<=r[b_st];i++){sum[a[i]]--;sum[v]++;a[i]=v;}for(b_st++;b_st<belong[y];b_st++){if(lazy[b_st]!=-1){if(lazy[b_st]!=v){sum[lazy[b_st]]-=B;sum[v]+=B;lazy[b_st]=v;}}else{for(int j=l[b_st];j<=r[b_st];j++){if(a[j]!=v){sum[a[j]]--;sum[v]++;a[j]=v;}}lazy[b_st]=v;}}if(lazy[b_st]!=-1)push_down(b_st);// int ed=min(r,n);for(int i=l[b_st];i<=y;i++){sum[a[i]]--;sum[v]++;a[i]=v;}}
}
//int query(int x)
//{
// int sum=0;
// for(int i=1;i<=num;i++)
// {
// if(lazy[i]!=-1)
// {
// push_down(i);
// }
// sum+=mp[i][x];
// }
// return sum;
//}
int main()
{int n,m,q;cin>>n>>m>>q;build(n);int x,y;long long aa,bb;while(q--){scanf("%d%d%lld%lld",&x,&y,&aa,&bb);aa%=n;bb%=n;long long p=sum[x];long long ll=(aa+((p+bb)*(p+bb))%(long long)n)%n+1;long long rr=(aa+((p*bb)%n*(p*bb)%n)%(long long)n)%n+1;if(ll>rr)swap(ll,rr);update(ll,rr,y);}int maxn=0;for(int i=1;i<=m;i++){if(sum[i]>maxn)maxn=sum[i];}cout<<maxn<<endl;return 0;
}
牛客网练习赛36 Ribbit的数列 分块相关推荐
- 牛客网 斐波那契数列
剑指offer 牛客网 斐波那契数列 # -*- coding: utf-8 -*- """ Created on Mon Apr 8 15:35:14 2019@aut ...
- 牛客网-斐波那契数列
牛客网编程题–>大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0),其中n<=39. 用递归结构写斐波那契数列. #include < ...
- 牛客网练习赛26B(简单的dp)
题目链接:https://www.nowcoder.com/acm/contest/180/B 链接:https://www.nowcoder.com/acm/contest/180/B 来源:牛客网 ...
- 牛客网练习赛34-A题
题目https://ac.nowcoder.com/acm/contest/297/A链接 链接:https://ac.nowcoder.com/acm/contest/297/A 来源:牛客网 不知 ...
- 牛客网练习赛34-b题
题目链接https://ac.nowcoder.com/acm/contest/297/B 链接:https://ac.nowcoder.com/acm/contest/297/A?&head ...
- 牛客网练习赛15__吉姆的奇思妙想
吉姆的奇思妙想 题目描述 吉姆是个热爱算法竞赛的小朋友,平常的休闲活动就是刷 牛客网 的题目. 当吉姆刷到 wannafly挑战赛12 F.小H和圣诞树 这题时,颇为震惊,因为这是他第一次在wan ...
- 牛客网_PAT乙级_1020完美数列(25)【vector sort 最后一个测试用例超时】
题目描述 给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列. 现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完 ...
- 牛客网练习赛44-B(快速幂+模拟)
题目链接:https://ac.nowcoder.com/acm/contest/548/B 题意:计算m/n小数点后k1位到k2位,1≤m≤n≤109,1<=k1<=k2<=109 ...
- 牛客网练习赛7--购物 动态规划
题意: 在遥远的东方,有一家糖果专卖店. 这家糖果店将会在每天出售一些糖果,它每天都会生产出m个糖果,第i天的第j个糖果价格为C[i][j]元. 现在的你想要在接下来的n天去糖果店进行选购,你每天可以 ...
最新文章
- 如何将加密PDF转换成Word文档
- 为了方便大家下载四级资料,开通FTP
- 机器学习入门必备的13张“小抄”(附下载)
- 播放RTMP协议的流媒体的几种选择 1
- mysql git下载安装_xshell、python、git、mysql安装(玩阿里云的第二天)
- Python中数据类型转换
- java多线程的同步控制_Java多线程并发控制工具信号量Semaphore,实现原理及案例...
- rabbitmq 笔记
- HttpClient如何解决302重定向问题
- 高数18讲 之基础知识
- 2012年5月16日,Google发布“知识图谱(Knowledge Graph)”
- 正点原子STM32F4探索者开发板HAL库TFT LCD屏幕例程移植到STM32CubeMX+CLion
- 冒泡、选择和插入排序图解详细分析
- 5G无线技术基础自学系列 | 网络架构
- 为什么电脑总是弹出“拨号连接”界面?
- redis通配符批量删除keys——del
- 小程序获取微信运动步数
- MDWechat(微信美化)免费
- Microsoft SQL Server 2008 MDX Step by Step中关于MDX Step-by-Step.abf损坏文件的处理
- 【D3.js 学习总结】12、D3布局-集群图