LibreOJ β Round #2 E. 数论只会 GCD

题解里面说得很清楚了。
大约就是单独考虑每个数的贡献,然后看一下每个序列里有多少区间是没有这个数的,乘起来就好了。
为了处理修改我们需要每个值建一棵线段树来搞,但是窝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的更多相关文章
- 算法马拉松35 E 数论只会Gcd - 类欧几里得 - Stern-Brocot Tree - 莫比乌斯反演
题目传送门 传送门 这个官方题解除了讲了个结论,感觉啥都没说,不知道是因为我太菜了,还是因为它真的啥都没说. 如果 $x \geqslant y$,显然 gcd(x, y) 只会被调用一次. 否则考虑 ...
- 数论只会GCD。。。
一些关于GCD的代码.... #include <iostream> #include <cstdio> #include <cstring> using name ...
- LibreOJ #514. 「LibreOJ β Round #2」模拟只会猜题意
内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 给定一个长度为 nnn 的序列 AAA . 定义 f(l,r)=∑i=lrAif(l,r ...
- Loj514「LibreOJ β Round #2」模拟只会猜题意 - 模拟
注意初始化即可. #include <bits/stdc++.h> using namespace std; ],a[],t1,t2,t3,t4; int main(){ memset(a ...
- LibreOJ β Round #2 题解
LibreOJ β Round #2 题解 模拟只会猜题意 题目: 给定一个长为 \(n\) 的序列,有 \(m\) 次询问,每次问所有长度大于 \(x\) 的区间的元素和的最大值. \(1 \leq ...
- LOJ528 「LibreOJ β Round #4」求和
LOJ528 「LibreOJ β Round #4」求和 先按照最常规的思路推一波: \[\begin{aligned} &\sum_{i=1}^n\sum_{j=1}^m\mu^2(\gc ...
- [LOJ#525]「LibreOJ β Round #4」多项式
[LOJ#525]「LibreOJ β Round #4」多项式 试题描述 给定一个正整数 k,你需要寻找一个系数均为 0 到 k−1 之间的非零多项式 f(x),满足对于任意整数 x 均有 f(x) ...
- [LOJ#526]「LibreOJ β Round #4」子集
[LOJ#526]「LibreOJ β Round #4」子集 试题描述 qmqmqm有一个长为 n 的数列 a1,a2,……,an,你需要选择集合{1,2,……,n}的一个子集,使得这个子集中任意两 ...
- LibreOJ #526. 「LibreOJ β Round #4」子集
二次联通门 : LibreOJ #526. 「LibreOJ β Round #4」子集 /* LibreOJ #526. 「LibreOJ β Round #4」子集 考虑一下,若两个数奇偶性相同 ...
随机推荐
- 用户信息文件/etc/passwd,影子文件/etc/shadow,组信息文件/etc/group,组密码文件/etc/gshadow,用户管理相关文件
/etc/passwd man 5 passwd查看配置文件信息 account:password:UID:GID:GECOS:directory:shell 帐号:密码:用户ID:组ID:一般的信息 ...
- 【Uva623】500!(高精)
Description 求N! \(N \leq 1000\) Sample Input 10 30 50 100 Sample Output 10! 3628800 30! 265252859812 ...
- 浅析 SpringMVC 原理和配置.
一.原理 Spring MVC基于模型-视图-控制器(Model-View-Controller,MVC)模式实现,它能够帮你构建像Spring框架那样灵活和松耦合的Web应用程序,将请求处理的逻辑和 ...
- [置顶]
android ListView包含Checkbox滑动时状态改变
题外话: 在xamarin android的开发中基本上所有人都会遇到这个小小的坎,的确有点麻烦,当时我也折腾了好一半天,如果你能看到这篇博客,说明你和我当初也是一样的焦灼,如果你想解决掉这个小小的坎 ...
- 限制ssh远程登陆
超过十次,就添加到hosts.deny里面去 #!/bin/bash date=`date +%Y%m%d` file="/var/log/secure" max=10 if [[ ...
- 从底层角度看ASP.NET-A low-level Look at the ASP.NET...
从更低的角度 这篇文章在一个底层的角度来关注一个web请求怎样到达asp.net框架,从web服务器,通过ISAPI.看看这些后面发生了什么,让我们停止对asp.net的黑箱猜想.ASP.NET是一个 ...
- 讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(上)
前言: 好久没写文章了,最近先是重构IT恋.又重写IT恋中. Sagit框架也不断的更新,调整,现在感觉已完美了了相当的多. 今天不写教程,先简单分享一下技术内容. 1:见Block必有:#defin ...
- Sublime Text 使用教程
Sublime Text 是一款非常轻量级而且功能十分强大的编辑器,支持大量插件,深受前端开发者的喜爱.多的不说,我们直接进入正题. 1.下载 ①.官网下载地址:http://www.sublimet ...
- 【Bootstrap简单用法】
一.下载及使用 参考网站:http://www.bootcss.com/ 1.使用 BootCDN 提供的免费 CDN 加速服务(同时支持 http 和 https 协议) <!-- 最新版本的 ...
- Caused by: java.net.ConnectException: Call From master/192.168.199.130 to master:9000 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.
1:安装好hive,准备启动的时候出现下面的错误(由于hive是基于Hadoop的,所以必须先将你的集群启动起来,我就是没有启动集群,直接启动hive导致的错误): [root@master bin] ...