传送门

题解

题解里面说得很清楚了。

大约就是单独考虑每个数的贡献,然后看一下每个序列里有多少区间是没有这个数的,乘起来就好了。

为了处理修改我们需要每个值建一棵线段树来搞,但是窝zz了,写了线段树套线段树,比正解多一个log。

一开始想着不调map、set,然后发现特别难写。最后还是调了map……

比赛的时候挂了0没有逆元的坑啊!

#include<map>
#include<cstdio>
#include<algorithm>
#define pii pair
#define mpii make_pair
#define MN 410000
using namespace std;
int read_p,read_ca,read_f;
inline int read(){
read_p=;read_ca=getchar();read_f=;
while(read_ca<''||read_ca>'') {if (read_ca=='-') read_f=-;read_ca=getchar();}
while(read_ca>=''&&read_ca<='') read_p=read_p*+read_ca-,read_ca=getchar();
return read_p*read_f;
}
const int MOD=;
struct na{int p,*st;}Y[MN<<];
bool operator < (na a,na b){return a.p<b.p;}
inline void M(int &x){while(x>=MOD)x-=MOD;while(x<)x+=MOD;}
int n,m,L[MN],a[MN],ro[MN],RO[MN*],ls[MN*],rs[MN*],LS[MN*],RS[MN*],S[MN*],NUM,x[MN],y[MN],z[MN],T=,num=,_num=,mmh[MN],MMH=,t[MN],w[MN],ze[MN];
void ADD(int &p,int l,int r,int pos,int v){
if (!p) p=++_num;S[p]+=v;
if (l==r) return;
int mid=l+r>>;
if (pos<=mid) ADD(LS[p],l,mid,pos,v);else ADD(RS[p],mid+,r,pos,v);
}
void add(int &p,int l,int r,int pos,int x,int v){
if (!p) p=++num;ADD(RO[p],,T,x,v);
if (l==r) return;
int mid=l+r>>;
if (pos<=mid) add(ls[p],l,mid,pos,x,v);else add(rs[p],mid+,r,pos,x,v);
}
int ASK(int p,int l,int r,int k){
if (!p) return ;
if (l==r) return S[p];
int mid=l+r>>;
return k<=mid?ASK(LS[p],l,mid,k):ASK(RS[p],mid+,r,k);
}
int p_ask(int p,int l,int r,int pos,int x){
if (ASK(RO[p],,T,x)==) return -;
if (pos<=l) return -;
if (l==r) return l;
int mid=l+r>>;
int w=p_ask(rs[p],mid+,r,pos,x);
if (w!=-) return w;
return p_ask(ls[p],l,mid,pos,x);
}
int s_ask(int p,int l,int r,int pos,int x){
if (ASK(RO[p],,T,x)==) return -;
if (pos>=r) return -;
if (l==r) return l;
int mid=l+r>>;
int w=s_ask(ls[p],l,mid,pos,x);
if (w!=-) return w;
return s_ask(rs[p],mid+,r,pos,x);
}
inline int mi(int x,int y){
int mmh=;
while (y){
if (y&) mmh=1LL*mmh*x%MOD;
x=1LL*x*x%MOD;y>>=;
}
return mmh;
}
map<pii<int,int>,int> ma;
map<pii<int,int>,int>::iterator it;
inline void del(int x,int v){
if(!ze[v])M(MMH+=mmh[v]);
if (ma.find(mpii(x,v))==ma.end()) ma[mpii(x,v)]=1LL*(L[x]-L[x-])*(L[x]-L[x-]+)/%MOD;
if (!ma[mpii(x,v)]) ze[v]--;else mmh[v]=1LL*mmh[v]*mi(ma[mpii(x,v)],MOD-)%MOD;
}
inline void add(int x,int v){if (!ma[mpii(x,v)]) ze[v]++;else mmh[v]=1LL*mmh[v]*ma[mpii(x,v)]%MOD;if(!ze[v])M(MMH-=mmh[v]);}
int main(){
n=read();m=read();
for (int i=;i<=n;i++) L[i]=L[i-]+read();
for (int i=;i<=n;i++){
for (int j=L[i-];j<L[i];j++) Y[++NUM].p=a[j]=read(),Y[NUM].st=&a[j];
MMH=1LL*(L[i]-L[i-])*(L[i]-L[i-]+)/%MOD*MMH%MOD;
}
for (int i=;i<=m;i++) x[i]=read(),y[i]=read(),Y[++NUM].p=z[i]=read(),Y[NUM].st=&z[i];
sort(Y+,Y++NUM);
for (int i=;i<=NUM;i++) T+=i==||Y[i].p!=Y[i-].p,*Y[i].st=T;
for (int i=;i<=T;i++) mmh[i]=MMH,ze[i]=;
MMH=1LL*MMH*T%MOD;
for (int i=;i<=n;i++)
for (int j=L[i-];j<L[i];j++)add(ro[i],,L[i]-L[i-],j-L[i-]+,a[j],); for (int i=;i<=n;i++){
for (int j=L[i-];j<L[i];j++)
if (!t[a[j]]) w[j]=(1LL*(j-L[i-]+)*(j-L[i-])>>)%MOD,t[a[j]]=j+;else w[j]=((1LL*(j+-t[a[j]])*(j-t[a[j]])>>)+w[t[a[j]]-])%MOD,t[a[j]]=j+; int s=mi(1LL*(L[i]-L[i-])*(L[i]-L[i-]+)/%MOD,MOD-);
for (int j=L[i]-;j>=L[i-];j--) if (t[a[j]]){
M(w[j]+=1LL*(L[i]-t[a[j]]+)*(L[i]-t[a[j]])/%MOD);
mmh[a[j]]=1LL*mmh[a[j]]*s%MOD;
if (!w[j]) ze[a[j]]++;else mmh[a[j]]=1LL*mmh[a[j]]*w[j]%MOD;
ma[mpii(i,a[j])]=w[j];
t[a[j]]=;
}
} for (int i=;i<=T;i++) if (!ze[i]) M(MMH-=mmh[i]);
printf("%d\n",MMH);
for (int i=;i<=m;i++){
int pos=L[x[i]-]+y[i]-;
del(x[i],a[pos]);del(x[i],z[i]); int l=p_ask(ro[x[i]],,L[x[i]]-L[x[i]-],y[i],a[pos]),r=s_ask(ro[x[i]],,L[x[i]]-L[x[i]-],y[i],a[pos]);
if (l==-) l=;if (r==-) r=L[x[i]]-L[x[i]-]+;
it=ma.find(mpii(x[i],a[pos]));
M(it->second+=1LL*(r-y[i])*(y[i]-l)%MOD); l=p_ask(ro[x[i]],,L[x[i]]-L[x[i]-],y[i],z[i]),r=s_ask(ro[x[i]],,L[x[i]]-L[x[i]-],y[i],z[i]);
if (l==-) l=;if (r==-) r=L[x[i]]-L[x[i]-]+;
it=ma.find(mpii(x[i],z[i]));
M(it->second-=1LL*(r-y[i])*(y[i]-l)%MOD); add(x[i],a[pos]);add(x[i],z[i]); add(ro[x[i]],,L[x[i]]-L[x[i]-],y[i],a[pos],-);
add(ro[x[i]],,L[x[i]]-L[x[i]-],y[i],z[i],);a[pos]=z[i];
printf("%d\n",MMH);
}
}

LibreOJ β Round #2 E. 数论只会 GCD的更多相关文章

  1. 算法马拉松35 E 数论只会Gcd - 类欧几里得 - Stern-Brocot Tree - 莫比乌斯反演

    题目传送门 传送门 这个官方题解除了讲了个结论,感觉啥都没说,不知道是因为我太菜了,还是因为它真的啥都没说. 如果 $x \geqslant y$,显然 gcd(x, y) 只会被调用一次. 否则考虑 ...

  2. 数论只会GCD。。。

    一些关于GCD的代码.... #include <iostream> #include <cstdio> #include <cstring> using name ...

  3. LibreOJ #514. 「LibreOJ β Round #2」模拟只会猜题意

    内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 给定一个长度为 nnn 的序列 AAA . 定义 f(l,r)=∑i=lrAif(l,r ...

  4. Loj514「LibreOJ β Round #2」模拟只会猜题意 - 模拟

    注意初始化即可. #include <bits/stdc++.h> using namespace std; ],a[],t1,t2,t3,t4; int main(){ memset(a ...

  5. LibreOJ β Round #2 题解

    LibreOJ β Round #2 题解 模拟只会猜题意 题目: 给定一个长为 \(n\) 的序列,有 \(m\) 次询问,每次问所有长度大于 \(x\) 的区间的元素和的最大值. \(1 \leq ...

  6. LOJ528 「LibreOJ β Round #4」求和

    LOJ528 「LibreOJ β Round #4」求和 先按照最常规的思路推一波: \[\begin{aligned} &\sum_{i=1}^n\sum_{j=1}^m\mu^2(\gc ...

  7. [LOJ#525]「LibreOJ β Round #4」多项式

    [LOJ#525]「LibreOJ β Round #4」多项式 试题描述 给定一个正整数 k,你需要寻找一个系数均为 0 到 k−1 之间的非零多项式 f(x),满足对于任意整数 x 均有 f(x) ...

  8. [LOJ#526]「LibreOJ β Round #4」子集

    [LOJ#526]「LibreOJ β Round #4」子集 试题描述 qmqmqm有一个长为 n 的数列 a1,a2,……,an,你需要选择集合{1,2,……,n}的一个子集,使得这个子集中任意两 ...

  9. LibreOJ #526. 「LibreOJ β Round #4」子集

    二次联通门 : LibreOJ #526. 「LibreOJ β Round #4」子集 /* LibreOJ #526. 「LibreOJ β Round #4」子集 考虑一下,若两个数奇偶性相同 ...

随机推荐

  1. Mac shell笔记

    用来自动执行一些前端发布的操作. 脚本: # webReleasePath用来发布的目录,webRevisionPath是开发的目录 webReleasePath='/Users/lufeng/Doc ...

  2. ln 命令详解

    ln 命令 作用:它的功能是为某一个文件在另外一个位置建立一个同步的链接 参数:必要参数:  -b 删除,覆盖以前建立的链接  -d 允许超级用户制作目录的硬链接  -f 强制执行  -i 交互模式, ...

  3. c#加密解密源码,md5、des、rsa

    从网上找来的代码,顺手改改,用起来更方便. 配置文件 using System; using System.Collections.Generic; using System.Text; using ...

  4. webpack配置报错:invalid configuration object.webpack has been initialisted using a configuration objcet that does not match thie API schema

    最近接收了别人的项目,webpack配置总是报错如下:最后找到了解决办法,在此分享一下: 错误情况: 解决办法: 将package.json里面的colors删除掉即可

  5. 一起学习Hibernate: Hibernate01 —— Hibernate的概述与入门案例

    一 Hibernate的介绍 1 让我们从JDBC与替代它的框架Hibernate进行一下对比. 1.1 JDBC的缺点 1) 代码结构繁琐.每次书写sql语句操作数据库都得需要很多步; 2) 是面向 ...

  6. 房上的猫:了解java与学习java前的准备

    一.java 概述:  1.通常指完成某些事情的一种既定方式和过程  2.程序可以看做对一系列动作执行过程的描述  3.计算机按照某种顺序完成一系列指令的集合称为程序  4.计算机仅识别二进制低级语言 ...

  7. Debian安装fail2ban来防止扫描

    vps的root密码不要设置的太简单,这样很容易被攻破,你可以安装如下软件来降低vps被攻破的机会. 输入如下命令: apt-get install fail2ban 提示如下表示安装完成: root ...

  8. 浅析Python解释器的设计

    从现代编译器的角度看,解释器和编译器的边界已经相当的模糊.我们后面的讨论说到的编译器就是Python的解释器,没有特别说明的指的是CPython的实现. 内存管理(Memory Management) ...

  9. SpringMVC @SessionAttributes注解

    @SessionAttributes 注解只能作用到类上 @SessionAttributes(value={"user"},types={String.class}) @Sess ...

  10. 关于t00ls的挂机脚本

    0x00 前言 今天早上发现t00ls上有人发了个挂机脚本,二十四小时刷时间以及刷Tubi. 轻轻松松升级,坐收Tubi成富翁. 代码很简单,就是带上cookie每隔一段时间(比如60秒)去请求一下某 ...