链接:https://ac.nowcoder.com/acm/contest/907/C
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
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<=105
1<=X,Y<=C,1<=A,B<=108
A,B通过随机产生
发现还能这么玩~~
#include<bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int maxn = 100010;
int n, y, c, ans;
int ma[maxn * 4], mi[maxn * 4], lazy[maxn * 4];
void pushup(int rt) {
ma[rt] = max(ma[rt << 1], ma[rt << 1 | 1]);
mi[rt] = min(mi[rt << 1], mi[rt << 1 | 1]);
}
void pushdown(int rt) {
if (lazy[rt] != 0) {
mi[rt << 1] = lazy[rt];
ma[rt << 1] = lazy[rt];
mi[rt << 1 | 1] = lazy[rt];
ma[rt << 1 | 1] = lazy[rt];
lazy[rt << 1] = lazy[rt];
lazy[rt << 1 | 1] = lazy[rt];
lazy[rt] = 0;
}
}
void build(int l, int r, int rt) {
ma[rt] = 1; mi[rt] = 1;
lazy[rt] = 0;
if (l == r) {
return;
}
int m = (l + r) >> 1;
build(lson);
build(rson);
}
void update(int L, int R, int l, int r, int rt, int x) {
if (L <= l&&r <= R) {
mi[rt] = x;ma[rt] = x;
lazy[rt] = x;
return;
}
pushdown(rt);
int m = (l + r) >> 1;
if (L <= m) {
update(L, R, lson, x);
}
if (R > m) {
update(L, R, rson, x);
}
pushup(rt);
}
int query(int l, int r, int rt, int x) {
if (mi[rt] == ma[rt]) {
if (mi[rt] == x) return (r - l + 1);
else return 0;
}
pushdown(rt);
int res = 0, m = (l + r) >> 1;
if (ma[rt << 1] >= x&&mi[rt << 1] <= x) {
res += query(lson, x);
}
if (ma[rt << 1 | 1] >= x&&mi[rt << 1 | 1] <= x) {
res += query(rson, x);
}
return res;
}
int num[maxn];
void go(int l, int r, int rt) {
if (l == r) {
num[ma[rt]]++;
ans = max(ans, num[ma[rt]]);
return;
}
int m = (l + r) >> 1;
pushdown(rt);
go(lson);go(rson);
}
int main() {
ios::sync_with_stdio(0);
cin >> n >> y >> c;
for (int i = 0; i <= c; i++)
num[i] = 0;
ans = 0;
build(1, n, 1);
while (c--) {
long long a, b, e, d;
cin >> a >> b >> d >> e;
long long p = query(1, n, 1, a);
long long l = (d + ((p + e) % n)*(p + e) % n) % n, r = (d + ((p * e) % n*(p * e) % n) % n) % n;
l++; r++;
update(min(l, r), max(l, r), 1, n, 1, b);
}
go(1, n, 1);
cout << ans << endl;
return 0;
}
/*
4 5 3
2 3 1 0
2 3 2 0
2 3 3 0
2 4 4 0
*/