hentai。。。

原题:

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

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

直接复制wulala的题解

wulala

葱娘说这是一个很巧妙的题。。
有一个比较猎奇的做法:首先把边依次加到图中,若当前这条边与图中的边形成了环,那么把这个环中最早加进来的边弹出去
并将每条边把哪条边弹了出去记录下来:ntr[i] = j,特别地,要是没有弹出边,ntr[i] = 0;
这个显然是可以用LCT来弄的对吧。
然后对于每个询问,我们的答案就是对l~r中ntr小于l的边求和,并用n减去这个值
正确性可以YY一下:
如果一条边的ntr >= l,那么显然他可以与从l ~ r中的边形成环,那么它对答案没有贡献
反之如果一条边的ntr < l那么它与从l ~ r中的边是不能形成环的,那么他对答案的贡献为-1
对于查询从l ~ r中有多少边的ntr小于l,我反正是用的函数式线段树

好妙啊

ntr。。。真是hentai,让我传承传承了hentai的po姐美好的意境吧

这题我写了一下午

T?WA我也认了T什么鬼啊
然后找rxz要来70M的数据。。。
突然想起来有些点是强制在线的,然后感觉就是我WA了
但是我把不强制在线的数据跑一下答案没错啊?
又从头到尾查一下,找不到毛病啊?
然后gdb,跟踪到第一个数据的时候……
一拍脑袋,发现last_ans没设初值。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

代码:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int inf=(int)1e9;
int rd(){int z=; char ch=getchar();
while(ch<''||ch>'') ch=getchar();
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z;
}
struct edg{int x,y;}e[];
int n,m,o,mk;
int fth[],chd[][],v[],mnv[],rvs[];
int stck[],tp=;
int ntr[],c[];
int w[],cwd[][],rts[],ndc=;
inline bool isrt(int x){ return (chd[fth[x]][]!=x)&(chd[fth[x]][]!=x);}
inline void pshu(int x){ mnv[x]=min(v[x],min(mnv[chd[x][]],mnv[chd[x][]]));}
inline void pshd(int x){
if(!rvs[x]) return ;
rvs[chd[x][]]^=,rvs[chd[x][]]^=,rvs[x]=;
swap(chd[x][],chd[x][]);
}
void rtt(int x){
int y=fth[x],z=fth[fth[x]],l,r;
r=(chd[y][]==x); l=r^;
if(!isrt(y)) chd[z][chd[z][]==y]=x;
fth[x]=z,fth[y]=x,fth[chd[x][r]]=y;
chd[y][l]=chd[x][r],chd[x][r]=y;
pshu(y),pshu(x);
}
void sply(int x){
stck[tp=]=x;
for(int i=x;!isrt(i);i=fth[i]) stck[++tp]=fth[i];
while(tp) pshd(stck[tp--]);
while(!isrt(x)){
if(!isrt(fth[x])) rtt((chd[fth[x]][]==x)^(chd[fth[fth[x]]][]==fth[x])?x:fth[x]);
rtt(x);
}
}
inline void accs(int x){ for(int i=;x;sply(x),chd[x][]=i,pshu(x),x=fth[i=x]);}
inline void qdrt(int x){ accs(x),sply(x),rvs[x]^=;}
inline void ct(int x,int y){ qdrt(x),accs(y),sply(y),chd[y][]=fth[x]=;}
inline void lk(int x,int y){ qdrt(x),fth[x]=y,sply(x);}
inline int gtrt(int x){ while(fth[x]) x=fth[x]; return x;}
inline int sch(int x,int y){ qdrt(x),accs(y),sply(y); return mnv[y];}
void ist(int x){
if(e[x].x==e[x].y){ ntr[x]=x; return ;}
if(gtrt(e[x].x)==gtrt(e[x].y)){
ntr[x]=sch(e[x].x,e[x].y);
ct(n+ntr[x],e[ntr[x]].x),ct(n+ntr[x],e[ntr[x]].y);
mnv[n+ntr[x]]=inf;
}
mnv[n+x]=v[n+x]=x;
lk(n+x,e[x].x),lk(n+x,e[x].y);
}
/*int bnrsch(int x){
int l=1,r=m,md;
while(l+1<r) md=(l+r)>>1,(c[md]>=x ? l : r)=md;
return c[md]==l ? l : r;
}*/
int gtsgmttr(int l,int r){
int x=++ndc,md=(l+r)>>;
if(l!=r) cwd[x][]=gtsgmttr(l,md),cwd[x][]=gtsgmttr(md+,r);
return x;
}
int mdf(int x,int l,int r,int y,int z){
w[++ndc]=w[x],cwd[ndc][]=cwd[x][],cwd[ndc][]=cwd[x][],x=ndc;
if(l==r){ w[x]+=z; return x;}
int md=(l+r)>>;
if(y<=md) cwd[x][]=mdf(cwd[x][],l,md,y,z);
else cwd[x][]=mdf(cwd[x][],md+,r,y,z);
w[x]=w[cwd[x][]]+w[cwd[x][]];
return x;
}
int qur(int x,int l,int r,int ql,int qr){
if(l==ql && r==qr) return w[x];
int md=(l+r)>>;
if(ql<=md && qr>md) return qur(cwd[x][],l,md,ql,md)+qur(cwd[x][],md+,r,md+,qr);
else if(qr<=md) return qur(cwd[x][],l,md,ql,qr);
else return qur(cwd[x][],md+,r,ql,qr);
}
int main(){//freopen("ddd.in","r",stdin);
//freopen("ddd.out","w",stdout);
int l,r,lst;
cin>>n>>m>>o>>mk;
fill(mnv,mnv+m+n+,inf),fill(v,v+m+n+,inf);
for(int i=;i<=m;++i) e[i].x=rd(),e[i].y=rd(),ist(i);
/*for(int i=1;i<=m;++i) c[i]=ntr[i];
sort(c+1,c+m+1);
for(int i=1;i<=m;++i) ntr[i]=bnrsch(ntr[i]);*/
rts[]=gtsgmttr(,m);
for(int i=;i<=m;++i) rts[i]=mdf(rts[i-],,m,ntr[i],);
lst=;
for(int i=;i<=o;++i){
l=rd()^(mk*lst),r=rd()^(mk*lst);
printf("%d\n",lst=n-qur(rts[r],,m,,l-)+qur(rts[l-],,m,,l-));
}
return ;
}

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

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

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

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

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

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

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

  4. BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3514 题意概括 N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. N ...

  5. BZOJ3514 : Codechef MARCH14 GERALD07加强版

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

  6. 沉迷Link-Cut tree无法自拔之:[BZOJ3514] Codechef MARCH14 GERALD07 加强版

    来自蒟蒻 \(Hero \_of \_Someone\) 的 \(LCT\) 学习笔记 $ $ 又是一道骚题...... 先讲一个结论: 假设我们用 \(LCT\) 来做这道题, 在插入边 \(i\) ...

  7. BZOJ3514: Codechef MARCH14 GERALD07加强版【LCT】【主席树】【思维】

    Description N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. Input 第一行四个整数N.M.K.type,代表点数.边数.询问数以及询问是否加密. 接下来 ...

  8. BZOJ3514: Codechef MARCH14 GERALD07加强版(LCT,主席树)

    Description N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. Input 第一行四个整数N.M.K.type,代表点数.边数.询问数以及询问是否加密.接下来M ...

  9. BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT+可持久化线段树

    自己独自想出来并切掉还是很开心的~ Code: #include <bits/stdc++.h> #define N 400005 #define inf 1000000000 #defi ...

  10. BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT维护最大生成树 主席树

    题面 考虑没有询问,直接给你一个图问联通块怎么做. 并查集是吧. 现在想要动态地做,那么应该要用LCT. 考虑新加进来一条边,想要让它能够减少一个联通块的条件就是现在边的两个端点还没有联通. 如果联通 ...

随机推荐

  1. AngularJs和Vue比较

    http://jimhoskins.com/2012/12/17/angularjs-and-apply.html

  2. 怎么搜索sci论文。

    进入清华大学图书馆,选择常用数据库,找到 Web of Science平台(SCI/SSCI/AHCI.ISTP/ISSHP.DII.JCR.BP.CCC.CCR/IC.ESI.INSPEC…)即可. ...

  3. UI控件Telerik UI for WinForms发布R1 2019|附下载

    Telerik UI for WinForms拥有适用Windows Forms的110多个令人惊叹的UI控件.所有的UI for WinForms控件都具有完整的主题支持,可以轻松地帮助开发人员在桌 ...

  4. ios隐藏头部状态栏级tableview头部控件

    - (BOOL)prefersStatusBarHidden { return YES; } self.tableView.separatorColor = [UIColor colorWithRed ...

  5. Python socket简单操作

    #服务端:#导入socket模块 import socket #创建socket对象,创建了一个手机 server = socket.socket() #给程序设置一个ip地址和端口号,买了个手机卡 ...

  6. <转载> VUE项目中CSS管理

    vue的scoped 在vue项目中,当 .vue文件中 <style> 标签有 *scoped 属性时,它的 CSS 只作用于当前组件中的元素,很好的实现了样式私有化的目的. 使用sco ...

  7. 【Python】数据库练习-2

    1.    数据库一般作为存储作用,一般不用函数操作 2.    一次插入多条数据

  8. 对于maven的一些命令

  9. Spring Boot 揭秘与实战(九) 应用监控篇 - 自定义监控端点

    文章目录 1. 继承 AbstractEndpoint 抽象类 2. 创建端点配置类 3. 运行 4. 源代码 Spring Boot 提供的端点不能满足我们的业务需求时,我们可以自定义一个端点. 本 ...

  10. spring-dao.xml配置问题(一)

    问题描述:对mapper扫描器进行配置时,sqlSessionFactory依赖报错 <!-- 配置sqlSessionFactory --> <bean id="sqlS ...