标签:
离线处理,并查集
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 100005; struct Node{ int id,value; }node[maxn],input[maxn]; bool cmp(Node p,Node q){ return p.value > q.value; } int p[maxn],vis[maxn],fa[maxn],num[maxn],ans[maxn]; int n,m,cnt; int find_father(int u){ return fa[u] == u ? u : fa[u] = find_father(fa[u]); } void init(){ for(int i = 1; i <= n; i++){ fa[i] = i; num[i] = 1; } memset(vis,0,sizeof(vis)); sort(node + 1,node + 1 + n, cmp); for(int i = 1; i <= n; i++) p[node[i].id] = i; cnt = 0; } void solve(){ sort(input,input + cnt,cmp); int ret = 0; int j = 1; for(int i = 0; i < cnt; i++){ int t = input[i].id; for(;j <= n && node[j].value >= input[i].value; j++){ ret = max(ret,1); int pos = node[j].id; vis[pos] = 1; int lpos = pos - 1,rpos = pos + 1; if(lpos >= 1 && vis[lpos]){ int f1 = find_father(pos); int f2 = find_father(lpos); if(f1 != f2){ if(f1 > f2) swap(f1,f2); num[f1] += num[f2]; fa[f2] = f1; ret = max(ret,num[f1]); } } if(rpos <= n && vis[rpos]){ int f1 = find_father(pos); int f2 = find_father(rpos); if(f1 != f2){ if(f1 > f2) swap(f1,f2); num[f1] += num[f2]; fa[f2] = f1; ret = max(ret,num[f1]); } } } ans[t] = ret; } for(int i = 0; i < cnt; i++) printf("%d\n",ans[i]); } void read(){ int op,a,b; init(); for(int i = 0; i < m; i++){ scanf("%d",&op); if(op == 1){ input[cnt].id = cnt; scanf("%d",&input[cnt++].value); } else{ solve(); scanf("%d%d",&a,&b); node[p[a]].value = b; init(); } } solve(); } int main(){ while(scanf("%d%d",&n,&m) != EOF){ for(int i = 1; i <= n; i++){ node[i].id = i; scanf("%d",&node[i].value); } read(); } return 0; }
标签:
原文地址:http://blog.csdn.net/u013451221/article/details/45750137