4537: [Hnoi2016]最小公倍数|分块
来源:互联网 发布:js修改input的value 编辑:程序博客网 时间:2024/06/04 00:33
暴力的做法就是直接找到所有
然后就可以考虑分块,把边按照
块前的按照
块的大小为
#include<algorithm>#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>#include<vector>#include<cmath>#include<queue>#include<ctime>#include<set>#include<map>#define N 110000#define ll long longusing namespace std;int sc(){ int i=0,f=1; char c=getchar(); while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar(); return i*f;}struct W{int x,y,a,b,p;}a[N],q[N];int bl[N],c[N],fa[N],size[N],ma[N],mb[N];int st[N],SIZE[N],MA[N],MB[N],ans[N];int n,m,Q,top,cnt,block;bool cmp1(W a,W b){ return a.a<b.a||(a.a==b.a&&a.b<b.b);}bool cmp2(W a,W b){ return a.b<b.b||(a.b==b.b&&a.a<b.a);}int find(int x){ return x==fa[x]?x:find(fa[x]);}void merge(int x,int y,int a,int b,int v){ int fx=find(x); int fy=find(y); if(v==1) { ++cnt; st[cnt]=fx; MA[cnt]=ma[fx]; MB[cnt]=mb[fx]; SIZE[cnt]=size[fx]; ++cnt; st[cnt]=fy; MA[cnt]=ma[fy]; MB[cnt]=mb[fy]; SIZE[cnt]=size[fy]; } if(fx==fy) { ma[fx]=max(ma[fx],a); mb[fx]=max(mb[fx],b); } else { if(size[fx]<size[fy])swap(fx,fy); fa[fy]=fx; size[fx]+=size[fy]; ma[fx]=max(ma[fx],max(a,ma[fy])); mb[fx]=max(mb[fx],max(b,mb[fy])); }}void retract(){ for(int i=cnt;i>=1;i--) { int k=st[i]; fa[k]=k; ma[k]=MA[i]; mb[k]=MB[i]; size[k]=SIZE[i]; }}int main(){ n=sc();m=sc();block=sqrt(m*log2(m)); for(int i=1;i<=m;i++) { a[i].x=sc(); a[i].y=sc(); a[i].a=sc(); a[i].b=sc(); } Q=sc(); for(int i=1;i<=Q;i++) { q[i].x=sc(); q[i].y=sc(); q[i].a=sc(); q[i].b=sc(); q[i].p=i; } sort(a+1,a+m+1,cmp1); sort(q+1,q+Q+1,cmp2); for(int i=1;i<=m;i++) bl[i]=(i-1)/block+1; for(int i=1;i<=m;i+=block) { int top=0,now=1; for(int j=1;j<=Q;j++) if(q[j].a>=a[i].a&&(i+block>m||q[j].a<a[i+block].a)) c[++top]=j; sort(a+1,a+i,cmp2); for(int j=1;j<=n;j++) { fa[j]=j; ma[j]=-1; mb[j]=-1; size[j]=1; } for(int j=1;j<=top;j++) { int k=c[j]; while(now<i&&a[now].b<=q[k].b) merge(a[now].x,a[now].y,a[now].a,a[now].b,0),now++; for(int l=i;bl[l]==bl[i];l++) if(a[l].a<=q[k].a&&a[l].b<=q[k].b) merge(a[l].x,a[l].y,a[l].a,a[l].b,1); int fx=find(q[k].x),fy=find(q[k].y); ans[q[k].p]=(fx==fy&&ma[fx]==q[k].a&&mb[fx]==q[k].b); retract(); cnt=0; } } for(int i=1;i<=Q;i++) puts(ans[i]?"Yes":"No"); return 0;}
0 0
- 4537: [Hnoi2016]最小公倍数|分块
- bzoj 4537: [Hnoi2016]最小公倍数 分块
- [BZOJ4537][Hnoi2016][分块]最小公倍数
- [分块 并查集] BZOJ 4537 [Hnoi2016]最小公倍数
- bzoj 4537: [Hnoi2016]最小公倍数 并查集按秩合并+分块
- BZOJ 4537: [Hnoi2016]最小公倍数
- bzoj 4537: [Hnoi2016]最小公倍数
- 4537: [Hnoi2016]最小公倍数
- BZOJ 4537 [Hnoi2016]最小公倍数
- 【bzoj4537】【HNOI2016】【最小公倍数】【并查集+启发式合并+分块】
- BZOJ4537:[Hnoi2016]最小公倍数 (分块+并查集+启发式合并)
- BZOJ4537 [Hnoi2016]最小公倍数 分块+可撤销并查集
- 【HNOI2016】最小公倍数
- HNOI2016 最小公倍数
- [HNOI2016] 最小公倍数
- BZOJ4537 [ HNOI2016 ] 最小公倍数 (按轶合并带权并查集+分块离线)
- BZOJ4537: [Hnoi2016]最小公倍数
- bzoj4537: [Hnoi2016]最小公倍数
- 利用AppInventor读取天气预报接口(完整版)
- 菜鸟第一次写博客
- Struts2:ClassNotFoundException: org...dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
- 棋子染色问题(burnside引理或者polya定理)
- Git小记
- 4537: [Hnoi2016]最小公倍数|分块
- 一道关于位段及大小端的面试题
- HashMap源码注解 之 resize()方法(七)
- 我是钓~!~!~!@鱼测试
- widget点击进入应用遇到的问题
- VS2012 MFC 相关问题
- 搜索——1015
- UVA_11517_Exact Change
- 北京林业大学“计蒜客”杯程序设计竞赛 网络赛 G. 易彰彪的一张表 (KMP)