절대적으로 완벽한 @amit는 C++ 여기에 구현
순위 당신이 O에 검색어 1을 반환 할 수 있도록 최대 제정 일의의를 유지하기위한 것입니다 (1) 시간은 업데이트하는 동안 SO1이 항상 최대 1을가집니다.
#include <bits/stdc++.h>
using namespace std;
typedef struct subset
{
int parent;
int rank;
}subset;
int find(subset subsets[], int i)
{
if (subsets[i].parent != i)
subsets[i].parent = find(subsets, subsets[i].parent);
return subsets[i].parent;
}
void Union(subset subsets[], int x, int y)
{
int xroot = find(subsets, x);
int yroot = find(subsets, y);
if(subsets[xroot].rank < subsets[yroot].rank)
{
subsets[xroot].parent = yroot;
subsets[yroot].rank += subsets[xroot].rank;
}
else if (subsets[xroot].rank > subsets[yroot].rank)
{
subsets[yroot].parent = xroot;
subsets[xroot].rank += subsets[yroot].rank;
}
else
{
subsets[yroot].parent = xroot;
subsets[xroot].rank+=subsets[yroot].rank;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n,k,i,q,t,sol=0;
cin >> n >> k;
string s;
cin >> s;
cin.ignore();
subset subsets[n];
for(i=0;i<n;i++)
{
subsets[i].parent = i;
subsets[i].rank = 0;
if(s[i]=='1')
{
subsets[i].rank = 1;
}
}
for(t=0;t<n;t++)
{
if(s[t] == '1' && t!=0 && t!=n-1)
{
if(s[t-1] == '1')
{
int x = find(subsets,t-1);
int y = find(subsets,t);
if(x!=y)
{
Union(subsets,t-1,t);
sol = max(sol,max(subsets[x].rank,subsets[y].rank));
sol = max(sol,subsets[t].rank);
}
}
if(s[t+1] == '1')
{
int x = find(subsets,t+1);
int y = find(subsets,t);
if(x!=y)
{
Union(subsets,t+1,t);
sol = max(sol,max(subsets[x].rank,subsets[y].rank));
sol = max(sol,subsets[t].rank);
}
}
}
if(s[t] == '1' && t==0)
{
if(s[t+1] == '1')
{
int x = find(subsets,t+1);
int y = find(subsets,t);
if(x!=y)
{
Union(subsets,t+1,t);
sol = max(sol,max(subsets[x].rank,subsets[y].rank));
sol = max(sol,subsets[t].rank);
}
}
}
if(s[t] == '1' && t==n-1)
{
if(s[t-1] == '1')
{
int x = find(subsets,t-1);
int y = find(subsets,t);
if(x!=y)
{
Union(subsets,t-1,t);
sol = max(sol,max(subsets[x].rank,subsets[y].rank));
sol = max(sol,subsets[t].rank);
}
}
}
sol = max(sol,subsets[t].rank);
}
for(i=0;i<k;i++)
{
cin >> q;
if(q==1)
{
cout << sol << endl;
}
else
{
cin >> t;
t--;
if(s[t] == '0' && t!=0 && t!=n-1)
{
s[t] = '1';
subsets[t].rank = 1;
if(s[t-1] == '1')
{
int x = find(subsets,t-1);
int y = find(subsets,t);
if(x!=y)
{
Union(subsets,t-1,t);
sol = max(sol,max(subsets[x].rank,subsets[y].rank));
sol = max(sol,subsets[t].rank);
}
}
if(s[t+1] == '1')
{
int x = find(subsets,t+1);
int y = find(subsets,t);
if(x!=y)
{
Union(subsets,t+1,t);
sol = max(sol,max(subsets[x].rank,subsets[y].rank));
sol = max(sol,subsets[t].rank);
}
//Union(subsets,t+1,t);
}
}
if(s[t] == '0' && t==0)
{
s[t] = '1';
subsets[t].rank = 1;
if(s[t+1] == '1')
{
int x = find(subsets,t+1);
int y = find(subsets,t);
if(x!=y)
{
Union(subsets,t+1,t);
sol = max(sol,max(subsets[x].rank,subsets[y].rank));
sol = max(sol,subsets[t].rank);
}
}
}
if(s[t] == '0' && t==n-1)
{
s[t] = '1';
subsets[t].rank = 1;
if(s[t-1] == '1')
{
int x = find(subsets,t-1);
int y = find(subsets,t);
if(x!=y)
{
Union(subsets,t-1,t);
sol = max(sol,max(subsets[x].rank,subsets[y].rank));
sol = max(sol,subsets[t].rank);
}
}
}
sol = max(sol,subsets[t].rank);
}
}
}
이것은이 운동을하기에 다소 깔끔한 방법입니다. 'xth-1'이 당신의 세트의 범위를 초과하지 않는지 확인해야합니다. –