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=0;read_ca=getchar();read_f=1;while(read_ca<'0'||read_ca>'9') {if (read_ca=='-') read_f=-1;read_ca=getchar();}while(read_ca>='0'&&read_ca<='9') read_p=read_p*10+read_ca-48,read_ca=getchar();return read_p*read_f; } const int MOD=19260817; struct na{int p,*st;}Y[MN<<1]; bool operator < (na a,na b){return a.p<b.p;} inline void M(int &x){while(x>=MOD)x-=MOD;while(x<0)x+=MOD;} int n,m,L[MN],a[MN],ro[MN],RO[MN*40],ls[MN*40],rs[MN*40],LS[MN*100],RS[MN*100],S[MN*100],NUM,x[MN],y[MN],z[MN],T=0,num=0,_num=0,mmh[MN],MMH=1,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>>1;if (pos<=mid) ADD(LS[p],l,mid,pos,v);else ADD(RS[p],mid+1,r,pos,v); } void add(int &p,int l,int r,int pos,int x,int v){if (!p) p=++num;ADD(RO[p],1,T,x,v);if (l==r) return;int mid=l+r>>1;if (pos<=mid) add(ls[p],l,mid,pos,x,v);else add(rs[p],mid+1,r,pos,x,v); } int ASK(int p,int l,int r,int k){if (!p) return 0;if (l==r) return S[p];int mid=l+r>>1;return k<=mid?ASK(LS[p],l,mid,k):ASK(RS[p],mid+1,r,k); } int p_ask(int p,int l,int r,int pos,int x){if (ASK(RO[p],1,T,x)==0) return -1;if (pos<=l) return -1;if (l==r) return l;int mid=l+r>>1;int w=p_ask(rs[p],mid+1,r,pos,x);if (w!=-1) 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],1,T,x)==0) return -1;if (pos>=r) return -1;if (l==r) return l;int mid=l+r>>1;int w=s_ask(ls[p],l,mid,pos,x);if (w!=-1) return w;return s_ask(rs[p],mid+1,r,pos,x); } inline int mi(int x,int y){int mmh=1;while (y){if (y&1) mmh=1LL*mmh*x%MOD;x=1LL*x*x%MOD;y>>=1;}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-1])*(L[x]-L[x-1]+1)/2%MOD;if (!ma[mpii(x,v)]) ze[v]--;else mmh[v]=1LL*mmh[v]*mi(ma[mpii(x,v)],MOD-2)%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=1;i<=n;i++) L[i]=L[i-1]+read();for (int i=1;i<=n;i++){for (int j=L[i-1];j<L[i];j++) Y[++NUM].p=a[j]=read(),Y[NUM].st=&a[j];MMH=1LL*(L[i]-L[i-1])*(L[i]-L[i-1]+1)/2%MOD*MMH%MOD;}for (int i=1;i<=m;i++) x[i]=read(),y[i]=read(),Y[++NUM].p=z[i]=read(),Y[NUM].st=&z[i];sort(Y+1,Y+1+NUM);for (int i=1;i<=NUM;i++) T+=i==1||Y[i].p!=Y[i-1].p,*Y[i].st=T;for (int i=1;i<=T;i++) mmh[i]=MMH,ze[i]=0;MMH=1LL*MMH*T%MOD;for (int i=1;i<=n;i++)for (int j=L[i-1];j<L[i];j++)add(ro[i],1,L[i]-L[i-1],j-L[i-1]+1,a[j],1);for (int i=1;i<=n;i++){for (int j=L[i-1];j<L[i];j++)if (!t[a[j]]) w[j]=(1LL*(j-L[i-1]+1)*(j-L[i-1])>>1)%MOD,t[a[j]]=j+1;else w[j]=((1LL*(j+1-t[a[j]])*(j-t[a[j]])>>1)+w[t[a[j]]-1])%MOD,t[a[j]]=j+1;int s=mi(1LL*(L[i]-L[i-1])*(L[i]-L[i-1]+1)/2%MOD,MOD-2);for (int j=L[i]-1;j>=L[i-1];j--) if (t[a[j]]){M(w[j]+=1LL*(L[i]-t[a[j]]+1)*(L[i]-t[a[j]])/2%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]]=0;}}for (int i=1;i<=T;i++) if (!ze[i]) M(MMH-=mmh[i]);printf("%d\n",MMH);for (int i=1;i<=m;i++){int pos=L[x[i]-1]+y[i]-1;del(x[i],a[pos]);del(x[i],z[i]);int l=p_ask(ro[x[i]],1,L[x[i]]-L[x[i]-1],y[i],a[pos]),r=s_ask(ro[x[i]],1,L[x[i]]-L[x[i]-1],y[i],a[pos]);if (l==-1) l=0;if (r==-1) r=L[x[i]]-L[x[i]-1]+1;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]],1,L[x[i]]-L[x[i]-1],y[i],z[i]),r=s_ask(ro[x[i]],1,L[x[i]]-L[x[i]-1],y[i],z[i]);if (l==-1) l=0;if (r==-1) r=L[x[i]]-L[x[i]-1]+1;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]],1,L[x[i]]-L[x[i]-1],y[i],a[pos],-1);add(ro[x[i]],1,L[x[i]]-L[x[i]-1],y[i],z[i],1);a[pos]=z[i];printf("%d\n",MMH);} }
View Code
转载于:https://www.cnblogs.com/Enceladus/p/7115321.html
LibreOJ β Round #2 E. 数论只会 GCD相关推荐
- “东信杯”广西大学第一届程序设计竞赛(同步赛)D、数论只会GCD 【博弈 分类讨论】...
传送门:https://ac.nowcoder.com/acm/contest/283/D 题目描述 小西买了一堆肥宅快乐水和肥宅快乐茶,准备和室友比谁更肥宅. 快乐水有A瓶,快乐茶B瓶. 小西和室友 ...
- libreoj #514. 「LibreOJ β Round #2」模拟只会猜题意
给定一个长度为 nnn 的序列 AAA . 定义 f(l,r)=∑i=lrAif(l,r)=\sum_{i=l}^{r} A_{i}f(l,r)=∑i=lrAi. 询问 mmm 次,每次 ...
- #530. 「LibreOJ β Round #5」最小倍数 二分 + 数论
传送门 文章目录 题意: 思路: 题意: 思路: 本来想刷数位dpdpdp,无意间碰到了这个题来水水. 我们知道n!n!n!中质因子ppp的个数为∑i=1npi\sum_{i=1} \frac{n}{ ...
- 「LibreOJ Round #11」Misaka Network 与求和(杜教筛 + Min_25)
#572. 「LibreOJ Round #11」Misaka Network 与求和 推式子 ∑i=1n∑j=1nf(gcd(i,j))k∑d=1nf(d)k∑i=1nd∑j=1nd[gcd(i,j ...
- [LOJ #521]「LibreOJ β Round #3」绯色 IOI(抵达)(结论)
#521. 「LibreOJ β Round #3」绯色 IOI(抵达) description solution 因为点的庇护所不能为自身,题目背景在树上,有结论一定是两个相邻点互为庇护所 所以树一 ...
- LibreOJ545. 「LibreOJ β Round #7」小埋与游乐场【网络流】
545. 「LibreOJ β Round #7」小埋与游乐场 [题目描述] 传送门 [题解] 网络流,我们发现lowbit之后相同的点连出的边是相同的,所以可以缩点. [代码如下] #include ...
- [LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机)
[LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机) 试题描述 IOI 的比赛开始了.Jsp 和 Rlc 坐在一个角落,这时他们听到了一个异样的声音 -- 接着他们发现自己收 ...
- Loj#572. 「LibreOJ Round #11」Misaka Network 与求和
题目 有生之年我竟然能\(A\) 这个题求的是这个 \[\sum_{i=1}^n\sum_{j=1}^nf(gcd(i,j))^k\] \(f(i)\)定义为\(i\)的次大质因子,其中\(f(p)= ...
- [LOJ]#572. 「LibreOJ Round #11」Misaka Network 与求和 min_25筛+杜教筛
Solution 推一下式子,容易得到一个线性做法:∑d=1nfk(d)((2∑i=1⌊ni⌋φ(i))−1)\sum_{d=1}^nf^k(d)((2\sum_{i=1}^{\lfloor{n\ov ...
- LibreOJ β Round #2
这套题目真的不错,难度区分还是挺好的,后面的题目恕我愚笨,搞不定. 先看看前面几个吧--- A. 模拟只会猜题意 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测 ...
最新文章
- 阿里云智能 AIoT 首席科学家丁险峰:阿里全面进军IoT这一年 | 问底中国IT技术演进...
- 【技术干货】卷积神经网络中十大拍案叫绝的操作
- Codeforces 815 B Karen and Test 杨辉三角 组合数学
- python使用方法-六、python 方法的使用
- 自己动手构建iSCSI磁盘阵列
- 动态路由选择协议简介
- Facebook 约十亿美元收购脑机技术公司,助攻AR研发;苹果宣布新款 Mac Pro 在美国生产;谷歌称已实现量子霸权…...
- v html是双向绑定吗,vue自定v-model实现表单数据双向绑定问题
- 开源 免费 java CMS - FreeCMS1.5 标签 visit
- Freemodbus 1.5
- Go语言中的结构体 (struct)
- Zerotier Moon服务器配置
- 屏幕录像专家android,屏幕录像专家
- Tera Term 工具的使用
- android获取版本信息、屏幕信息和设备编号
- 学习Photoshop的一些网站以及找素材的网站
- android studio linux 字体,Android Studio代码字体模糊解决方法
- python的openpyxl模块合并单元格,浅谈openpyxl库,遇到批量合并单元格的问题
- C++ 内联函数/宏/outo/for/nullptr
- 小程序获取oppenid时返回40125或者40029
热门文章
- php是哪种化学药剂,常用化学试剂 英文缩写一览表
- 摆动式运输机运动分析_三河燕郊人民医院设备资讯(第28期):SW—3702精子分析仪...
- Python 中的 if __name__ == '__main__'
- Linux shell 上机编程-----习题
- CentOS 6.5下安装MySQL后重置root密码方法
- 使用css3背景渐变中的透明度来设置不同颜色的背景渐变
- Hadoop MapReduce篇
- 使用jQuery的load()进行页面模块化加载
- [转]UML建模的要点总结
- SOME/IP不等同于SOA,CommonAPI-RPC通信和vsomeip基于消息通信