Chef and Graph Queries CodeChef - GERALD07
2024-08-26 14:51:22
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 ;
}
最新文章
- Three ways to set specific DeviceFamily XAML Views in UWP
- In_interrupt( ) 和In_irq( )【转】
- 如何禁止KnockoutJs在VS2012的智能格式化
- failed with: java.lang.NullPointerException
- POJ1661 Help Jimmy
- linux的colrm命令
- linux tar使用
- Homestead 使用总结
- 浅谈:html5和html的区别
- 【linux】linux下网络的配置
- NodeJs之文件上传
- Golang 入门系列(十) mysql数据库的使用
- c++ 创建线程以及参数传递
- Idea的pom文件导入依赖包仍然报错
- 单元测试,模拟用户Get登陆,并携带登录后的token访问接口
- Laravel学习笔记之Session源码解析(下)
- 怎样自己定义注解Annotation,并利用反射进行解析
- python函数,模块及eclipse配置python开发环境
- java 面向对象 — 类和对象
- Maven使用Nexus私服的配置