当前位置:   article > 正文

求区间[L,R]内某个数出现的次数(二分/分块)

求区间[L,R]内某个数出现的次数(二分/分块)

https://ac.nowcoder.com/acm/contest/13504/E

大意


给出n个贝壳,每个贝壳上有一个编号,q次询问,每次询问在区间[L,R]内有多少个是x的倍数。

思路


vector保存每个数的下标,所有a[x]中就会保存x在数组中所有的下标,并且我们是按顺序添加的,所有下标是递增的,然后枚举所有小于等于最大编号并且是x的倍数的编号,二分查找这个数的所有满足在[L,R]内数有多少个。

code


  1. #include <bits/stdc++.h>
  2. #define ull unsigned long long
  3. #define ll long long
  4. const int inf = 0x3f3f3f3f;
  5. const int mod = 1e9+7;
  6. const int N = 2e6+7;
  7. const int ds = 1e8+7;
  8. const int base = 233;
  9. const double PI = 3.141592653589793238462643383;
  10. using namespace std;
  11. int a[N];
  12. vector<int>b[N];
  13. void solve() {
  14. int n,q,mmax = 0;
  15. cin >> n >> q;
  16. for(int i = 1; i <= n; i++) {
  17. cin >> a[i];
  18. b[a[i]].push_back(i);
  19. mmax = max(mmax,a[i]);
  20. }
  21. while(q--){
  22. int l,r,x;
  23. cin >> l >> r >> x;
  24. int ans = 0;
  25. for(int i = x; i <= mmax; i += x){
  26. if(b[i].size() == 0) continue;
  27. int xb1 = lower_bound(b[i].begin(),b[i].end(),l) - b[i].begin();
  28. int xb2 = upper_bound(b[i].begin(),b[i].end(),r) - b[i].begin();
  29. ans += xb2-xb1;
  30. }
  31. cout << ans << endl;
  32. }
  33. }
  34. int main() {
  35. // int t;
  36. // scanf("%d",&t);
  37. // while(t--)
  38. solve();
  39. return 0;
  40. }

 

https://ac.nowcoder.com/acm/contest/12478/A

大意


如果两个字符串,通过不同的字目映射关系可以转换为一样的中文意思,那么称这两个暗号本质相同,比如“lff”,“dee”,“kbb”“lff”,“dee”,“kbb”“lff”,“dee”,“kbb”都是本质相同的。

其实也就是成语中的AABB形,ABAB形成语这种说法。如果给出n个串,q次询问,问[L,R]与串t本质相同的个数。

思路


先处理n个串,判断每个串是哪种形的,利用数字来表示,比如1212,就是ABAB形,1122就是AABB形,然后用map<string,vector<int>>mp去保存这种形的串的下标。

然后q次询问的时候先判断t是哪种形的串,同样利用二分去查找下标在[L,R]内有多少个。

code


  1. #include <bits/stdc++.h>
  2. #define ull unsigned long long
  3. #define ll long long
  4. const int inf = 0x3f3f3f3f;
  5. const int mod = 1e9+7;
  6. const int N = 1e7+7;
  7. const ll ds = 1e15+7;
  8. const double PI = 3.141592653589793238462643383;
  9. using namespace std;
  10. map<string,vector<int> >mp;
  11. char s[505];
  12. int vis[30];
  13. void solve()
  14. {
  15. int n,q,t;
  16. scanf("%d%d",&n,&q);
  17. for(int i = 1; i <= n; i++){
  18. scanf("%s",s);
  19. memset(vis,0,sizeof vis);
  20. string s1 = "";
  21. t = 0;
  22. for(int j = 0; j < strlen(s); j++){
  23. if(!vis[s[j]-'a']){
  24. s1 += (++t);
  25. vis[s[j]-'a'] = t;
  26. }
  27. else s1 += vis[s[j]-'a'];
  28. }
  29. mp[s1].push_back(i);
  30. }
  31. while(q--){
  32. int l,r,lxb,rxb;
  33. scanf("%s%d%d",s,&l,&r);
  34. memset(vis,0,sizeof vis);
  35. string s1 = "";
  36. t = 0;
  37. for(int j = 0; j < strlen(s); j++){
  38. if(!vis[s[j]-'a']){
  39. s1 += (++t);
  40. vis[s[j]-'a'] = t;
  41. }
  42. else s1 += vis[s[j]-'a'];
  43. }
  44. lxb = lower_bound(mp[s1].begin(),mp[s1].end(),l)-mp[s1].begin();
  45. rxb = upper_bound(mp[s1].begin(),mp[s1].end(),r)-mp[s1].begin();
  46. printf("%d\n",rxb-lxb);
  47. }
  48. }
  49. int main() {
  50. // int t;
  51. // scanf("%d",&t);
  52. // while(t--)
  53. solve();
  54. return 0;
  55. }

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/180204
推荐阅读
相关标签
  

闽ICP备14008679号