[bzoj4358] permu

本文介绍了一种利用莫队算法与并查集解决区间问题的方法,通过合理安排查询顺序并支持撤销操作,实现了O(m*n^0.5)的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  强行上莫队+线段树显然是会T的。

  如果莫队没有删除的转移的话...就可以用并查集代替线段树。

  所以按照一般姿势将询问排序好后,右端点照常,左端点每次从左端点所属块的末端开始跑,跑完后暴力撤回。

  复杂度还是O(m*n^0.5)

  为了能够撤回,并查集合并的时候,以临时增加的点为父亲。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 const int maxn=50233;
 8 struct zs{int l,r,id;}q[maxn];
 9 int fa[maxn],sz[maxn],mp[maxn],st[maxn],top;
10 int B[maxn],An[maxn];
11 int i,j,k,n,m,ans;
12 
13 int ra;char rx;
14 inline int read(){
15     rx=getchar(),ra=0;
16     while(rx<'0'||rx>'9')rx=getchar();
17     while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra;
18 }
19 
20 inline int getfa(int x){return fa[x]!=x?fa[x]=getfa(fa[x]):x;}
21 inline int get1(int x){while(fa[x]!=x)x=fa[x];return x;}
22 
23 inline void add(int x){
24     sz[x]=1;
25     int pre=getfa(x-1),aft=getfa(x+1);
26     if(sz[pre])sz[pre]+=sz[x],fa[x]=pre,x=pre;
27     if(sz[aft])sz[aft]+=sz[x],fa[x]=aft,x=aft;
28     if(sz[x]>ans)ans=sz[x];
29 }
30 inline void add2(int x){
31     sz[x]=1;
32     int pre=get1(x-1),aft=get1(x+1);
33     
34     if(sz[pre])
35         sz[x]+=sz[pre],fa[pre]=x,st[++top]=pre;
36     if(sz[aft])
37         sz[x]+=sz[aft],fa[aft]=x,st[++top]=aft;
38     if(sz[x]>ans)ans=sz[x];
39 }
40 
41 bool cmp(zs a,zs b){return B[a.l]<B[b.l]||(B[a.l]==B[b.l]&&a.r<b.r);}
42 
43 int main(){
44     n=read(),m=read();int kuai=(int)sqrt(n*1.2)+3;
45     for(i=1;i<=n;i++)mp[i]=read(),B[i]=(i+kuai-1)/kuai;
46     for(i=1;i<=m;i++)q[i].l=read(),q[i].r=read(),q[i].id=i;
47     sort(q+1,q+1+m,cmp);
48     int r,r1,now,tmp;
49     for(i=1;i<=m;){
50         for(r=i;B[q[r].l]==B[q[i].l];r++);r--;
51         r1=B[q[i].l]==B[n]?n:B[q[i].l]*kuai;
52         for(j=0;j<=n+1;j++)fa[j]=j,sz[j]=0;
53         ans=0,now=r1+1;
54         
55         for(j=i;j<=r;j++){
56             while(now<=q[j].r)add(mp[now++]);
57             tmp=ans,top=0;
58             for(k=q[j].l;k<=q[j].r&&k<=r1;k++)add2(mp[k]);
59             An[q[j].id]=ans;
60             while(top)fa[st[top]]=st[top],top--;
61             for(k=q[j].l;k<=q[j].r&&k<=r1;k++)fa[mp[k]]=mp[k],sz[mp[k]]=0;
62             ans=tmp;
63         }
64         i=r+1;
65     }
66     for(i=1;i<=m;i++)printf("%d\n",An[i]);
67 }
View Code

 

转载于:https://www.cnblogs.com/czllgzmzl/p/5644724.html

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值