社区讨论

即将退役的菜鸡疯狂RE求助

P4197[ONTAK2010] Peaks参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mi6y9bad
此快照首次捕获于
2025/11/20 12:47
4 个月前
此快照最后确认于
2025/11/20 12:47
4 个月前
查看原帖
线段树离线合并联通块,不知道为何RE,恳请大佬查错谢谢QAQ
CPP
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cctype>
#include <vector>
#include <queue>
#include <utility>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/hash_policy.hpp>
#define ll long long
#define ull unsigned long long
#define pb push_back
#define ri register int 
#define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
#define SIZE 1926081
using std::min;
using std::max;
using std::pair;
using std::queue;
using std::priority_queue;
using namespace __gnu_pbds;
inline char gc(){
    static char buf[SIZE],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,SIZE,stdin),p1==p2)?EOF:*p1++;
}
#define gc getchar
template <class T>inline void read(T &x){
	x=0;int ne=0;char c;
    while((c=getchar())>'9'||c<'0')ne=c=='-';x=c-48;
    while((c=getchar())>='0'&&c<='9')x=(x<<3)+(x<<1)+c-48;x=ne?-x:x;return ;
}
const int maxn=500005;
const int N=5000005;
const int inf=0x7fffffff;
int st[N<<2],top=0;
int sum[N<<2],hi[100005],fa[100005];
int rt[100005],ls[N<<2],rs[N<<2];
int n,m,q;
struct Dt{
	int x,id;
	bool operator <(const Dt &b)const{
		return x<b.x;
	}
}dt[100005];
inline void init(){for(ri i=(N<<2)-10;i>=1;i--)st[++top]=i;}
inline void del(int x){st[++top]=x,sum[x]=ls[x]=rs[x]=0;return ;}
inline int get(){int x=st[top--];sum[x]=ls[x]=rs[x]=0;return x;}
gp_hash_table <int,int> g;int tot=0;
struct Edge{
    int x,y,dis;
    Edge(){x=y=dis=inf;}
    Edge(int _x,int _y,int _d){x=_x,y=_y,dis=_d;}
    bool operator <(const Edge &b)const{
        return dis<b.dis;
    }
}edge[maxn];
int pos;
int get(int x){return (fa[x]==x)?fa[x]:(fa[x]=get(fa[x]));}
void update(int &now,int l,int r){
    if(!now)now=get();
    sum[now]++;
    if(l==r)return ;
    int mid=(l+r)>>1;
    if(pos<=mid)update(ls[now],l,mid);
    else update(rs[now],mid+1,r);
    return ;
}
int query(int now,int l,int r,int k){
	//printf("%d %d %d %d %d %d\n",now,l,r,k,sum[rs[now]]);
    if(l==r){return l;}
    int mid=(l+r)>>1,t=sum[rs[now]];
    if(t>=k)return query(rs[now],mid+1,r,k);
    if(sum[ls[now]]<k-t)return -1;
    return query(ls[now],l,mid,k-t);
}
int merge(int x,int y){
    if(!x||!y)return x+y;
    sum[x]+=sum[y];
    ls[x]=merge(ls[x],ls[y]);
    rs[x]=merge(rs[x],rs[y]);
    del(y);
    return x;
}
int ans[maxn];
struct Query{
    int v,k,x,id;
    bool operator <(const Query &b)const{
        return x<b.x;
    }
}qry[maxn];
inline void solve(){
    int tp=1,x;
    int np=1,u,v;
    while(tp<=q){
    	x=qry[tp].x;
    	//printf("**%d %d %d**\n",x,tp,qry[tp].id);
        while(edge[np].dis<=x&&np<=m){
            u=edge[np].x,v=edge[np].y;
            //printf("--%d %d %d\n--\n",u,v,edge[np].dis);
            u=get(u),v=get(v);
            merge(rt[u],rt[v]);        
            fa[v]=u;
            //puts("xx");
            np++;
        }
        //printf("(%d)\n",n);
        ans[qry[tp].id]=query(rt[get(qry[tp].v)],1,tot,qry[tp].k);
        tp++;
    }
    for(ri i=1;i<=q;i++)printf("%d\n",ans[i]);
    return ;
}
int main(){
    int x,y,z;
    init();
    memset(ans,-1,sizeof(ans));
    read(n),read(m),read(q);
    for(ri i=1;i<=n;i++){
        read(dt[i].x);
        dt[i].id=fa[i]=i;    
    }
    std::sort(dt+1,dt+1+n);
    for(ri i=1;i<=n;i++){
    	x=dt[i].x,y=dt[i].id;
    	if(!g[x]){
    		g[x]=++tot;
		}
		hi[y]=g[x];
		//pos=hi[y],update(rt[y],1,tot);
	}
	for(ri i=1;i<=n;i++){
		pos=hi[i];
		update(rt[i],1,tot);
	}
    for(ri i=1;i<=m;i++){
        read(edge[i].x),read(edge[i].y),read(edge[i].dis);
    }
    std::sort(edge+1,edge+1+m);
    for(ri i=1;i<=q;i++){
        read(qry[i].v),read(qry[i].x),read(qry[i].k);
        qry[i].id=i;
    }
    std::sort(qry+1,qry+1+q);
    solve();
	return 0;
}


回复

4 条回复,欢迎继续交流。

正在加载回复...