https://vjudge.net/problem/CodeChef-GERALD07

可以用莫队+带撤销并查集做

错误记录:

1.调试时数组开小了,忘了改大就交了

2.88行和91行少了备份num(后来无意改了固定块大小才发现)

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>
#include<cassert>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
#define N 200000
int T,n,m,q;
struct Q
{
int l,r,num;
};
pii b[N+];
int ans[N+],sz,sz1;
int be[N+];
vector<Q> c[N+]; int fa[N+],dp[N+],num;
int bx[N*],bfa[N*],bdp[N*],mem;
int find(int x)
{
for(;x!=fa[x];x=fa[x]);
return x;
}
void unionn(int x,int y,int &nn)
{
x=find(x),y=find(y);
if(x==y) return;
num--;
if(dp[x]<dp[y]) fa[x]=y;
else
{
fa[y]=x;
if(dp[x]==dp[y]) dp[x]++;
}
}
void unionn_b(int x,int y,int &nn)
{
x=find(x),y=find(y);
if(x==y) return;
nn++;num--;
++mem;bx[mem]=x;bfa[mem]=fa[x];bdp[mem]=dp[x];
++mem;bx[mem]=y;bfa[mem]=fa[y];bdp[mem]=dp[y];
assert(mem<N*);
if(dp[x]<dp[y]) fa[x]=y;
else
{
fa[y]=x;
if(dp[x]==dp[y]) dp[x]++;
}
}
void backn(int &nn)
{
for(int i=;i<=nn;i++)
{
fa[bx[mem]]=bfa[mem];dp[bx[mem]]=bdp[mem];--mem;
fa[bx[mem]]=bfa[mem];dp[bx[mem]]=bdp[mem];--mem;
}
assert(mem==);
nn=;
} int main()
{
int i,j,j2,nn,l,r,tnum;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&q);sz=max(,int(sqrt(double(m)*m/q)));sz1=(m-)/sz;
for(i=;i<=sz1;i++) c[i].clear();
for(i=;i<=m;i++) be[i]=(i-)/sz;
num=n;
for(i=;i<=m;i++) scanf("%d%d",&b[i].fi,&b[i].se);
for(i=;i<=n;i++) fa[i]=i;
for(i=;i<=q;i++)
{
scanf("%d%d",&l,&r);
if(be[l]==be[r])
{
nn=;tnum=num;
for(j=l;j<=r;j++) unionn_b(b[j].fi,b[j].se,nn);
ans[i]=num;
backn(nn);num=tnum;
}
else c[be[l]].pb({l,r,i});
}
for(i=;i<=sz1;i++)
{
sort(c[i].begin(),c[i].end(),[](auto &a,auto &b){return a.r<b.r;});
l=(i+)*sz;r=l-;num=n;mem=;
for(j=;j<=n;j++) fa[j]=j;
for(j=;j<c[i].size();j++)
{
while(r<c[i][j].r) ++r,unionn(b[r].fi,b[r].se,nn);
tnum=num;nn=;
for(j2=l-;j2>=c[i][j].l;j2--) unionn_b(b[j2].fi,b[j2].se,nn);
ans[c[i][j].num]=num;
backn(nn);num=tnum;
}
}
for(i=;i<=q;i++) printf("%d\n",ans[i]);
}
return ;
}

最新文章

  1. Three ways to set specific DeviceFamily XAML Views in UWP
  2. In_interrupt( ) 和In_irq( )【转】
  3. 如何禁止KnockoutJs在VS2012的智能格式化
  4. failed with: java.lang.NullPointerException
  5. POJ1661 Help Jimmy
  6. linux的colrm命令
  7. linux tar使用
  8. Homestead 使用总结
  9. 浅谈:html5和html的区别
  10. 【linux】linux下网络的配置
  11. NodeJs之文件上传
  12. Golang 入门系列(十) mysql数据库的使用
  13. c++ 创建线程以及参数传递
  14. Idea的pom文件导入依赖包仍然报错
  15. 单元测试,模拟用户Get登陆,并携带登录后的token访问接口
  16. Laravel学习笔记之Session源码解析(下)
  17. 怎样自己定义注解Annotation,并利用反射进行解析
  18. python函数,模块及eclipse配置python开发环境
  19. java 面向对象 — 类和对象
  20. Maven使用Nexus私服的配置

热门文章

  1. ln: 正在创建指向“asm-arm”的符号链接“asm”: 不支持的操作
  2. 基于node+koa2+mongodb实现简单的导航管理系统
  3. sanic官方文档解析之静态文件和版本
  4. 初识Restful(学习笔记)
  5. Spring中的AOP(学习笔记)
  6. 实用API大全
  7. jQuery 怎么获取对象
  8. RK3288 GPIO 输出问题【转】
  9. AutoEventWireup
  10. hdu 1963 Investment 解题报告