强制在线不代表不能预处理!

考虑暴力怎么干?

开始n个联通块。now=n

不断加入边,如果连接两个联通块,--now

否则不动。

后者的前提是和[l,id-1]的边构成环

所以,我们考虑每个[l,r]中出现的边能否第一次连接两个联通块

预处理:

编号从小到大加入每条边,LCT维护树上“边”编号最小值和最小值位置

如果加入边e没有环,那么说明无论什么时候[l,r]询问包含e的时候,e总能是第一个连接两个联通块的边,设ti[e]=0,表示不能替换边

如果会成环,那么把编号最小的边删掉,ti[i]=被删边的编号。意义是,只有[l,r]不包含这条被删除的边的时候,e才会贡献。

    如果包含,那么这个环一定会连出来;如果不包含,e和这个环上其他的边不会构成环,加入e的时候有贡献。(如果会构成环,那么环上边和被删边之前也能构成环,矛盾)

所以,ti[i]在不在[l,r]之中,唯一对应了i能否真正连接两个联通块!

所以对于询问,主席树维护即可。[l,r]中,ti[i]<l的数的个数sum,n-sum就是ans

实现细节:
LCT的编号别和原边的编号混了。。。。

mi是最小边编号(最小值),id是最小值的lct点的编号!

调半天~~~

吸取重组病毒的教训,把主席树封装进namespace~~

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=+;
const int inf=0x3f3f3f3f;
struct bian{
int x,y;
}e[N];
int n,m,k,typ;
int ti[N];
namespace seg{
#define mid ((l+r)>>1)
struct node{
int ls,rs;
int val;
}t[N*];
int cnt;
int rt[N];
void upda(int &x,int y,int l,int r,int to){
x=++cnt;
t[x].val=t[y].val+;
if(l==r) return;
t[x].ls=t[y].ls,t[x].rs=t[y].rs;
if(to<=mid) upda(t[x].ls,t[y].ls,l,mid,to);
if(mid<to) upda(t[x].rs,t[y].rs,mid+,r,to);
}
int query(int x,int y,int l,int r,int L,int R){
//cout<<" l r "<<l<<" "<<r<<" : "<<t[x].val<<" "<<t[y].val<<" "<<L<<" "<<R<<endl;
if(L<=l&&r<=R){
//cout<<" l r "<<l<<" "<<r<<" : "<<t[x].val<<" "<<t[y].val<<" "<<L<<" "<<R<<endl;
return t[x].val-t[y].val;
}
int ret=;
if(L<=mid) ret+=query(t[x].ls,t[y].ls,l,mid,L,R);
if(mid<R) ret+=query(t[x].rs,t[y].rs,mid+,r,L,R);
return ret;
}
void add(int x,int to){
upda(rt[x],rt[x-],,m,to);
}
}
namespace lct{
#define ls t[x].ch[0]
#define rs t[x].ch[1]
struct node{
int ch[];
int fa,r;
int id;
int mi;
int d;
}t[*N];
int sta[N];
int cnt;
bool nrt(int x){
return (t[t[x].fa].ch[]==x||t[t[x].fa].ch[]==x);
}
void pushup(int x){
if(t[t[x].ch[]].mi<=t[x].d&&t[t[x].ch[]].mi<=t[t[x].ch[]].mi){
t[x].mi=t[t[x].ch[]].mi;
t[x].id=t[t[x].ch[]].id;
}
else if(t[t[x].ch[]].mi<=t[x].d&&t[t[x].ch[]].mi<=t[t[x].ch[]].mi){
t[x].mi=t[t[x].ch[]].mi;
t[x].id=t[t[x].ch[]].id;
}
else t[x].mi=t[x].d,t[x].id=x;
}
void rev(int x){
swap(t[x].ch[],t[x].ch[]);
t[x].r^=;
}
void pushdown(int x){
if(t[x].r){
rev(t[x].ch[]),rev(t[x].ch[]);
t[x].r=;
}
}
void rotate(int x){
int y=t[x].fa,d=t[y].ch[]==x;
t[t[y].ch[d]=t[x].ch[!d]].fa=y;
if(nrt(y)) t[t[x].fa=t[y].fa].ch[t[t[y].fa].ch[]==y]=x;
else t[x].fa=t[y].fa;
t[t[x].ch[!d]=y].fa=x;
pushup(y);
}
void splay(int x){
int y=x,z=;
sta[++z]=y;
while(nrt(y)) y=t[y].fa,sta[++z]=y;
while(z) pushdown(sta[z--]); while(nrt(x)){
y=t[x].fa,z=t[y].fa;
// cout<<"splaying "<<x<<" "<<y<<" "<<z<<endl;
if(nrt(y)){
rotate(((t[z].ch[]==y)==(t[y].ch[]==x))?y:x);
}
rotate(x);
}
pushup(x);
}
void access(int x){
for(reg y=;x;y=x,x=t[x].fa){ splay(x);t[x].ch[]=y;pushup(x);
// cout<<" access xx "<<x<<" "<<t[x].fa<<endl;
}
}
void makert(int x){
access(x);splay(x);rev(x);
}
int findrt(int x){
access(x);splay(x);
// cout<<" after splay "<<x<<endl;
pushdown(x);
while(t[x].ch[]) {
x=t[x].ch[],pushdown(x);
// cout<<"findrt xx "<<x<<endl;
}
splay(x);
return x;
}
int link(int x,int y,int d){
// cout<<" link "<<x<<" "<<y<<" : "<<d<<" cnt "<<cnt<<endl;
makert(x);
// cout<<" makert "<<endl;
++cnt;
t[cnt].d=d;
t[cnt].id=cnt;
t[cnt].mi=d;
if(findrt(y)!=x){
// cout<<" new "<<endl;
access(y);splay(y);
t[x].fa=cnt;
t[cnt].fa=y;
return ;
}
pushup(x);
splay(x);
int kil=t[x].id;
int lp=t[x].mi;
// cout<<" ---------------------kil "<<kil<<endl;
splay(kil);
// cout<<" kilfa "<<t[kil].fa<<endl;
t[t[kil].ch[]].fa=;
t[t[kil].ch[]].fa=;
makert(x);
splay(x);splay(y);
t[x].fa=cnt;
t[cnt].fa=y;
//cout<<" t[x].id "<<t[x].id<<" t[y].id "<<t[y].id<<endl;
return lp;
}
}
int main(){
lct::t[].id=-;
lct::t[].d=inf;
lct::t[].mi=inf;
rd(n);rd(m);rd(k);rd(typ);
for(reg i=;i<=n;++i) lct::t[i].d=inf,lct::t[i].id=-,lct::t[i].mi=inf;
lct::cnt=n;
int x,y;
for(reg i=;i<=m;++i){
rd(x);rd(y);
if(x!=y) ti[i]=lct::link(x,y,i);
else ti[i]=i;
//cout<<" ii "<<i<<" "<<ti[i]<<endl;
}
for(reg i=;i<=m;++i){
seg::add(i,ti[i]);
}
int l,r;
int las=;
while(k--){
rd(l);rd(r);
if(typ==) l^=las,r^=las;
int tmp=seg::query(seg::rt[r],seg::rt[l-],,m,,l-);
printf("%d\n",n-tmp);
las=n-tmp;
}
return ;
} }
signed main(){
//freopen("data.in","r",stdin);
// freopen("my.out","w",stdout);
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2018/12/30 21:24:18
*/

思路和区间数颜色挺像的!都是把贡献放在第一个能贡献的位置统计上!

并且方法也是类似的:离线:排序扫描线+树状数组,在线:主席树

Codechef MARCH14 GERALD07加强版的更多相关文章

  1. 【BZOJ-3514】Codechef MARCH14 GERALD07加强版 LinkCutTree + 主席树

    3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 1288  Solved: 490 ...

  2. BZOJ 3514: Codechef MARCH14 GERALD07加强版( LCT + 主席树 )

    从左到右加边, 假如+的边e形成环, 那么记下这个环上最早加入的边_e, 当且仅当询问区间的左端点> _e加入的时间, e对答案有贡献(脑补一下). 然后一开始是N个连通块, 假如有x条边有贡献 ...

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

    3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 2023  Solved: 778 ...

  4. BZOJ 3514: Codechef MARCH14 GERALD07加强版 [LCT 主席树 kruskal]

    3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 1312  Solved: 501 ...

  5. [BZOJ 3514]Codechef MARCH14 GERALD07加强版 (CHEF AND GRAPH QUERIES)

    [BZOJ3514] Codechef MARCH14 GERALD07加强版 (CHEF AND GRAPH QUERIES) 题意 \(N\) 个点 \(M\) 条边的无向图,\(K\) 次询问保 ...

  6. [BZOJ3514]CodeChef MARCH14 GERALD07加强版(LCT+主席树)

    3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 2177  Solved: 834 ...

  7. bzoj3514 Codechef MARCH14 GERALD07加强版 lct预处理+主席树

    Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 1951  Solved: 746[Submi ...

  8. BZOJ3514 : Codechef MARCH14 GERALD07加强版

    以边编号为权值 用Link-cut Tree维护最大生成树 对于新加的第i条边(u,v) a[i]表示当a[i]这条边加入后连通块个数会减少 若u==v则a[i]=m 若u与v不连通则连上,a[i]= ...

  9. BZOJ 3514 Codechef MARCH14 GERALD07加强版

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3514 题意:给出一个图m条边.每次询问只加入编号在区间[L,R]之内的边有多少连通 ...

  10. 【bzoj3514】Codechef MARCH14 GERALD07加强版

    hzwer上少有的几道需要建一下模的 要不是有这么几道题 我都觉得lct只会考裸题了呢 题解看hzwer吧 http://hzwer.com/4358.html 唯一蛋疼的就是为了处理0这个呵呵的位置 ...

随机推荐

  1. 「日常训练」COMMON 约数研究(HYSBZ-1968)

    题意与分析 感谢https://www.cnblogs.com/Leohh/p/7512960.html的题解.这题话说原来不在我的训练范围,正好有个同学问我,我就拿来做做.数学果然不是我擅长的啊,这 ...

  2. 第八模块:算法&设计模式、企业应用 第1章 常用算法&设计模式学习

    第八模块:算法&设计模式.企业应用 第1章 常用算法&设计模式学习

  3. Click Once使用总结

    做了一个CS结构软件,有十几个用户使用的客户端,因为刚开始试用期间,要不断根据用户使用情况修正问题和添加新功能,所以频繁更新是不可避免的,暂时没有深入去研究软件更新,暂时采取的方式是用户通过FTP自行 ...

  4. Hexo 博客 之 腾讯云部署过程

    写在前面 Hexo 博客搭好了有差不多两周时间了,这期间走了很多弯路,跳了很多坑.一些坑自己 bing 到了答案,找到了解决方法,一些坑则是自己摸索出来的解决方法.现在准备写几篇关于搭建流程.搭建过程 ...

  5. Java三种编译方式

    Java程序代码需要编译后才能在虚拟机中运行,编译涉及到非常多的知识层面:编译原理.语言规范.虚拟机规范.本地机器码优化等:了解编译过程有利于了解整个Java运行机制,不仅可以使得我们编写出更优秀的代 ...

  6. Java算法2

    实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 分析:若从前向后遍历的话,那Happy后面 ...

  7. WCF:REST + Basic authentification + IIS

    近期一个项目中用到Restful WCF提供服务,但是需要验证机制,网上搜刮了一些,都是太复杂.FQ找到了一篇不错的文章分享一下. 原地址连接:http://vgolovchenko.wordpres ...

  8. 【Machine Learning】如何处理机器学习中的非均衡数据集?

    在机器学习中,我们常常会遇到不均衡的数据集.比如癌症数据集中,癌症样本的数量可能远少于非癌症样本的数量:在银行的信用数据集中,按期还款的客户数量可能远大于违约客户的样本数量.   比如非常有名的德国信 ...

  9. nordic mesh 任务调度实现

    nordic mesh 任务调度实现 nordic mesh的任务调度室基于定时器实现的,有两个链表结构维护任务. 需要注意的是,任务调度的部分接口只能在"bearer event" ...

  10. Entity Framework 基本概念

    概念 LINQ to Entities 一种 LINQ 技术,使开发人员可以使用 LINQ 表达式和 LINQ 标准查询运算符,针对实体数据模型 (EDM) 对象上下文创建灵活的强类型化查询. ESQ ...