这道题有这样一个解法:

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

#include<cstdio>
#include<cctype>
#include<cstring>
#define lc ch[x][0]
#define rc ch[x][1]
#include<algorithm>
using namespace std;
inline int read()
{
int x=,f=;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-;
for(;isdigit(c);c=getchar()) x=x*+c-'';
return x*f;
}
const int maxn=;
const int maxnode=;
const int INF=;
int fa[maxn],pre[maxn],mn[maxn],val[maxn],flip[maxn],ch[maxn][];
void maintain(int x)
{
mn[x]=x;
if(val[mn[lc]]<val[mn[x]]) mn[x]=mn[lc];
if(val[mn[rc]]<val[mn[x]]) mn[x]=mn[rc];
}
void pushdown(int x)
{
if(!flip[x]) return;
flip[lc]^=;flip[rc]^=;
swap(lc,rc);flip[x]=;
}
void rotate(int x,int d)
{
pushdown(x);int y=pre[x],z=pre[y];
ch[y][d^]=ch[x][d];pre[ch[x][d]]=y;
ch[z][ch[z][]==y]=x;pre[x]=z;
ch[x][d]=y;pre[y]=x;maintain(y);
}
void splay(int x)
{
int rt=x;while(pre[rt]) rt=pre[rt];
if(rt!=x)
{
fa[x]=fa[rt];fa[rt]=;
while(pre[x]) pushdown(pre[x]),rotate(x,ch[pre[x]][]==x);
maintain(x);
}
else pushdown(x);
}
void access(int x)
{
for(int y=;x;x=fa[x])
{
splay(x);pre[ch[x][]]=;fa[ch[x][]]=x;
ch[x][]=y;pre[y]=x;fa[y]=;
maintain(x);y=x;
}
}
void makeroot(int x) {access(x);splay(x);flip[x]^=;}
void link(int x,int y){makeroot(x);fa[x]=y;}
void cut(int x,int y)
{
makeroot(x);access(y);splay(y);
pre[ch[y][]]=;ch[y][]=;maintain(y);
}
int find(int x)
{
access(x);splay(x);
while(ch[x][]) x=ch[x][];
return x;
}
int query(int x,int y)
{
makeroot(x);access(y);splay(y);
return mn[y];
}
int u[maxn],v[maxn],f[maxn],root[maxn],ToT;
int ls[maxnode],rs[maxnode],s[maxnode];
void build(int& y,int x,int l,int r,int pos)
{
s[y=++ToT]=s[x]+;if(l==r) return;
ls[y]=ls[x];rs[y]=rs[x];int mid=l+r>>;
if(pos<=mid) build(ls[y],ls[x],l,mid,pos);
else build(rs[y],rs[x],mid+,r,pos);
}
int query(int y,int l,int r,int pos)
{
if(l==r) return s[y];
int mid=l+r>>;
if(pos<=mid) return query(ls[y],l,mid,pos);
return query(rs[y],mid+,r,pos)+s[ls[y]];
}
int main()
{
int n=read(),m=read(),q=read();
for(int i=;i<=n;i++) val[i]=INF;
for(int i=;i<=m;i++)
{
u[i]=read();v[i]=read();val[i+n]=i;
if(u[i]==v[i]) {f[i]=i;continue;}
if(find(u[i])!=find(v[i])) link(u[i],i+n),link(i+n,v[i]);
else
{
int k=query(u[i],v[i]);f[i]=k-n;
cut(u[k-n],k);cut(k,v[k-n]);
link(u[i],i+n);link(i+n,v[i]);
}
}
for(int i=;i<=m;i++) build(root[i],root[i-],,m,f[i]);
while(q--)
{
int l=read(),r=read();
printf("%d\n",n-query(root[r],,m,l-)+query(root[l-],,m,l-));
}
return ;
}

COJ1013 : WZJ的数据结构(十三)的更多相关文章

  1. COJ1013 WZJ的数据结构(十三)

    WZJ的数据结构(十三) 难度级别:D: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个节点的有根树(根节点为1),每个节点有权 ...

  2. COJ967 WZJ的数据结构(负三十三)

    WZJ的数据结构(负三十三) 难度级别:C: 运行时间限制:7000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大 ...

  3. COJ 0967 WZJ的数据结构(负三十三)

    WZJ的数据结构(负三十三) 难度级别:E: 运行时间限制:7000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大 ...

  4. [COJ0985]WZJ的数据结构(负十五)

    [COJ0985]WZJ的数据结构(负十五) 试题描述 CHX有一个问题想问问大家.给你一个长度为N的数列A,请你找到两个位置L,R,使得A[L].A[L+1].…….A[R]中没有重复的数,输出R- ...

  5. [COJ0988]WZJ的数据结构(负十二)

    [COJ0988]WZJ的数据结构(负十二) 试题描述 输入 见题目,注意本题不能用文件输入输出 输出 见题目,注意本题不能用文件输入输出 输入示例 输出示例 数据规模及约定 1≤N≤1500,M≤N ...

  6. [COJ0989]WZJ的数据结构(负十一)

    [COJ0989]WZJ的数据结构(负十一) 试题描述 给出以下定义: 1.若子序列[L,R]的极差(最大值-最小值)<=M,则子序列[L,R]为一个均匀序列. 2.均匀序列[L,R]的权值为S ...

  7. COJ966 WZJ的数据结构(负三十四)

    WZJ的数据结构(负三十四) 难度级别:C: 运行时间限制:20000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给一棵n个节点的树,请对于形如"u  ...

  8. COJ970 WZJ的数据结构(负三十)

    WZJ的数据结构(负三十) 难度级别:D: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,点和边上均有权值.请你设计 ...

  9. COJ968 WZJ的数据结构(负三十二)

    WZJ的数据结构(负三十二) 难度级别:D: 运行时间限制:5000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,边上均有权值,每个点上有 ...

  10. COJ969 WZJ的数据结构(负三十一)

    WZJ的数据结构(负三十一) 难度级别:D: 运行时间限制:3000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 A国有两个主基站,供给全国的资源.定义一个主基站 ...

随机推荐

  1. 原创:分享asp.net伪静态成目录形式iis如何设置

    服务器租用详解asp.net伪静态成目录形式iis如何设置: 一.首先介绍一下asp.net伪静态成html后缀iis如何设置的 iis6 伪静态 iis配置方法 图解 1.右键点击 要设置网站的网站 ...

  2. java中四种阶乘的计算

    package com.zf.s2;//创建一个包   import java.math.BigInteger;//导入类 import java.util.ArrayList; import jav ...

  3. 获取网页文档的URL和连接来源

    <script type="text/javascript">document.write("链接来源:"+document.referrer+&q ...

  4. windows添加和删除服务

    删除系统服务,记得一定要小心用.避免删错sc delete 服务名 加入服务: sc create 服务名 binPath= 路径 start= auto

  5. 转数据库分库分表(sharding)系列(二) 全局主键生成策略

    本文将主要介绍一些常见的全局主键生成策略,然后重点介绍flickr使用的一种非常优秀的全局主键生成方案.关于分库分表(sharding)的拆分策略和实施细则,请参考该系列的前一篇文章:数据库分库分表( ...

  6. shell定时任务

    1.认识Croncron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业.由于Cron 是Linux的内置服务,但它不自动起来,可以用以下的方法启动.关闭这个服务:/sbin/se ...

  7. oracle 10g 学习之服务器端安装(1)

    Oracle 简介 lOracle 是殷墟出土的甲骨文(oracle bone inscriptions)的英文翻译的第一个单词 lOracle 公司是全球最大的信息管理软件及服务供应商,成立于197 ...

  8. SQL 替换指定列中的指定字符串

    Update 表名 Set 列名 = Replace(列名,‘被替换的字符’,‘要替换的字符’) Demo: UPDATE BPM_DailySET Workstation = REPLACE(Wor ...

  9. N个数的排列算法

    #include <stdio.h> int n = 0; //交换两个数void swap(int *a, int *b) { int m; m = *a; *a = *b; *b = ...

  10. 电赛菜鸟营培训(零)——Keil环境搭建

    一.Keil开发软件安装 1.安装keil软件 2.使用注册机进行破解 将方框内的ID号复制到注册机,然后得到License,放到最底下就可以完成了. 二.Keil工程搭建 表示参考数据手册,在这里建 ...