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. day14-python异常处理

    1.     异常 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行. 一般情况下,在Python无法正常处理程序时就会发生一个异常.异常是Python对象,表示一个错误.当Pyt ...

  2. windows文件映射

    0x01 使用文件映射实现共享内存. 用内存映射文件实现进程间的通讯:Windows中的内存映射文件的机制为我们高效地操作文件提供了一种途径,它允许我们在进程中保留一段内存区域,把硬盘或页文件上的目标 ...

  3. DevExpress ASP.NET Bootstrap Controls v18.2新功能详解(一)

    行业领先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式发布,本站将以连载的形式为大家介绍新版本新功能.本文将介绍了DevExpress ASP.NET Boot ...

  4. 201621123001 《Java程序设计》第14周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. Mysql数据库简单操作,常用的操作命令 启动:进入Mysql (从命令行mysql -u root -p) 退 ...

  5. 中文datepicker控件

    $(function() { $.datepicker.regional[, isRTL: !, showMonthAfterYear: !, yearSuffix: "年" } ...

  6. L252

    How often have you heard the saying, "Stop and smell the roses?" Odds are, you've come acr ...

  7. L245

    The State Council will lay down new rules that aim to make management compatible with internationall ...

  8. python3自学第二天,模块,三元运算

    1.模块的认识. sys模块,os模块等 如何引入模块 import os cmd_res1=os.system("dir") # 执行命令dir,不保存结果 print(cmd_ ...

  9. for&while循环

    流程控制: 1. if 2. while 3. for if判断 什么是if判断 判断一个条件成立则做...不成了则做... 为何要有if判断 让计算机像人一样具有判断的能力 什么是循环 循环指的是一 ...

  10. SpringMvc使用FastJson做为json的转换器(注解方式)

    在使用XML方式配置项目,使用fastjson做为Json转换器时通常的在XML内添加如下的配置: <mvc:message-converters register-defaults=" ...