传送门

题解

题解里面说得很清楚了。

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

为了处理修改我们需要每个值建一棵线段树来搞,但是窝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. 【java】io流之字节输出流:java.io.OutputStream类及子类java.io.FileOutputStream

    package 文件操作; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; impo ...

  2. bzoj 3242: [Noi2013]快餐店

    Description 小T打算在城市C开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小T希望快餐店的地址选在离最远的顾客距离最近的地方. 快餐店的顾客分布在城 ...

  3. php实现socket推送技术

    在socket出现之前已经有ajax定时请求.长轮询等方案,但都不能满足需求,socket就应用而生了. socket基本函数socket 总结下常用的socket函数 服务端: socket_cre ...

  4. ecsmart的开发经历

    ecsmart是ecshop的产品之一,是2015年发布的一套系统.关于它的介绍请到官网去了解,也可以百度 “商之翼” “ecsmart” 1.ecsmart分别在pc.mobile.app三个方面都 ...

  5. JavaScript中的数组对象遍历、读写、排序等操作

    以百度前端技术学院的js任务三为例,复习一下关于js数组的几个点 题目 <!DOCTYPE> <html> <head> <meta charset=&quo ...

  6. php示例的错误记录

    最近几天在测试php的mvc,从网上找到几个示例. 先学习这一篇,http://www.cnblogs.com/q1ng/p/4529496.html 标题是  PHP的MVC框架 深入解析,其实是最 ...

  7. DCL的失效:现实与初衷的背离

    最近看了Brian Goetz写的一篇有关DCL的文章:Double-checked locking: Clever, but broken.( 2001年发表于JavaWorld上) 这篇文章讲述了 ...

  8. SQL Server授权购买简单介绍

    SQL Server授权购买简单介绍 之前有同事问我,使用盗版序列号的SQL Server到底有没有性能限制,之前本人一直没有深入研究过,后来经过一番资料搜集和查证,汇总成这篇文章 微软的SQL Se ...

  9. Gulp-静态网页模块化

    前言: 在做纯静态页面开发的过程中,难免会遇到一些的尴尬问题.比如:整套代码有50个页面,其中有40个页面顶部和底部模块相同.那么同样的两段代码我们复制了40遍(最难受的方法).然后,这个问题就这样解 ...

  10. C语言学生管理系统(增进版)

    在原版上进行改进,主要改进的功能有. 1.利用atof:将字符串转换为浮点型: 利用atoi:将字符串转换为整型: 原文地址:http://www.cnblogs.com/sddai/p/577412 ...