B

  • 这是一道很好的线段树练习题,思路很清晰,查询区间进制最小值所对应的进制显然应该是区间最大值+1,所以使用一个线段树维护区间最大值;那么如何维护区间进制呢?让另外一颗线段树记录数字信息即可
  • 之前没做过区间进制的问题,记录一下
#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1e5 + 100;
const int MOD = 1e9 + 7;
string s;
struct Tree_Max{int l;int r;int MAX;
}tr_max[N << 2];
void Push_UP_Max(int u){tr_max[u].MAX = max(tr_max[u << 1].MAX, tr_max[u << 1 | 1].MAX);
}
void Build_Max_Tree(int u, int l, int r){if(l == r){tr_max[u] = {l, r, s[l] - '0'};}else{tr_max[u] = {l, r};int mid = (r - l >> 1) + l;Build_Max_Tree(u << 1, l, mid);Build_Max_Tree(u << 1 | 1, mid + 1, r);Push_UP_Max(u);}
}
void modify_Max(int u, int x, int y){if(tr_max[u].l == tr_max[u].r){tr_max[u].MAX = y;}else{int mid = (tr_max[u].l + tr_max[u].r >> 1);if(x <= mid){modify_Max(u << 1, x, y);}else{modify_Max(u << 1 | 1, x, y);}Push_UP_Max(u);}
}
int query_max(int u, int l, int r){if(tr_max[u].l >= l && tr_max[u].r <= r){return tr_max[u].MAX;}else{int mid = (tr_max[u].l + tr_max[u].r >> 1);int ans = -1;if(l <= mid){ans = max(ans, query_max(u << 1, l, r));}if(mid < r){ans = max(ans, query_max(u << 1 | 1, l, r));}return ans;}
}
int fastpow(ll base, int power){//注意爆ll,以后快速幂就统一long longll ans = 1;while(power > 0){if(power & 1) ans = ans * base % MOD;base = base * base % MOD;power >>= 1;}return (int)ans;
}
struct Tree_Base{int l;int r;int val;
}tr_Base[N << 2][11];// 2 - 10进制
void Push_Up_Base(int u, int k){int sz = tr_Base[u << 1 | 1][k].r - tr_Base[u << 1 | 1][k].l + 1;//注意这里是右子树tr_Base[u][k].val = (1ll * tr_Base[u << 1][k].val * fastpow(k, sz) % MOD + tr_Base[u << 1 | 1][k].val) % MOD;
}
void Build_Base_Tree(int u, int l, int r, int k){//建立k进制的线段树if(l == r){tr_Base[u][k] = {l, r, s[l] - '0'};}else{tr_Base[u][k] = {l, r};int mid = (r - l >> 1) + l;Build_Base_Tree(u << 1, l, mid, k);Build_Base_Tree(u << 1 | 1, mid + 1, r, k);Push_Up_Base(u, k);}
}
void modify_Base(int u, int x, int y, int k){if(tr_Base[u][k].l == tr_Base[u][k].r){tr_Base[u][k].val = y;}else{int mid = (tr_Base[u][k].l + tr_Base[u][k].r >> 1);if(x <= mid) modify_Base(u << 1, x, y, k);else modify_Base(u << 1 | 1, x, y, k);Push_Up_Base(u, k);}
}
int query_Base(int u, int l, int r, int k){if(tr_Base[u][k].l >= l && tr_Base[u][k].r <= r){return tr_Base[u][k].val;}else{int mid = tr_Base[u][k].l + tr_Base[u][k].r >> 1;ll ans = 0;if(l <= mid){ans += query_Base(u << 1, l, r, k);}ans *= fastpow(k, min(r, tr_Base[u][k].r) - mid);// !!!注意这里范围ans %= MOD;if(mid < r){ans += query_Base(u << 1 | 1, l, r, k);}ans %= MOD;return (int)ans;}
}
int main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n, q;cin >> n >> q;s.resize(n + 1);for(int i=1;i<=n;i++) cin >> s[i];Build_Max_Tree(1, 1, n);for(int i=2;i<=10;i++){Build_Base_Tree(1, 1, n, i);}while(q--){int opt, x, y;cin >> opt >> x >> y;if(opt == 1){modify_Max(1, x, y);for(int i=2;i<=10;i++){modify_Base(1, x, y, i);}}else{cout << query_Base(1, x, y, max(2, query_max(1, x, y) + 1)) << '\n';}}return 0;
}

G

定义子序列权值为子序列最小值和最大值的乘积,问一个数组中所有非空子序列的权值乘积是多少,取模

  • 理解题解中所讲的一个长度为kkk的区间,中间的数对答案的贡献是2k−22^{k-2}2k−2,但是此题有更好的办法
  • 考虑枚举每一个数,当然首先把它们从小到大排序,设这个数是第iii个,iii从0开始,那么因为已经排好序了,那么它能够对答案造成多少贡献呢?因为贡献一定是这个数是子序列里面的最大值或者是最小值,如果成立为最小值,那么子序列的其他数一定是在这个数后面的某些数或者没有,它后面一共有2n−i−12^{n-i-1}2n−i−1个数,那么根据一个长度为nnn的数组的子序列个数一共是2n2^{n}2n(包括空序列),所以这个时候这个数对答案的贡献是2n−i−12^{n-i-1}2n−i−1;同理可得当这个数成立为最大值的时候,对答案的贡献是2i2^{i}2i,所以答案应该是∑i=0n−1a[i]2i+2n−i−1\sum_{i=0}^{n-1} a[i]^{2^{i}+2^{n-i-1}}∑i=0n−1​a[i]2i+2n−i−1,当然首先要欧拉降幂降指数,因为模数是一个质数,所以欧拉函数值就是MOD−1MOD-1MOD−1
  • 看jiangly代码突然悟到了
#include <bits/stdc++.h>using namespace std;typedef long long ll;const int MOD = 1e9 + 7;
ll fastpow(ll base, ll power, ll MOD){ll ans = 1;while(power){if(power & 1) ans = ans * base % MOD;base = base * base % MOD;power >>= 1;}return ans;
}
int main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n;cin >> n;vector<ll> POW(n);POW[0] = 1ll;for(int i=1;i<n;i++){POW[i] = POW[i - 1] * 2 % (MOD - 1);}ll ans = 1;vector<int> a(n);for(auto &i : a) cin >> i;sort(a.begin(), a.end());for(int i=0;i<n;i++){ans *= fastpow(a[i], POW[i] + POW[n - i - 1], MOD);ans %= MOD;}cout << ans;return 0;
}

2022牛客寒假算法基础集训营4 B、 G两题相关推荐

  1. 2022牛客寒假算法基础集训营6 签到题5题(附基础集训营4-6签到题总结)

    1.I-A+B问题 模拟,类似于高精度,竖式运算 #include<bits/stdc++.h> using namespace std; typedef long long LL; in ...

  2. 2022牛客寒假算法基础集训营3 签到题7题(附基础集训营1-3签到题总结)

    1.A-智乃的Hello XXXX 签到 #include<bits/stdc++.h> using namespace std; int main(){cout<<" ...

  3. 2022牛客寒假算法基础集训营

    2022牛客寒假算法基础集训营1 C-Baby's first attempt on CPU D-牛牛做数论 已知欧拉函数 ϕ ( x ) \phi(x) ϕ(x)是满足 1 ≤ y ≤ x 1\le ...

  4. 2022牛客寒假算法基础集训营1 L E J H F C D A I (9/13)

    2022牛客寒假算法基础集训营1 L E J H F C D A I (9/13) L 牛牛学走路 思路: 模拟,用一个 M A X MAX MAX存储. 参考代码: #include<bits ...

  5. 2023牛客寒假算法基础集训营5(通过ABCDHIKL) I题有详解(F已补)

    其他题待补中-- 链接:2023牛客寒假算法基础集训营5 简单题 A 小沙の好客(贪心,前缀和,二分) 题意思路 给定 n n n个商品的价值, q q q次询问,每次询问 k , x k, x k, ...

  6. 2022牛客寒假算法基础集训营1 ——H 牛牛看云

    链接:登录-专业IT笔试面试备考平台_牛客网 来源:牛客网 就像罗夏墨迹测试一样,同一片形状的云在不同人的眼中会看起来像各种各样不同的东西. 例如,现在天上飘过了一片长条状的云彩,hina说这片云长得 ...

  7. 2022牛客寒假算法基础集训营4 签到题7题

    1.E-真假签到题 不难发现,或者随便枚举一下,可以得到f(n)=n的结论 #include<bits/stdc++.h> typedef long long LL; using name ...

  8. 2022牛客寒假算法基础集训营2 签到题7题

    1.C 小沙的杀球 如果你能够杀球但不杀球,虽然回复了体力,但你后续可能会没有机会继续杀球,并且杀球次数相同,那么回复的体力是相同的,所以在同等条件下,我们应该尽可能多的杀球. 不开long long ...

  9. 2022牛客寒假算法基础集训营1 签到题7题

    1.L.牛牛学走路 恭喜你 签到成功 #include<bits/stdc++.h> using namespace std; int main(){int T; cin>>T ...

  10. [nk] 2022牛客寒假算法基础集训营1 补题|题解

    目录 前言 L.牛牛学走路 MyCode OtherCode J.小朋友做游戏 MyCode A.九小时九个人九扇门 MyCode F. 中位数切分 MyCode 前言 根据难度系数补题,大概会补 A ...

最新文章

  1. css 填坑常用代码分享
  2. 用html CSS实现砸金蛋,css3+js 实现砸金蛋效果
  3. 8月21日至8月27日技术积累
  4. Ardino基础教程 22_PS2摇杆
  5. 为什么需要建设中台?
  6. ZOJ3556 How Many Sets I(容斥)
  7. 图像处理基础(8):图像的灰度直方图、直方图均衡化、直方图规定化(匹配)
  8. 联想MIIX520安装黑苹果参考教程
  9. matlab如何批量去背景,ImageJ怎么消除背景 批量去背景教程
  10. 放生改变命运居士真实感应实录
  11. IV WOE 评分卡 分箱
  12. android4.4广播,Android4.4 framework分析——广播的注册(BroadcastReceiver)和发送(sendbroadcast)过程分析...
  13. C++学习笔记(C转)
  14. webpack学习之 style-loader / css-loader
  15. Java后端工程师学习路线——大学版
  16. 豆瓣FM duilib版
  17. 程序员面试前都要做哪些准备
  18. 记录一次xx应用的伪破解(一)(去广告 增加vip功能)
  19. 【JY】钢筋混凝土正截面极限承载力设计的基本原理和快速计算方法
  20. CSDN文章复制没有图片只有文字

热门文章

  1. 基于DDD的现代ASP.NET开发框架--ABP系列之2、ABP入门教程
  2. Lory Carousel滑块具有CSS动画和触摸支持
  3. 秀米svg点击显示另一张图_公众号排版怎么做?点击图片出现另一张图片是怎么弄的?...
  4. python实现雪花动态图_python实现雪花飘落效果
  5. R语言逻辑回归logistic regression对用户收入进行预测
  6. 计算机网络基础之域名系统
  7. 解决“连接U8数据库服务器失败”的方法尝试
  8. 视频剪辑的实用技巧快速分享
  9. 如何看待程序员“面试造火箭、工作拧螺丝”?| 畅言
  10. 让微信 8.0 「裂开」「炸弹」的特效代码来了