http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1573
bitset真的神奇,这是我写的第三道用bitset的题了,感觉bitset以后会成为一个常用的容器,记笔记记笔记。
bitset的复杂度学长说是len/32. 所以可以在很低的时间复杂度内完成状态的转移和数据的记录。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
#include<deque>
#include<bitset>
#include<vector>
using namespace std;
const int MOD=1e9+7;
const int MAX=2005;
bitset<100005> bit[MAX];
vector<int> V[2005];
int sizes[MAX];
int par[MAX];
int finds(int x)
{
if(par[x]==x)
return x;
else
return par[x]=finds(par[x]);
}
void unit(int x,int y)
{
x=finds(x),y=finds(y);
if(x==y) return ;
if(V[y].size()>V[x].size())
swap(x,y);
for(int i=V[y].size()-1;i>=0;i--)
{
V[x].push_back(V[y][i]);
bit[x]|=bit[x]<<V[y][i];
}
par[y]=x;
}
void init()
{
for(int i=0;i<1005;i++)
{
par[i]=i;
}
}
int main()
{
int n;
scanf("%d",&n);
init();
int cnt;
for(int i=0;i<n;i++)
{
scanf("%d",&cnt);
bit[i][cnt]=bit[i][0]=1;
V[i].push_back(cnt);
}
int Q;
scanf("%d",&Q);
int op,l,r;
while(Q--)
{
scanf("%d",&op);
if(op==2)
{
scanf("%d",&l);
printf("%d\n",bit[finds(l-1)].count());
}
else
{
scanf("%d %d",&l,&r);
unit(l-1,r-1);
}
//cout<<"Q:"<<Q<<endl;
}
}