传送门

题解

题解里面说得很清楚了。

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

为了处理修改我们需要每个值建一棵线段树来搞,但是窝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. iOS开发--SQLite重要框架FMDB的使用

    什么是FMDB: FMDB是一个和iOS的SQLite数据库操作相关的第三方框架.主要把C语言操作数据库的代码用OC进行了封装.使用者只需调用该框架的API就能用来创建并连接数据库,创建表,查询等. ...

  2. SSH框架完全整合

    大三学期渐末,事情也挺多的,上周就开始着手整合SSH框架,到现在才真正的完成,过程中碰到了许多小问题(小问题大折腾,哭脸.jpg).本着善始善终的原则,最终把它给完成了. 本篇文章就在: win7 6 ...

  3. scala写算法-用小根堆解决topK

    topK问题是指从大量数据中获取最大(或最小)的k个数,比如从全校学生中寻找成绩最高的500名学生等等. 本问题可采用小根堆解决.思路是先把源数据中的前k个数放入堆中,然后构建堆,使其保持堆序(可以简 ...

  4. bzoj 4345: [POI2016]Korale

    Description 有n个带标号的珠子,第i个珠子的价值为a[i].现在你可以选择若干个珠子组成项链(也可以一个都不选),项链的价值为所有珠子的价值和.现在给所有可能的项链排序,先按权值从小到大排 ...

  5. Ubuntu中启用ssh服务---转载

    ssh程序分为有客户端程序openssh-client和服务端程序openssh-server.如果需要ssh登陆到别的电脑,需要安装openssh-client,该程序Ubuntu是默认安装的.而如 ...

  6. Concurrency Is Not Parallelism (Rob pike)

    Rob pike发表过一个有名的演讲<Concurrency is not parallelism>(https://blog.golang.org/concurrency-is-not- ...

  7. JMeter测试HTTPS

    HTTP和HTTPS测试时稍有不同,HTTPS需要加载证书,端口也不一样,操作如下:  1)下载被测网站证书导入 见图为流程: 2)使用JMeter自带的证书 ApacheJMeterTemporar ...

  8. tomcat中使用mysql连接池的配置

    1.下载相应的jar包,添加到工程中 需要下载的包主要有commons-pool2-2.2 commons-dbcp2-2.0.1-src commons-dbcp2-2.0.1  commons-c ...

  9. Android 执行 adb shell 命令

    Android 执行Adb shell 命令大多需要root权限,Android自带的Runtime. getRuntime().exec()容易出错,在网上找到了一个执行adb shell命令的类 ...

  10. ${param.name}和${name}的区别

    ${param.name} == request.getParam("name") ${name} == request.getAttribute("name" ...