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

线段树分治

线段树分治的本质比较简单,一句话就可以说完:
线段树分治就是对时间维建线段树,将时间维上的区间操作在线段树上标记永久化。

P5787 二分图 /【模板】线段树分治

动态维护图是否是二分图可以通过 扩展域并查集 简单维护。(事实上这道题的难点可能在这个上面)

然后我们就将插入边的操作放到时间维的线段树上,然后去做类似 dfs 的查询即可。
具体的,进入线段树上一个点我们先将所有挂在当前点的连边操作做了,然后递归进儿子即可。如果已经到儿子了那么就判断当前图是否是二分图即可。
处理完儿子后就回溯情况,将边和维护的黑白点在同一个连通块内的点的个数全部回溯回去即可。

code

一个小剪枝是如果在一个非叶子节点图已经不是二分图了那么再连边也一定不可能变成二分图,因此可以直接返回。但是记得要在所有返回前都完整回溯,比如剪枝前要回溯,叶子节点记录完答案后要回溯。

点击查看代码
#include<bits/stdc++.h>
bool Mbe;
using namespace std;
#define ll long long
//namespace FIO{
//	template<typename P>
//	inline void read(P &x){P res=0,f=1;char ch=getchar();while(ch<'0' || ch>'9'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0' && ch<='9'){res=(res<<3)+(res<<1)+(ch^48);ch=getchar();}x=res*f;}
//	template<typename Ty,typename ...Args>
//	inline void read(Ty &x,Args &...args) {read(x);read(args...);}
//	inline void write(ll x) {if(x<0ll)putchar('-'),x=-x;static int sta[35];int top = 0;do {sta[top++] = x % 10ll, x /= 10ll;} while (x);while (top) putchar(sta[--top] + 48);}
//}
//using FIO::read;using FIO::write;
const int N=1e5+7;
#define pii pair<int,int>
int n,m,k;
namespace uni{int fa[N<<1],siz[N<<1],cnt=0,top=0;pii stk[N<<1];void init(){for(int i=1;i<=n<<1;i++)fa[i]=i,siz[i]=1;}int find(int x){return fa[x]==x?x:find(fa[x]);} int oth(int x){return x>n?x-n:x+n;}void merge(int x,int y){x=find(x),y=find(y);if(x==y){return;}//cnt++;  //只要需要判黑白染色即可!!!因为可以有偶环!!!if(siz[x]>siz[y])swap(x,y);stk[++top]={y,x};  //x 连向 yfa[x]=y;siz[y]+=siz[x];cnt+=(find(x)==find(oth(x)))+(find(y)==find(oth(y)));}void split(){ //去掉栈顶的连边int y=stk[top].first,x=stk[top].second;siz[y]-=siz[x];fa[x]=x;top--;}
}
using namespace uni;
namespace sgt_part{vector<pii>tag[N<<2];int ans[N];#define ls (u<<1)#define rs (u<<1|1)#define mid ((l+r)>>1)void modify(int u,int l,int r,int ql,int qr,pii x){if(ql<=l&&r<=qr){tag[u].push_back(x);return;}if(ql<=mid)modify(ls,l,mid,ql,qr,x);if(qr>mid)modify(rs,mid+1,r,ql,qr,x);}void query(int u,int l,int r){int lstcnt=cnt,lsttop=top;for(auto [u,v]:tag[u]){merge(u,v+n),merge(u+n,v);}if(l==r){ans[l]=(cnt==0);cnt=lstcnt;while(top>lsttop)split();return;}if(cnt!=0){cnt=lstcnt;while(top>lsttop)split();return;}query(ls,l,mid),query(rs,mid+1,r);cnt=lstcnt;while(top>lsttop)split();}
}
using namespace sgt_part;
bool Med;
signed main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);//freopen(".in","r",stdin);//freopen(".out","w",stdout);cin>>n>>m>>k;init();for(int i=1,u,v,l,r;i<=m;i++){cin>>u>>v>>l>>r;l++;if(l>r)continue;modify(1,1,k,l,r,{u,v});}query(1,1,k);for(int i=1;i<=k;i++)cout<<(ans[i]?"Yes\n":"No\n");cerr<<'\n'<<1e3*clock()/CLOCKS_PER_SEC<<"ms\n";cerr<<'\n'<<fabs(&Med-&Mbe)/1048576.0<<"MB\n";return 0;
}
http://www.sczhlp.com/news/222175/

相关文章:

  • DeepSeek OCR:10倍文档压缩,97%准确率,让你的 LLM 读得更快、更省
  • 10.23 Session、Cookie、Token的核心区别;Cookie和缓存(Cache)的区别
  • 网站被做301济南哪里有做网站的
  • 优化网站关键词怎么做建卖手机网站
  • 推广网站有效的免费方法深圳市建设局质监站官方网站
  • 门户网站具有什么特点山东免费网络推广工具
  • 网站优化网站建设wordpress数据库承载
  • 西安旅游服务网站建设网站上删除信息如何做
  • 宁波网站制作相信荣胜网络程序员联系方式
  • 青岛房产网站宁德市住房和城乡建设局网站
  • 网站 新媒体建设情况外国酷炫网站
  • 柳州集团学校网站建设做设计找素材的+网站有哪些
  • 人物设计网站公司网站一年多少钱
  • 网站制作流程图大德通众包 做网站怎么样
  • 济南做网站哪家公司好深圳市工商网上办事大厅
  • 上海 建设工程质量监督站网站淄博云天网站建设推广
  • 邯郸网站建设公司哪家好做调研有哪些网站
  • 哈尔滨高端网站建设电商网站用什么做最好
  • 制作网站网络科技公司ps做网站画布多大
  • 网站做专题主题该怎么选自动成交型网站
  • app开发模板网站厦门网站制作企业
  • 400电话申请网站源码程序暑假适合带孩子去哪里旅游
  • 网站建设6135678上海工业设计公司
  • 网站开发的策划方案wordpress无法进入admin
  • 网站企业建设方案北京建站哪家好
  • 内丘企业做网站电子商务自助建网站
  • 宁波品牌网站推广优化装潢设计专业可以考二建吗
  • 遂宁市城市建设档案馆网站wordpress php.ini在哪里
  • 2025年10月留香沐浴露推荐:五强口碑榜对比评测
  • 已经设置过 settings.json,但是运行 claude 时,依旧提示 Missing API key Run /login