gym 102875A -- Array(未更新完)

gym 102875A – Array

题意:

对于一个数组a,以及数p,
q个操作
1.对于区间[l,r],里面所有数+k
2.对于区间[l,r],里面所有数 * k
3.对于区间[l,r],里面所有数变成k次幂
4.对于区间[l,r],输出里面所有数k次幂的和
5.对于区间[l,r],输出里面所有数的乘积
操作4和5的结果mod p
1<=n<=1e5
2<=p<=30
0<=a<=1e9
1<=q<=1e5
注:我们规定00 = 1

题解:

参考题解
参考题解
第一个题解的方法很妙,因为p的范围很小,所以可以直接用线段树来维护每个区间值为x的数有多少个,f数组用来记录每个数转移成了什么数
num[root<<1][f[root][i]] = num[root<<1][i]
第二个方法在计算快速幂时用欧拉降幂来优化下常数


4月26再看这题
在刷了很多树之后,有些感觉。。但感觉让自己写还是写不出
num[root][i]以root为根的子树中有多少个i
f[root][i] 表示以root为根的子树中原本的i转移成了什么数
因为p很小,所以可以将mod值和pow值(记得取模)提前求好
代码很妙,思路也很好,是个好题

代码:

#include<bits/stdc++.h>
using namespace std;
#define G if(++ip==ie)if(fread(ip=buf,1,SZ,stdin))
#define ri register int
#define iv inline void
using namespace std;
const int SZ=1<<19;
char buf[SZ],*ie=buf+SZ,*ip=ie-1;
inline int in(){G;while(*ip<'-')G;ri x=*ip&15;G;while(*ip>'-'){x*=10;x+=*ip&15;G;}return x;
}
const int N=1e5+5;
int p;
int num[N*4][35],f[N*4][35];
int tmp[35];
void push_down(int root){for(int i=0;i<p;i++){tmp[i]=num[root<<1][i];num[root<<1][i]=0;} for(int i=0;i<p;i++){num[root<<1][f[root][i]]+=tmp[i];}for(int i=0;i<p;i++){tmp[i]=num[root<<1|1][i];num[root<<1|1][i]=0;}for(int i=0;i<p;i++){num[root<<1|1][f[root][i]]+=tmp[i];}for(int i=0;i<p;i++){f[root<<1][i]=f[root][f[root<<1][i]];f[root<<1|1][i]=f[root][f[root<<1|1][i]];}for(int i=0;i<p;i++)f[root][i]=i;
}
int a[N];
void build(int l,int r,int root){for(int i=0;i<p;i++)f[root][i]=i;if(l==r){num[root][a[l]]=1;return ;}int mid=l+r>>1;build(l,mid,root<<1);build(mid+1,r,root<<1|1);for(int i=0;i<p;i++)num[root][i]=num[root<<1][i]+num[root<<1|1][i];
}
int quik(int a,int b){int ans=1;for(;b;b>>=1,a=a*a%p)if(b&1)ans=ans*a%p;return ans;}
int mod[N];
int qpow[35];
/*
num[root][i]以root为根的子树中有多少个i
f[root][i] 表示以root为根的子树中原本的i转移成了什么数 
*/
void update(int l,int r,int root,int ql,int qr,int op,int v){if(l>=ql&&r<=qr){if(op==2){//mulfor(int i=0;i<p;i++){tmp[i]=num[root][i];num[root][i]=0;}for(int i=0;i<p;i++){num[root][mod[i*v]]+=tmp[i];f[root][i]=mod[f[root][i]*v];}}else if(op==1){//addfor(int i=0;i<p;i++){tmp[i]=num[root][i];num[root][i]=0;}for(int i=0;i<p;i++){num[root][mod[(i+v)]]+=tmp[i];f[root][i]=mod[(f[root][i]+v)];}}else if(op==3){//^kfor(int i=0;i<p;i++){tmp[i]=num[root][i];num[root][i]=0;}for(int i=0;i<p;i++){num[root][qpow[i]]+=tmp[i];f[root][i]=qpow[f[root][i]];}}return ;}push_down(root);int mid=l+r>>1;if(mid>=ql)update(l,mid,root<<1,ql,qr,op,v);if(mid<qr)update(mid+1,r,root<<1|1,ql,qr,op,v);for(int i=0;i<p;i++)num[root][i]=num[root<<1][i]+num[root<<1|1][i];
}
int ans[35];
void query(int l,int r,int root,int ql,int qr){if(l>=ql&&r<=qr){for(int i=0;i<30;i++)ans[i]+=num[root][i];return ;}push_down(root);int mid=l+r>>1;if(mid>=ql)query(l,mid,root<<1,ql,qr);if(mid<qr)query(mid+1,r,root<<1|1,ql,qr);
}
int main()
{int n;n=in(),p=in();for(int i=1;i<=n;i++)a[i]=in(),a[i]%=p;for(int i=0;i<35*35;i++)mod[i]=i%p;build(1,n,1);int q;q=in();while(q--){int op,l,r,k;op=in(),l=in(),r=in(),k=in();if(op<=2)k%=p;else if(op==3){for(int i=0;i<p;i++)qpow[i]=quik(i,k);}if(op<=3)update(1,n,1,l,r,op,k);else {for(int i=0;i<p;i++)ans[i]=0;query(1,n,1,l,r);if(op==4){int sum=0;for(int i=0;i<p;i++)sum=(sum+quik(i,k)*ans[i])%p;printf("%d\n",sum);}else {int sum=1;for(int i=0;i<p;i++)sum=sum*quik(i,ans[i])%p;printf("%d\n",sum);}}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[NOI2009] 变换序列 (匈牙利最大匹配)

description … solution 我竟然一眼题&#xff01;&#xff01; 变换后的TTT数组是[0,n)[0,n)[0,n)的排列&#xff0c;变换规则也有&#xff0c;距离DDD也知道 很明显可以求出iii的可能变换对象 这不就是个最大匹配&#xff1f;&#xff1f; 无解就是匹配数量达不到nnn罢了…

YbtOJ-方格填写【插头dp】

正题 题目大意 给出nmn\times mnm的网格填着−1∼4-1\sim 4−1∼4的数字&#xff0c;对于将所有的−1-1−1填上0∼40\sim 40∼4的方案中&#xff0c;定义方案XXX的权值&#xff0c;设在相邻网格之间连线&#xff08;每对只能连一条&#xff09;使得每个网格连出去的边数恰好位…

洛谷P3607:Subsequence Reversal P(区间dp)

解析 很巧妙的题 我一开始的dp设计其实是可以的 只是我误认为它的转移需要n^2 然后尝试把它压掉一维结果越跑越远… 但一个技巧是只从相邻的状态转移 使转移变成O1 代码 #include<bits/stdc.h> using namespace std; #define ll long long const int N52; const int M…

使用 WeihanLi.Npoi 操作 CSV

Intro最近发现 csv 文件在很多情况下都在使用&#xff0c;而且经过大致了解&#xff0c;csv 格式简单&#xff0c;相比 excel 文件要小很多&#xff0c;读取也很是方便&#xff0c;而且也很通用&#xff0c;微软的 ml.net 的示例项目 用来训练模型的数据也是使用的 csv 来保存的…

种类问题

几乎所有种类问题都可以转化成两种模型之一 1.直接维护ans数组 2.统计二维数点问题 前置知识 二维静态数点 以y为第一元素&#xff0c;x为第二元素&#xff0c;原点优先级大于查询点&#xff0c;对所有点&#xff08;原点查询点&#xff09;&#xff0c;然后求 for(int i1;…

「LibreOJ Round #11」Misaka Network 与测试 (网络流跑二分图匹配)

description 研究者们想要测试 Misaka Network&#xff0c;于是他们把 Misaka Network 中的所有妹妹们召集到了一起。 现在妹妹们排成了 N行 M 列&#xff0c;有的位置没有人。现在研究者们给每一个个体的超能力进行了评定&#xff0c;一共有三个能力等级&#xff1a;Level 1 …

YbtOJ-相似子串【SA,RMQ,二分】

正题 题目大意 给出一个长度为nnn的字符串&#xff0c;两个串相似当且仅当可以通过每种字符置换使得它们相同。 qqq次询问这个字符串所有子串中和这个串中sl,rs_{l,r}sl,r​子串有多少个相似的。 1≤n≤105,1≤q≤51051\leq n\leq 10^5,1\leq q\leq 5\times 10^51≤n≤105,1≤…

CF1313D:Happy New Year(状压dp)

解析 比较妙的一道题 首先的一个技巧是把一条线段拆成左和右两个端点 顺便也就有了离散化 利用k的关键限制&#xff0c;压缩每个点覆盖线段的状态 需要动态更新每一位所对应的线段是哪条 代码 #include<bits/stdc.h> using namespace std; #define ll long long cons…

程序员修仙之路--把用户访问记录优化到极致

点击上方蓝色字体&#xff0c;关注我们菜菜呀&#xff0c;前几天做的用户空间&#xff0c;用户反映有时候比较慢呀CEO,CTO,CFO于一身的CXO是吗&#xff1f;菜菜我把你拉进用户反馈群&#xff0c;你解决一下呀CEO,CTO,CFO于一身的CXO&#xff08;完了&#xff0c;以后没清净时候…

Codeforces Round #713 (Div. 3)

Codeforces Round #713 (Div. 3) 题号题目考点ASpy Detected!签到题BAlmost Rectangle模拟题CA-B Palindrome构造DCorrupted Array构造EPermutation by Sum构造FEducation模拟暴力GShort Task筛法求因数和文章目录A题意&#xff1a;题解&#xff1a;代码&#xff1a;B题意&…

[国家集训队]航班安排 (最大费用最大流)

description 神犇航空有K架飞机&#xff0c;为了简化问题&#xff0c;我们认为每架飞机都是相同的。神犇航空的世界中有N个机场&#xff0c;以0…N-1编号&#xff0c;其中0号为基地机场&#xff0c;每天0时刻起飞机才可以从该机场起飞&#xff0c;并不晚于T时刻回到该机场。一…

CF809D-Hitchhiking in the Baltic States【FhqTreap】

正题 题目链接:https://www.luogu.com.cn/problem/CF809D 正题 题目链接:https://www.luogu.com.cn/problem/CF809D 题目大意 有一个长度为nnn的序列aaa&#xff0c;要求ai∈[li,ri]a_i\in[l_i,r_i]ai​∈[li​,ri​]&#xff0c;要求使得aaa的最长严格上升子序列最长。 1≤…

Divide by Zero 2021 and Codeforces Round #714 (Div. 2)

Divide by Zero 2021 and Codeforces Round #714 (Div. 2) 题号题目知识点AArray and PeaksBAND SequencesCAdd OneDGCD and MSTECost EquilibriumFSwapping Problem

新数据革命:开源图形化数据引擎Hawk5发布

Hawk是一款开源图形化的爬虫和数据清洗工具&#xff0c;GitHub Star超过2k&#xff0c;前几代版本介绍如下&#xff1a;Hawk3: 终于等到你: 图形化开源爬虫Hawk 3发布!Hawk2: 120项优化: 超级爬虫Hawk 2.0重磅发布&#xff01;Hawk1: 如何从互联网采集海量数据&#xff1f;租房…

11.6模拟:总结

250pts 1003010020 好的地方是没有挂分吧 T4还用假复杂度过了20 但是T2其实是可做的 关键就是对模型的转化 换个角度考虑每条边的贡献 思路就豁然开朗了 T4确实是神仙题 不太可做 qwq 加油吧OvO

[TJOI2018]智力竞赛 (匈牙利)

description 题目描述 小豆报名参加智力竞赛&#xff0c;他带上了 n个好朋友作为亲友团一块来参加比赛。 比赛规则如下&#xff1a;一共有 m道题目&#xff0c;每个人都有 1 次答题机会&#xff0c;每次答题为选择一道题目回答&#xff0c;在回答正确后&#xff0c;可以从这个…

P6944-[ICPC2018 WF]Gem Island【数学期望,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P6944 题目大意 有nnn颗不同颜色的宝石&#xff0c;每次随机选择一颗复制&#xff0c;重复ddd次&#xff0c;求最后宝石数前rrr的颜色的宝石数之和的期望值。 1≤r≤n,d≤3001\leq r\leq n,d\leq 3001≤r≤n,d≤300 解题思路…

Educational Codeforces Round 107 (Rated for Div. 2)

Educational Codeforces Round 107 (Rated for Div. 2) 题号题目知识点AReview Site签到BGCD Length思维构造CYet Another Card Deck思维DMin Cost String构造题EColorings and Dominoes思维题&#xff0c;构造题FChainwordGChips on a Board A 题意&#xff1a; 有3种评论员…

ASP.NET Core如何在ActionFilterAttribute里做依赖注入

点击蓝字关注我在ASP.NET Core里&#xff0c;我们可以使用构造函数注入很方便地对Controller&#xff0c;ViewComponent等部件做依赖注入。但是如何给过滤器ActionFilterAttribute也用上构造函数注入呢&#xff1f;问题我的博客系统里有个用来删除订阅文件缓存的ActionFilter&a…

NOIP2012:疫情控制(二分、贪心、树上倍增)

解析 二分的单调性较为明显&#xff0c;一路推导下去的性质都不算太难想&#xff0c;正解的思路还是不难想到的 但从头到尾都实现很考验思维的严密性和代码能力 然后我就双重被考验挂了qwq 第一交的时候一个地方把倍增的dis数组写成pl&#xff0c;判断封口也有问题… 但竟然有…