【BZOJ3514】 Codechef MARCH14 GERALD07加强版
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加强版的更多相关文章
- [BZOJ3514]CodeChef MARCH14 GERALD07加强版(LCT+主席树)
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 2177 Solved: 834 ...
- 【LCT+主席树】BZOJ3514 Codechef MARCH14 GERALD07加强版
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 2023 Solved: 778 ...
- bzoj3514 Codechef MARCH14 GERALD07加强版 lct预处理+主席树
Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1951 Solved: 746[Submi ...
- BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3514 题意概括 N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. N ...
- BZOJ3514 : Codechef MARCH14 GERALD07加强版
以边编号为权值 用Link-cut Tree维护最大生成树 对于新加的第i条边(u,v) a[i]表示当a[i]这条边加入后连通块个数会减少 若u==v则a[i]=m 若u与v不连通则连上,a[i]= ...
- 沉迷Link-Cut tree无法自拔之:[BZOJ3514] Codechef MARCH14 GERALD07 加强版
来自蒟蒻 \(Hero \_of \_Someone\) 的 \(LCT\) 学习笔记 $ $ 又是一道骚题...... 先讲一个结论: 假设我们用 \(LCT\) 来做这道题, 在插入边 \(i\) ...
- BZOJ3514: Codechef MARCH14 GERALD07加强版【LCT】【主席树】【思维】
Description N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. Input 第一行四个整数N.M.K.type,代表点数.边数.询问数以及询问是否加密. 接下来 ...
- BZOJ3514: Codechef MARCH14 GERALD07加强版(LCT,主席树)
Description N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. Input 第一行四个整数N.M.K.type,代表点数.边数.询问数以及询问是否加密.接下来M ...
- BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT+可持久化线段树
自己独自想出来并切掉还是很开心的~ Code: #include <bits/stdc++.h> #define N 400005 #define inf 1000000000 #defi ...
- BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT维护最大生成树 主席树
题面 考虑没有询问,直接给你一个图问联通块怎么做. 并查集是吧. 现在想要动态地做,那么应该要用LCT. 考虑新加进来一条边,想要让它能够减少一个联通块的条件就是现在边的两个端点还没有联通. 如果联通 ...
随机推荐
- mybatis输出sql语句
方法一: 这种方法是mybatis官网上介绍的,比较好用: log4j.properties: log4j.rootLogger=ERROR,consolelog4j.appender.console ...
- python nltk 安装及配置说明
本教程采用pip安装方式,前期需要在本机安装setuptools 及pip 网上铺天盖地的说了很多关于nltk的说明,特别是后期nltk_data 手动下载操作,多数都不好使,这里整理 用pip安装n ...
- node 慕课笔记
global global.testVar2 = 200; 在别的文件中可以任意调用到 因为global是全局变量相当于js的window一样的
- eclipse搭建ssm框架
新建数据库ssm 建立数据库表user CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT , `sex` varchar(255) ...
- h5视频配置
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 代码改变世界 | 如何封装一个简单的 Koa
下面给大家带来:封装一个简单的 Koa Koa 是基于 Node.js 平台的下一代 web 开发框架 Koa 是一个新的 web 框架,可以快速而愉快地编写服务端应用程序,本文将跟大家一起学习:封装 ...
- 高级数据类型--列表[list]
List(列表) 是 Python 中使用 最频繁 的数据类型,在其他语言中通常叫做 数组,专门用于存储 一串 信息,列表用 [] 定义,数据 之间使用 , 分隔,列表的 索引 从 0 开始. nam ...
- python短域名数据分析框架
本文数据源及分析方法均参考<利用python进行数据分析>一书.但我重新对数据分析目标和步骤进行了组织,可以更加清晰的呈现整个挖掘分析流程. 分析对象为美国某短域名网站记录的短域名生成数据 ...
- java学习笔记17(Calendarl类)
Calendar类:(日历) 用法:Calendar是一个抽象类:不能实例化(不能new),使用时通过子类完成实现,不过这个类不需要创建子类对象,而是通过静态方法直接获取: 获取对象方法:getIns ...
- c++下基于windows socket的多线程服务器(基于TCP协议)
之前用c++实现过基于windows socket的单线程TCP服务器(http://www.cnblogs.com/jzincnblogs/p/5170230.html),今天实现了一个多线程的版本 ...