首页 > 其他分享 >BZOJ 4320(ShangHai2006 Homework-询问分段+并查集)

BZOJ 4320(ShangHai2006 Homework-询问分段+并查集)

时间:2022-10-24 19:35:55浏览次数:59  
标签:ShangHai2006 int 4320 查集 father long getfather include define


Description

1:在人物集合 S 中加入一个新的程序员,其代号为 X,保证 X 在当前集合中不存在。
2:在当前的人物集合中询问程序员的mod Y 最小的值。 (为什么统计这个?因为拯救
过世界的人太多了,只能取模)
Input

第一行为用空格隔开的一个个正整数 N。
接下来有 N 行,若该行第一个字符为“A” ,则表示操作 1;若为“B”,表示操作 2;
其中 对于 100%的数据:N≤100000, 1≤X,Y≤300000,保证第二行为操作 1。
Output

对于操作 2,每行输出一个合法答案。
Sample Input

5

A 3

A 5

B 6

A 9

B 4

Sample Output

3

1

HINT

【样例说明】

在第三行的操作前,集合里有 3、5 两个代号,此时 mod 6 最小的值是 3 mod 6 = 3;

在第五行的操作前,集合里有 3、5、9,此时 mod 4 最小的值是 5 mod 4 = 1;

询问分段+并查集
对于Y≤3000−−−−√我们暴力更新
大于的,我们查询离1,Y,2Y..往后出现的第一个数(并查集或set都可以)

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<cctype>
#include<ctime>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Lson (x<<1)
#define Rson ((x<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (100000007)
#define MAXN (300000+10)
long long mul(long long a,long long b){return (a*b)%F;}
long long add(long long a,long long b){return (a+b)%F;}
long long sub(long long a,long long b){return (a-b+(a-b)/F*F+F)%F;}
typedef long long ll;
class bingchaji
{
public:
int father[MAXN],n,cnt;
void mem(int _n)
{
n=cnt=_n;
For(i,n) father[i]=i;
}
int getfather(int x)
{
if (father[x]==x) return x;

return father[x]=getfather(father[x]);
}
void unite(int x,int y)
{
x=getfather(x);
y=getfather(y);
if (x^y) {
--cnt;
father[x]=y;
}
}
bool same(int x,int y)
{
return getfather(x)==getfather(y);
}
}S;
const int N=300000,B=sqrt(300000);
int opt[MAXN],a[MAXN],mn[MAXN],ans[MAXN];
int main()
{
// freopen("bzoj4320.in","r",stdin);
// freopen(".out","w",stdout);
int n;
scanf("%d\n",&n);
S.mem(N+1); MEMI(mn) MEMI(ans)
For(i,N) S.father[i]=i+1;
For(i,n) {
char c;int p;
scanf("%c %d\n",&c,&p);
opt[i]=c-'A';a[i]=p;
if (c=='A') {
S.father[p]=p;
For(j,B) mn[j]=min(mn[j],p%j);
}else {
if (p<=B) ans[i]=mn[a[i]];
}
}
ForD(i,n) {
if (!opt[i]) {
S.father[a[i]]=a[i]+1;
} else {
if (a[i]>B) {
ans[i]=S.getfather(1)%a[i];
for(int j=a[i];j<=N;j+=a[i]) {
int p=S.getfather(j);
if (p<=N) ans[i]=min(ans[i],p%a[i]);
}
}
}
}
For(i,n) if (opt[i]) printf("%d\n",ans[i]);
return 0;
}


标签:ShangHai2006,int,4320,查集,father,long,getfather,include,define
From: https://blog.51cto.com/u_15724837/5791028

相关文章

  • BZOJ 4551([Tjoi2016&Heoi2016]树-倒序并查集)
    Description在2016年,佳媛姐姐刚刚学习了树,非常开心。现在他想解决这样一个问题:给定一颗有根树(根为1),有以下两种操作:1.标记操作:对某个结点打上标记(在最开始,只有结点1有标记......
  • 并查集
    并查集1.     将两个集合合并2.     询问两个元素是否在一个集合当中近乎O(1)的时间复杂度之内每一个集合用树的形式来维护,根节点的编号代表这个集合,每......
  • 种类并查集学习笔记(CF1290C)
    这题一眼种类并查集(,虽然我最开始没看出来并且也不熟悉种类并查集好吧,其实是,我们不难发现,一个\(S_i\)最多只会对应两个\(m_i\)然后这两个\(m_i\)之间的关系是双向......
  • 【蓝桥杯】考前押题--并查集
    ......
  • AcWing1251 打击罪犯--并查集
    #include<bits/stdc++.h>#definepbpush_back#definefifirst#definesesecond#defineall(x)(x).begin(),(x).end()#defineSZ(x)(int)(x).size()usingnam......
  • 并查集的启发式合并
    背景:遇到一个题要用到,所以总结一下概述启发式合并的本质其实就是把size小的集合合并到size大的集合里面一般在需要查询并查集内元素或合并集合的时候可能会用到启发式......
  • 森林与并查集
    相关算法合并的时间复杂度查找的时间复杂度Quick-Find算法O(N)O(1)Quick-Union算法O(lgN)~O(N)O(lgN)~O(N)Weighted按质优化O(lgN)O(lgN)路径压......
  • Codeforces Round #747 (Div. 2) D // 扩展域并查集
    题目来源:CodeforcesRound#747(Div.2)D-TheNumberofImposters题目链接:Problem-D-Codeforces题意有\(n\)个人,每个人拥有\(imposter\)或\(crewmate\)的身份......
  • 洛谷P4320 道路相遇(LCA+圆方树)
    题目链接:https://www.luogu.com.cn/problem/P4320道路相遇题目描述在H国的小w决定到从城市$u$到城市$v$旅行,但是此时小c由于各种原因不在城市$u$,但是小c决......
  • P3402 可持久化并查集
    P3402通过主席树维护不同版本的并查集,注意要采用按秩合并的方式,路径压缩可能会爆。1#include<bits/stdc++.h>2usingnamespacestd;3constintN=3e5+10;......