Problem E E 、 小 花梨 的数组
时间限制:1000ms 空间限制:512MB
Description
小花梨得到了一个长度为?的数组?,现在要对它进行三种操作:
⚫ 1 ? ] ∗
⚫ 2 ? ? 对所有的? ∈ [?,?],?[?] = ?[?] / ????????(?[?])
⚫ 3 ? 求?[?]的值
????????(?) = {
1 (? = 1)
?的最小素因子(? ≥ 2)
现在给出初始数组?,对其进行?次操作,对于第三种操作输出结果。
Input
第一两个正整数?,?,表示数组的长度以及操作次数(1 ≤ ?,? ≤ 100000)
第二行输入?个正整数表示数组?(1 ≤ ? ? ≤ 1000000)
接下来?行表示?次操作,每行输入格式为"1 ? ?"或者"2 ? ?",或者"3 ?",对应上述三种操作。
1 ≤ ?,?,? ≤ ?,? ≤ ?
Output
对于第三种操作输出答案即可,答案对10 9 + 7进行取模。
Example
Sample Input Sample Output
5 8
1 2 3 4 5
1 2 4
3 2
3 3
2 2 5
3 2
3 5
1 5 5
3 5
4
9
2
1
1

题意:

思路:

读入的时候用唯一分解定理将a[i]分解为每一个质因子放入一个堆中。

我们知道一个数乘以它的最小的质因子后,它的最小的质因子不会改变。

如果先乘后除以它的最小的质因子,那么就是除以抵消一次乘法。那么我们可以标记一个数当前需要操作1多少次laze1,而不去实际更新数值,那么如果需要操作2的时候,laze1>0,那么影响只是laze1--,否则就是 需要执行的操作2次数laze2++.

我们用线段树来处理区间操作的问题,

那么我们再来分析一下单点询问是,该如何得到答案,我们知道,如果一个点的laze2有数值,laze2也有数值,那么这些除法操作一定在乘法操作之前,至于为什么,看上面laze变化的讲解。所以我们可以先暴力除掉需要除掉的数,当数值等于1的时候停止。(因为没有意义,又因为唯一分解定理可以知道一个小于等于1e6的数最多被除以十几次而已),除以之后得到的剩余数值a[i] *它的最小质因子的laze1次幂就是当前的a[i]数值。

线段树的pushdown 同样根据上面的性质和优先级进行处理。

细节见代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
ll powmod(ll a, ll b, ll MOD) {ll ans = 1; while (b) {if (b % 2) { ans = ans * a % MOD; } a = a * a % MOD; b /= 2;} return ans;}
inline void getInt(int *p);
const int maxn = 1000010;
const int inf = 0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
// const int maxn = 1e7+50;
bool noprime[maxn + 50];
vector <int> p;
int getPrime()
{// 华丽的初始化memset(noprime, false, sizeof(noprime));p.clear();int m = (int)sqrt(maxn + 0.5);// 优化的埃筛for (int i = 2; i <= m; i++) {if (!noprime[i]) {for (int j = i * i; j <= maxn; j += i) {noprime[j] = true;}}}// 把素数加到vector里for (int i = 2; i <= maxn; i++) {if (!noprime[i]) {p.push_back(i);}}//返回vector的大小return p.size();}
ll pf[105][2];// 0 -> value 1->count
const int N = 1e5 + 10;
priority_queue<int, vector<int>, greater<int> > q[N];
const ll mod = 1e9 + 7;void getPrifac( ll n, int len, int id)
{int pos = 0;for (int i = 0; 1ll * p[i]*p[i] <= n && i < len; i++) {if ( n % p[i] == 0) {// 算质因数的幂数while (n % p[i] == 0) {q[id].push(p[i]);n /= p[i];}// q[id].push(temp);}}if ( n > 1) {// pf[++pos][0] = n;// pf[pos][1]=1;q[id].push((n));}// return pos; // 优美的返回有多少个质因数// 1~pos
}
int n;
ll a[N];
struct node {int l, r;int laze1;int laze2;
} segment_tree[N << 2];void build(int rt, int l, int r)
{segment_tree[rt].l = l;segment_tree[rt].r = r;segment_tree[rt].laze2 = 0;segment_tree[rt].laze1 = 0;if (l == r) {return ;}int mid = (l + r) >> 1;build(rt << 1, l, mid);build(rt << 1 | 1, mid + 1, r);
}
void pushdown(int rt)
{int x = min(segment_tree[rt].laze2, segment_tree[rt << 1].laze1);segment_tree[rt << 1].laze1 -= x;segment_tree[rt << 1].laze2 += segment_tree[rt].laze2 - x;segment_tree[rt << 1].laze1 += segment_tree[rt].laze1;x = min(segment_tree[rt].laze2, segment_tree[rt << 1 | 1].laze1);segment_tree[rt << 1 | 1].laze1 -= x;segment_tree[rt << 1 | 1].laze2 += segment_tree[rt].laze2 - x;segment_tree[rt << 1 | 1].laze1 += segment_tree[rt].laze1;segment_tree[rt].laze1 = segment_tree[rt].laze2 = 0;}
void update1(int rt, int l, int r)
{if (segment_tree[rt].l >= l && segment_tree[rt].r <= r) {segment_tree[rt].laze1++;} else {pushdown(rt);int mid = (segment_tree[rt].l + segment_tree[rt].r) >> 1;if (l <= mid) {update1(rt << 1, l, r);}if (r > mid) {update1(rt << 1 | 1, l, r);}}
}
void update2(int rt, int l, int r)
{if (segment_tree[rt].l >= l && segment_tree[rt].r <= r) {if (segment_tree[rt].laze1) {segment_tree[rt].laze1--;} else {segment_tree[rt].laze2++;}} else {pushdown(rt);int mid = (segment_tree[rt].l + segment_tree[rt].r) >> 1;if (l <= mid) {update2(rt << 1, l, r);}if (r > mid) {update2(rt << 1 | 1, l, r);}}
}ll ask(int rt, int id)
{if (segment_tree[rt].l == segment_tree[rt].r && segment_tree[rt].r == id) {while (segment_tree[rt].laze2 && a[id] > 1 && q[id].size()) {segment_tree[rt].laze2--;a[id] /= q[id].top();q[id].pop();}ll x = 1ll;if (q[id].size()) {x = q[id].top();}return (powmod(x, segment_tree[rt].laze1, mod) * a[id]) % mod;} else {pushdown(rt);int mid = (segment_tree[rt].r + segment_tree[rt].l) >> 1;if (id <= mid) {return ask(rt << 1, id);} else {return ask(rt << 1 | 1, id);}}
}
int main()
{//freopen("D:\\code\\text\\input.txt","r",stdin);//freopen("D:\\code\\text\\output.txt","w",stdout);int m;int len = getPrime();scanf("%d %d", &n, &m);repd(i, 1, n) {scanf("%lld", &a[i]);getPrifac(a[i], len, i);}build(1, 1, n);int op;while (m--) {scanf("%d", &op);if (op == 1) {int l, r;scanf("%d %d", &l, &r);update1(1, l, r);} else if (op == 2) {int l, r;scanf("%d %d", &l, &r);update2(1, l, r);} else {int x;scanf("%d", &x);printf("%lld\n", ask(1, x) );}}return 0;
}inline void getInt(int *p)
{char ch;do {ch = getchar();} while (ch == ' ' || ch == '\n');if (ch == '-') {*p = -(getchar() - '0');while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 - ch + '0';}} else {*p = ch - '0';while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 + ch - '0';}}
}

转载于:https://www.cnblogs.com/qieqiemin/p/11469651.html

美登杯”上海市高校大学生程序设计邀请赛 Problem E 、 小 花梨 的数组 (线段树)...相关推荐

  1. “美登杯”上海市高校大学生程序设计邀请赛 (华东理工大学)E. 小花梨的数组

    题目链接:https://acm.ecnu.edu.cn/contest/173/problem/E/ 题意:Description 小花梨得到了一个长度为?的数组?,现在要对它进行三种操作: ⚫ 1 ...

  2. “美登杯”上海市高校大学生程序设计邀请赛 **D. 小花梨的取石子游戏**

    "美登杯"上海市高校大学生程序设计邀请赛 (华东理工大学) D. 小花梨的取石子游戏 Description 小花梨有?堆石子,第?堆石子数量为??,?堆石子顺时针编号为1 − ? ...

  3. “美登杯”上海市高校大学生程序设计邀请赛 (华东理工大学)

    Problem A 小花梨的字符串 https://acm.ecnu.edu.cn/contest/173/problem/A/ 题意:对区间子字符串排列,使得满足条件,求排列最长. 题解: C++版 ...

  4. 小花梨判连通(DFS或BFS或并查集+vector+map)——“美登杯”上海市高校大学生程序设计邀请赛 (华东理工大学)

    (https://acm.ecnu.edu.cn/contest/173/problem/C/) 题目大意: 小花梨给出?个点,让?位同学对这?个点任意添加无向边,构成?张图.小花梨想知道对于每个点? ...

  5. “美登杯”上海市高校大学生程序设计邀请赛(华东理工大学) 小花梨的取石子游戏(博弈)

    Description 小花梨有?堆石子,第?堆石子数量为??,?堆石子顺时针编号为1 − ?(如图) . 游戏将进行?轮,每轮游戏单独进行,互不干扰,每轮初始时第?堆石子数目为??. 第?轮从编号为 ...

  6. “美登杯”上海市高校大学生程序设计 C. 小花梨判连通 (并查集+map)

    Problem C C . 小 花梨 判连通 时间限制:2000ms 空间限制:512MB Description 小花梨给出?个点,让?位同学对这?个点任意添加无向边,构成?张图.小花梨想知道对于 ...

  7. “美登杯”上海市高校大学生程序设计赛B. 小花梨的三角形(模拟,实现)

    题目链接:https://acm.ecnu.edu.cn/contest/173/problem/B/#report9 Problem B B . 小 花梨 的 三角形 时间限制:1000ms 空间限 ...

  8. 上海市高校大学生程序设计邀请赛 C:小花梨判连通

    上海市高校大学生程序设计邀请赛 C:小花梨判连通 Problem C.小花梨判连通 时间限制:2000ms 空间限制:512MB Description 小花梨给出?个点,让?位同学对这?个点任意添加 ...

  9. 字节跳动杯2018中国大学生程序设计竞赛-女生专场题解

    以下所有AC题解程序来自"仙客传奇"团队. A. 口算训练 题解链接: ABDFHK "字节跳动杯"2018中国大学生程序设计竞赛-女生专场 B. 缺失的数据范 ...

最新文章

  1. uber_这就是我本可以免费骑Uber的方式
  2. 解决jre生成错误的问题
  3. 宇宙第一 IDE Visual Studio 2019 正式发布
  4. 科大星云诗社动态20210215
  5. 8 cocos2dx添加场景切换效果,控制场景切换彻底完成之后再执行动画
  6. 【工作感悟】成功入职阿里月薪45K
  7. 无盘服务器 机械盘,Win7启动速度研究,同样的PC配置,机械盘、固态盘、无盘网络启动速度为何不同?...
  8. python数据科学实践 常象宇_Python数据科学实践
  9. java练习(数组工具类的封装)[目前写过最长的代码,虽然不难]
  10. 华为机试HJ26:字符串排序
  11. java项目介绍_3月Github最热门的10个Java开源项目
  12. 21个实用便利的PHP代码
  13. 光盘安装服务器找不到硬盘,安装系统找不到硬盘怎么办实测解决
  14. 关于宁盾平台Spring框架RCE 0day漏洞修复的公告
  15. linux怎么sftp传文件,Linux 如何使用SFTP命令传输文件
  16. RGB接口屏和SPI接口屏的引脚
  17. 京东校招java工程师_2017年京东校招Java研发笔试编程第1题
  18. java喜好设置_Java中使用Preferences 的 API设置用户偏好
  19. mongoshake2.2 Oplog Tailer initialize failed
  20. 百度、谷歌、雅虎网站地图提交地址

热门文章

  1. CRM_REPORT_RF_CHECK_AUTHORITY call CRM_REPORT_RF_AUTH_OBJ_ORD_LP
  2. TCP请求发送和接收,如果接收端终止,发送端继续发送会出什么错
  3. 来自Yang Terry的关于SAP CRM One Order事件回调机制的分享
  4. SAP CRM产品主数据的附件信息在搜索时就已经从后台被读取了
  5. 使用Excel消费SAP C4C的OData service
  6. 电脑卡顿不流畅怎么解决_电脑用久了卡怎么办?学会这四招解决你的电脑卡顿问题...
  7. 2018广技师C语言专插本试题,专插本2016广技师C语言专插本考试大纲已核对.doc
  8. 在html中超链接_4.html5中超链接
  9. 大数据中常见的端口号 总结汇总大全(最新)
  10. latex 小于_一份菜鸡的Latex课堂作业works--(ii)