QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#883289#7415. Fast Spanning Treesz051WA 20ms184020kbC++143.4kb2025-02-05 15:39:242025-02-05 15:39:24

Judging History

This is the latest submission verdict.

  • [2025-02-05 15:39:24]
  • Judged
  • Verdict: WA
  • Time: 20ms
  • Memory: 184020kb
  • [2025-02-05 15:39:24]
  • Submitted

answer

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <cassert>
#include <stack>
#include <random>
#include <map>
#define int long long
using namespace std; 

void read(int &x){
	x=0;
	int f=1;
	char c=getchar();
	while(!('0'<=c && c<='9')){
		if(c=='-'){
			f=-1;
		}
		c=getchar();
	}
	while('0'<=c && c<='9'){
		x=(x<<3)+(x<<1)+(c^48);
		c=getchar();
	}
	x*=f;
}
int lg(int k){
	return k==0?-1:__lg(k);
}

typedef vector<int> Array;
namespace Alarm{
	int qlim[300010],qh[300010],delt[300010],qcnt=0;
	Array qp[300010];
	Array seps[300010][22];
	int sum[300010];
	int insert(Array pos,int lim){
		qlim[++qcnt]=lim;
		qp[qcnt]=pos;
		qh[qcnt]=22;
		while(qh[qcnt]>=0){
			int cur=0;
			for(int i:pos){
				cur+=sum[i]|((1ll<<qh[qcnt])-1);
			}
			if(cur>=lim){
				qh[qcnt]--;
			}else{
				delt[qcnt]=cur;
				break;
			}
		}
		for(int i:pos){
			seps[i][qh[qcnt]+1].push_back(qcnt);
		}
		return qcnt;
	}
	Array update(int k,int v){
		Array res;
		int tp=lg(sum[k]^(sum[k]+v));
		sum[k]+=v;
		for(int p=-1;p<=tp;p++){
			Array tmp=seps[k][p+1];
			seps[k][p+1].clear();
			for(int i:tmp){
				//printf("[%lld %lld %lld]",k,p,i);
				if(qh[i]!=p){
					continue;
				}
				if(qh[i]==-1){
					res.push_back(i);
					qh[i]=-2;
					continue;
				}
				if(delt[i]-((sum[k]-v)|((1ll<<p)-1))+(sum[k]|((1ll<<p)-1))>=qlim[i]){
					qh[i]--;
					while(qh[i]>=0){
						int cur=0;
						for(int j:qp[i]){
							cur+=sum[j]|((1ll<<qh[i])-1);
						}
						if(cur>=qlim[i]){
							qh[i]--;
						}else{
							delt[i]=cur;
							break;
						}
					}
					if(qh[i]==-1){
						qh[i]=-2;
						res.push_back(i);	
					}else{
						for(int j:qp[i]){
							seps[j][qh[i]+1].push_back(i);
						}
					}
				}else{
					if(qh[i]==-1){
						qh[i]=-2;
						res.push_back(i);	
					}else{
						delt[i]+=-((sum[k]-v)|((1ll<<p)-1))+(sum[k]|((1ll<<p)-1));
						seps[k][p+1].push_back(i);
					}
				}
			}
		}
		return res;
	}
	void merge(int p,int q){
		assert(sum[p]==sum[q]);
		for(int i=0;i<22;i++){
			for(int j:seps[q][i]){
				seps[p][i].push_back(j);
				if(qp[j][0]==q){
					qp[j][0]=p;
				}
				if(qp[j][1]==q){
					qp[j][1]=p;
				}
			}
			seps[q][i].clear();
		}
	}
}
int fa[300010],sum[300010],siz[300010];
int getf(int k){
	return fa[k]==k?k:fa[k]=getf(fa[k]);
}
int n,m;
Array vs[300010];
signed main(){
	read(n);
	read(m);
	for(int i=1;i<=n;i++){
		read(sum[i]);
		fa[i]=i;
		siz[i]=1;
	}
	int w;
	priority_queue<int> q;
	for(int i=1;i<=m;i++){
		vs[i]=Array(2,0);
		read(vs[i][0]);
		read(vs[i][1]);
		read(w);
//		if(!w){
//			q.push(-i);
//			Alarm::qcnt++;
//		}else{
		Alarm::insert(vs[i],w);
//		}
	}
	for(int i=1;i<=n;i++){
		vector<int> tmp=Alarm::update(i,sum[i]);
		for(int j:tmp){
			q.push(-j);
		}
	}
	vector<int> res;
	while(q.size()){
		int f=-q.top();
		printf("[%lld]",f);
		q.pop();
		int u=getf(vs[f][0]),v=getf(vs[f][1]);
		if(u==v){
			continue;
		}
		res.push_back(f);
		if(siz[u]<siz[v]){
			swap(u,v);
		}
		Array tmp=Alarm::update(u,sum[v]);
		for(int i:tmp){
			q.push(-i);
		}
		tmp=Alarm::update(v,sum[u]);
		for(int i:tmp){
			q.push(-i);
		}
		sum[u]+=sum[v];
		siz[u]+=siz[v];
		fa[v]=u;
		Alarm::merge(u,v);
	}
	printf("%lld\n",res.size());
	for(int i:res){
		printf("%lld ",i);
	}
	return 0;
}

详细

Test #1:

score: 0
Wrong Answer
time: 20ms
memory: 184020kb

input:

5 5
1 4 3 4 0
4 5 5
3 1 1
2 5 2
4 3 1
4 1 4

output:

[2][3][1][4][5]4
2 3 1 4 

result:

wrong output format Expected integer, but "[2][3][1][4][5]4" found