QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#883289 | #7415. Fast Spanning Tree | sz051 | WA | 20ms | 184020kb | C++14 | 3.4kb | 2025-02-05 15:39:24 | 2025-02-05 15:39:24 |
Judging History
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