当前位置: 首页 > news >正文

区间与除法-线段树

P5629-区间与除法-线段树

题意

给定 \(n\) 个数,如果可以通过除以给定的 \(d\) 得到 \(m\) 个原数中的一个,则称为可消除的,每次询问区间 \(l\)\(r\) 中消除所有可消除的数所需的最少原数个数。

写题ing

要不是题目是我挑的,不然真的看不出来除了线段树还有什么。

区间问题,线段树是没跑的了(不过静态查询还可以用 \(st\) 表),那我要维护什么东西呢?维护每个可消除的数最后得到的原数,因为如果一个树可以得到多个原数,那么这多个原数都可以得到最小的那个。然后线段树维护。。。有哪些原数?长度 \(62\)\(bool\) ?够是够的,但时间复杂度?是一样的。 \(1.2e8\) ,这和字典树什么关系?

不对,这样维护会 \(T\) 还好我又看了一眼,查询的 \(q logn m = 1.2e9\) 算错了。要么把维护的东西换了,或者换成 \(bitset\) ?不想烧烤了,直接换 \(bitset\)

写的时候才发现想要预处理出原数间的关系还挺难的。确实要用字典树?不然每除一次(\(63\))在 \(60\) 个里面找一次。刚好炸了。。。这不就是一个映射吗。


正文:我写题的过程都在上面,我就只在这总结一下,发现如果原数可以被除成原数,则小的一定更优。所以作一遍去重和映射。在把原数组可以变成的最小原数小标记录。用线段树维护存在的原数,并使用 \(bitset\) 优化。让我想了有一会的就这两优化和映射有没有的问题,题目挺简单的。

code

#include <bits/stdc++.h>
#define int long long
using namespace std;
constexpr int maxn = 5e5+10;
constexpr int maxm = 3.5e7;void read(int&);int n,m,d,q;
int wi[maxn];
int ki[100];
int cov[100];// id->w
unordered_map<int,int> ch;// w->id
int to[maxn];// wi->ki
bitset<64> tr[maxn<<2];void pushup(int p)
{tr[p]=tr[p<<1] | tr[p<<1|1];
}void build(int p=1,int l=1,int r=n)
{if(l==r){if(to[l]){tr[p][to[l]]=1;}return;}int mid=(l+r)>>1;build(p<<1,l,mid);build(p<<1|1,mid+1,r);pushup(p);
}bitset<64> query(int x,int y,int p=1,int l=1,int r=n)
{if(x<=l && r<=y){return tr[p];}bitset<64> ret;int mid=(l+r)>>1;if(x<=mid){ret |= query(x,y,p<<1,l,mid);}if(mid<y){ret |= query(x,y,p<<1|1,mid+1,r);}return ret;
}signed main()
{#ifndef ONLINE_JUDGEfreopen("1.in","r",stdin);freopen("1.out","w",stdout);#endif // ONLINE_JUDGEread(n);read(m);read(d);read(q);for(int i=1;i<=n;++i){read(wi[i]);}for(int i=1;i<=m;++i){read(ki[i]);}sort(ki+1,ki+1+m);m=unique(ki+1,ki+1+m)-ki-1;for(int i=1;i<=m;++i){cov[i]=ki[i];ch[ki[i]]=i;}for(int i=1;i<=m;++i){int tmp=ki[i];while(tmp){tmp/=d;if(ch.count(tmp)){ch[ki[i]]=ch[tmp];}}cov[i]=cov[ch[ki[i]]];// cerr<<i<<" "<<ch[cov[i]]<<"\n";}for(int i=1;i<=n;++i){int tmp=wi[i];while(tmp){if(ch.count(tmp)){to[i]=ch[tmp];break;}tmp/=d;}// cerr<<i<<" "<<to[i]<<'\n';}build();for(int i=1,x,y ;i<=q;++i){read(x);read(y);printf("%lld\n",(int)query(x,y).count());}return 0;
}void read(int &x)
{x=0;int f=1;signed c=getchar_unlocked();while(!isdigit(c)){if(c=='-'){f=-1;}c=getchar_unlocked();}while(isdigit(c)){x=x*10+(c^48);c=getchar_unlocked();}x*=f;
}
http://www.zskr.cn/news/48488.html

相关文章:

  • 足球
  • 新建 Microsoft Word 文档
  • 2025 年 11 月污水提升泵厂家推荐排行榜,进口污水提升泵,地下室家用污水提升泵,别墅/厕所/卫生间马桶污水提升泵,厨房墙排一体化污水提升泵公司推荐
  • 2025年硅晶釉涂料优质厂家权威推荐榜单:硅晶釉/釉面涂料/隔热涂料源头厂家精选
  • 2025年矿用设备设施安全检测检验企业口碑排行榜
  • adb gdb+gdbserver远程调试ddsrouter
  • A4纸打印标签
  • TIA Portal 最新正式版本是 V20
  • Python 集合Set简介
  • 算力赋能场景:RK主板的技术演进与行业应用全景
  • 2025年RS485噪声监测仪定做厂家权威推荐榜单:噪声检测仪/工业声音传感器/噪声检测传感器源头厂家精选
  • 2025年11月重庆眼镜店最新推荐,覆盖青少年配眼镜/儿童配眼镜/老年人配眼镜/全人群配镜需求
  • 吴恩达深度学习课程二: 改善深层神经网络 第二周:优化算法(六)课后习题和代码实践
  • 2025年北京物业合作公司权威推荐榜单:医院物业加盟/学校物业加盟/物业加盟合作伙伴精选
  • How to make your GCC kawaii in Dev-C++
  • 2025年工业制冷品牌推荐排行榜:专业评测与选择指南
  • 2025超级简单jenkins部署!保姆级教学!
  • 闭包装饰器
  • 2025年11月国内画册设计企业综合推荐排行榜
  • 微算法科技(NASDAQ MLGO)通过容量证明(PoC)构建全球存储资源池,为Web3应用提供低成本、抗审查的数据存储服务
  • UI自动化维护成本高?一个Dify工作流,实现自愈式测试,告别脚本脆弱性
  • window 系统之AMD 和 ARM区别
  • 成熟可靠的多层级全景式教育行业数据安全管理方案
  • 对接世界职业院校技能大赛标准,唯众打造高质量云计算实训室 - 教程
  • 2025年pc防火改性塑料定制厂家权威推荐榜单:耐寒改性pc/pc改性工艺/PC温度改性源头厂家精选
  • 2025年涡街流量计制造厂权威推荐榜单:防爆式超声流量计/孔板流量计/电磁流量计源头厂家精选
  • 2025 年 11 月镀膜材料厂家推荐排行榜,真空镀膜材料,光学镀膜材料,装饰镀膜材料,功能性镀膜材料公司精选
  • 2025 年 11 月数控滚齿机床厂家推荐排行榜,高速滚齿机,小微齿轮加工,车滚齿复合机床,双主轴数控车滚齿机床公司推荐
  • 2025年拆迁补偿安置口碑推荐榜单:十大专业律所综合评测
  • jenkins构建序号自定义显示