【BZOJ3514】Codechef MARCH14 GERALD07加强版 LCT+主席树

【BZOJ3514】Codechef MARCH14 GERALD07加强版

Description

N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数。

Input

第一行四个整数N、M、K、type,代表点数、边数、询问数以及询问是否加密。
接下来M行,代表图中的每条边。
接下来K行,每行两个整数L、R代表一组询问。对于type=0的测试点,读入的L和R即为询问的L、R;对于type=1的测试点,每组询问的L、R应为L xor lastans和R xor lastans。

Output

 K行每行一个整数代表该组询问的联通块个数。

Sample Input

3 5 4 0
1 3
1 2
2 1
3 2
2 2
2 3
1 5
5 5
1 2

Sample Output

2
1
3
1

HINT

对于100%的数据,1≤N、M、K≤200,000。

题解:本题思路很神~

我们将边按编号一条一条地加到图中,如果当前边a,b所在的连通块已经连通,则我们找到这个连通块中编号最小的边,记录它的编号kick[i],并将它删去,然后将当前边加入到图中。这个可以用LCT很容易的实现。(套路:用LCT维护边权的方法,将边变成点,a-b连边视为a-c-b连边,然后图中只有从边变过来的点才有权值)

然后采用主席树,在i的主席树中将kick[i]删除,然后查询[l,r]时再r的主席树中查询[l,r]这段区间,就能得到区间中有多少树边了。

 

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn=200010;
int n,m,Q,typ,tot,ans;
int pa[maxn],pb[maxn],f[maxn],rt[maxn],sum[maxn];
struct LCT
{int ch[2],fa,rev,mn,val;
}t[maxn<<1];
struct sag
{int ls,rs,siz;
}s[maxn*40];
inline bool isr(int x) {return t[t[x].fa].ch[0]!=x&&t[t[x].fa].ch[1]!=x;}
inline void rever(int x)
{swap(t[x].ch[0],t[x].ch[1]),t[x].rev^=1;
}
inline void pushdown(int x)
{if(t[x].rev){if(t[x].ch[0])	rever(t[x].ch[0]);if(t[x].ch[1])	rever(t[x].ch[1]);t[x].rev=0;}
}
inline void pushup(int x)
{t[x].mn=min(t[x].val,min(t[t[x].ch[0]].mn,t[t[x].ch[1]].mn));
}
inline void rotate(int x)
{int y=t[x].fa,z=t[y].fa,d=(x==t[y].ch[1]);if(!isr(y))	t[z].ch[y==t[z].ch[1]]=x;t[x].fa=z,t[y].fa=x,t[y].ch[d]=t[x].ch[d^1];if(t[x].ch[d^1])	t[t[x].ch[d^1]].fa=y;t[x].ch[d^1]=y;pushup(y),pushup(x);
}
void updata(int x)
{if(!isr(x))	updata(t[x].fa);pushdown(x);
}
inline void splay(int x)
{updata(x);while(!isr(x)){int y=t[x].fa,z=t[y].fa;if(!isr(y)){if((x==t[y].ch[1])^(y==t[z].ch[1]))	rotate(x);else	rotate(y);}rotate(x);}
}
inline void access(int x)
{for(int y=0;x;splay(x),t[x].ch[1]=y,pushup(x),y=x,x=t[x].fa);
}
inline void maker(int x)
{access(x),splay(x),rever(x);
}
inline void link(int a,int b)
{maker(a),t[a].fa=b;
}
inline void cut(int a,int b)
{maker(a),access(b),splay(b),t[a].fa=t[b].ch[0]=0,pushup(b);
}
void insert(int x,int &y,int l,int r,int a,int b)
{y=++tot,s[y].siz=s[x].siz+1;if(l==r)	return ;int mid=(l+r)>>1;if(a<=mid)	s[y].rs=s[x].rs,insert(s[x].ls,s[y].ls,l,mid,a,b);else	s[y].ls=s[x].ls,insert(s[x].rs,s[y].rs,mid+1,r,a,b);
}
int query(int x,int l,int r,int a,int b)
{if(!x||(a<=l&&r<=b))	return s[x].siz;int mid=(l+r)>>1;if(b<=mid)	return query(s[x].ls,l,mid,a,b);if(a>mid)	return query(s[x].rs,mid+1,r,a,b);return query(s[x].ls,l,mid,a,b)+query(s[x].rs,mid+1,r,a,b);
}
int find(int x)
{return (f[x]==x)?x:(f[x]=find(f[x]));
}
inline int rd()
{int ret=0,f=1;	char gc=getchar();while(gc<'0'||gc>'9')	{if(gc=='-')	f=-f;	gc=getchar();}while(gc>='0'&&gc<='9')	ret=ret*10+gc-'0',gc=getchar();return ret*f;
}
int main()
{n=rd(),m=rd(),Q=rd(),typ=rd();int i,a,b,c;for(i=0;i<=n;i++)	f[i]=i,t[i].val=t[i].mn=m+1;for(i=1;i<=m;i++)	t[i+n].val=t[i+n].mn=i;for(i=1;i<=m;i++){a=pa[i]=rd(),b=pb[i]=rd(),sum[i]=sum[i-1]+1;if(a==b)	sum[i]--,rt[i]=rt[i-1];else	if(find(a)==find(b)){maker(a),access(b),splay(b),c=t[b].mn;insert(rt[i-1],rt[i],1,m,c,1);cut(pa[c],c+n),cut(pb[c],c+n),link(a,i+n),link(b,i+n);}else	f[f[a]]=f[b],link(a,i+n),link(b,i+n),rt[i]=rt[i-1];}for(i=1;i<=Q;i++){a=rd()^(ans*typ),b=rd()^(ans*typ);ans=n-(sum[b]-sum[a-1]-query(rt[b],1,m,a,b));printf("%d\n",ans);}return 0;
}//3 5 4 0 1 3 1 2 2 1 3 2 2 2 2 3 1 5 5 5 1 2 

 

转载于:https://www.cnblogs.com/CQzhangyu/p/7670107.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467532.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓9.0Sensor框架

前言本来如果只是给传感器写个驱动并提供能读取温湿度数据的节点&#xff0c;是一件比较轻松的事情&#xff0c;但是最近上层应用的同事要求我们按照安卓标准的流程来&#xff0c;这样他们就能通过注册一个服务直接读取传感器事件数据了。这样做的好处就是第三方的应用也能正常…

java ognl表达式_java -------ognl表达式入门

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼------------------------------------------------------------------------------------ognl:对象表达式语言&#xff0c;可以用一个表达式快速地访问一个对象的属性&#xff0c;还可以调用对象的方法--------------------------…

Theano 更多示例

Logistic函数 logistic函数的图&#xff0c;其中x在x轴上&#xff0c;s(x)在y轴上。 如果你想对双精度矩阵上的每个元素计算这个函数&#xff0c;这表示你想将这个函数应用到矩阵的每个元素上。 嗯&#xff0c;你是这样做的&#xff1a; xT.dmatrix(x) s1/(1T.exp(-x)) logisti…

SensorKernel层框架分析

接上文安卓9.0Sensor框架前言前面我们已经讲解了sensor框架中的framework到vendor层&#xff0c;这篇文章我们将会讲解kernel层的内容。不过不同的芯片平台&#xff0c;kernel层中的sensor框架是不同的&#xff0c;这里针对的是mt8167s平台。不过这里提醒一下&#xff0c;MTK平…

【习题 5-8 UVA - 230】Borrowers

【链接】 我是链接,点我呀:) 【题意】 在这里输入题意 【题解】 用mapset写个模拟就好。 3个区域 书架、桌子、别人的手上。 其中前两个区域的书都能借出去。 【代码】 #include <bits/stdc.h> using namespace std;set <pair<string, string> > mset1,mse…

java requestparams_java – 如何验证@RequestParams不为空?

我有一个计算器服务,从用户获取操作类型num1和num2.我需要验证用户是否实际输入了这些值,而不是将其留空.RequestMapping(value "/calculate")ResponseBodypublic CalculationResult calculate(RequestParam(name "op") String operation, RequestParam(…

Linux内核LED子系统、请务必看

前言LED子系统你要是说很难嘛&#xff0c;但是它就是控制一些简单的GPIO口&#xff0c;但是你要是说它很简单嘛&#xff0c;但是我也不见得一个初学者很快就能掌握&#xff0c;你如果是刚入门这部分的话&#xff0c;我觉得你还是要去仔细研究下这些驱动。前两天在网上看到一句话…

UVALive 4394 String painter

题目大意&#xff1a;有两个字符串A,B&#xff0c;一次刷可以把A串一段刷成同一个字母&#xff0c;问至少要刷几次才能把A串变成B串。串长≤100。 本来以为是个很简单的区间DP&#xff0c;后来发现直接区间DP是不行的&#xff0c;这玩意有后效性&#xff1a;刷完一整块之后这一…

centos 6.5 安装 lamp 后mysql不能启动_CentOS 6.5 系统 LAMP(Apache+MySQL+PHP)安装步骤

先来解释一下&#xff0c;什么是 LAMP。正如标题所言&#xff0c;LAMP 实际上就是 Linux、Apache、MySQL、PHP 四个名称的缩写&#xff0c;当然最后一个 “P” 还有其他说法是 Perl 或者 Python。不用多说了&#xff0c;本文讲解的就是 Linux、Apache、MySQL、PHP 这四个东西&a…

Redis连接实例

ECS Windows服务器 如果您本地需要通过公网访问 云数据库 Redis&#xff0c;可以在 ECS Windows 云服务器中通过 netsh 进行端口映射实现。 1. 登录 ECS Windows 服务器&#xff0c;在 CMD 执行以下命令。&#xff08;公网地址与 连接地址 请替换 为您的实际地址。&#xff09;…

什么是高内聚,低耦合?

高内聚&#xff0c;低耦合是一个老生常谈的话题&#xff0c;所以拿出来说一下我们在看Linux的一些资料&#xff0c;或者是在面试&#xff0c;又或者跟一个比较牛的大佬讨论技术的时候&#xff0c;可能会听到这个概念。所以&#xff0c;什么是高内聚&#xff0c;低耦合呢&#x…

java 8 兼容_甲骨文限制 Java 9 到 Java 8 的向后兼容性

在开发者们正兴奋着准备把 Java 8 工具包转向 Java 9 的时候&#xff0c;甲骨文的首席执行官提出了要限制两个版本的兼容性。在周一下午 OpenJDK 的邮件列表中的一封邮件中&#xff0c;甲骨文的 Java 平台的首席架构师 Mark Reinhold 指出会对 JDK8 增加更多变化(大概在 2014 年…

Web API 2 入门——创建ASP.NET Web API的帮助页面(谷歌翻译)

在这篇文章中 创建API帮助页面将帮助页面添加到现有项目添加API文档在敞篷下下一步作者&#xff1a;Mike Wasson 创建Web API时&#xff0c;创建帮助页面通常很有用&#xff0c;以便其他开发人员知道如何调用API。您可以手动创建所有文档&#xff0c;但最好尽可能自动生成。 为…

Linux fork的写时复制

这个问题是一个同学在知识星球里面提问的看下面的代码#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/wait.h> #includ…

从单片机工程师的角度看嵌入式Linux

前言 这篇文章简单我们来一起梳理嵌入式Linux的一些知识&#xff0c;方便于一些想跟我一样想要由单片机进阶到嵌入式Linux的朋友做一些参考学习。现在随着嵌入式Linux的教程不断增多&#xff0c;相信应该有不少学单片机的朋友开始折腾这个了吧~嵌入式Linux学哪些东西 1、认识Li…

Java低级编程软件_JAVA语言说低级语言吗

高级语言&#xff1a;C、C、Java、Python、Pascal、Lisp、Prolog、FoxPro、易语言等都是高级语言&#xff0c;相对于低级语言来说&#xff0c;高级语言采用易于识别和记忆的字符来作为关键字&#xff0c;也更接近人类的思维方式&#xff0c;编写容易读写性好&#xff0c;开发效…

智能硬件开发神器免费送!距离产品智能化,只差一个“三明治”的距离

重磅资料包免费领取 针对人群&#xff1a;如果您对“人工智能物联网”感兴趣&#xff0c;尤其是您的企业想做产品/行业智能化&#xff0c;一定不能错过这份“物联网人必备的终极大礼包”哦&#xff5e;这几类行业玩家必看&#xff01;&#xff01;&#xff01;制造商、方案商、…

Java类的继承关键字_Java的第八天(类的继承、super关键字的使用、方法的重写)...

39.类的继承java描述类的时候&#xff0c;咱们若是发现有几个类有重复的属性和方法&#xff0c;咱们就能够采用继承的方法来设计ide使用extends关键字来继承this语法&#xff1a;设计class 子类 extends 父类{对象子类属性继承子类方法内存}资源特色&#xff1a;(1)子类会把父类…

你们班上的同学现在都怎么样了?

今天跟朋友聊天&#xff0c;聊到这个话题&#xff0c;觉的有点意思&#xff0c;所以想拿出来讨论一下。小学小学的时候&#xff0c;我们读书最厉害的应该是我们班上几个老师的孩子&#xff0c;他们像是得到了老师的武功秘籍&#xff0c;读书对他们来说就是家常便饭&#xff0c;…

java socket oc_Java Socket编程(三) 服务器Sockets

文章来源&#xff1a;aspcn 作者&#xff1a;孙雯服务器Sockets列表9.2是一个服务器应用程序的一部分.列表9.2 一个简单的服务器程序/*** 一个监听端口并提供HTML文档的程序.*/class SimpleWebServer {public static void main(String args[]){ServerSocket serverSocket null…