社区讨论
即将退役的菜鸡疯狂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 条回复,欢迎继续交流。
正在加载回复...