这个能收到信号的条件是 大于等于还是大于0啊
查看原帖
这个能收到信号的条件是 大于等于还是大于0啊
15295
hehelego楼主2020/11/11 00:52

题面不清晰.

能量恰好衰减到0能否收到?

感觉程序的锅应该是只能出在这里了.
目前70pts,wa了3个点.

#include <bits/stdc++.h>
int read(){
	int x=0;char c;
	do{c=getchar();}while(!isdigit(c));
	do{x=x*10+c-'0';c=getchar();}while(isdigit(c));
	return x;
}
const int N=20000+10;
struct E{ int v,w; E(int a,int b):v(a),w(b){} };
std::vector<E> g[N];
int n,S0,fa[N],dep[N],pre[N],len[N],L[N],R[N],idx;
struct T{ int from,to; T(int a,int b):from(a),to(b){} };
// there should be one expand, in [from,to]

int bit[N];
inline int lowbit(int x){ return x&(-x); }
void add(int x,int y){ while(x<=n){ bit[x]+=y; x+=lowbit(x); } }
int qry(int x){ int y=0; while(x){ y+=bit[x]; x^=lowbit(x); } return y; }
inline void put(int x){ add(L[x],1);add(R[x]+1,-1); }

inline int get(int x){ return qry(L[x]); }


std::vector<T> vec;
void dfs(int u,int f){
	L[u]=++idx; dep[u]=dep[fa[u]=f]+1; pre[dep[u]]=u;

// THE LINE BELOW
	if(len[u]>=S0){
		int l=2,r=dep[u]-1,mid=0,ans=-1;
		while(l<=r){
			mid=(l+r)>>1;
// THE LINE BELOW
			if(len[u]-len[pre[mid]]<S0){
				ans=mid; r=mid-1;
			}else l=mid+1;
		}
		vec.push_back(T{u,pre[ans]});
	}
	
	for(const auto e:g[u]) if(dep[e.v]==0){
		len[e.v]=len[u]+e.w;
		dfs(e.v,u);
	}
	R[u]=idx; pre[dep[u]]=0;
}


int main(){
	n=read();int maxval=0;
	for(int i=1;i<=n;i++){
		int k=read();
		for(int j=0;j<k;j++){
			int v=read(),w=read();
			g[i].push_back(E{v,w});
			maxval=std::max(maxval,w);
		}
	}
	S0=read();
	if(maxval>=S0){ puts("No solution."); return 0; }

	dfs(1,0);
	std::sort(vec.begin(),vec.end(),[](auto a,auto b){
		return dep[a.to]>dep[b.to];
	});
	int ans=0; for(auto v:vec){
		if(get(v.from)-get(fa[v.to])>0) continue;
		ans++; put(v.to);
	}
	std::cout<<ans<<std::endl;
	return 0;
}

2020/11/11 00:52
加载中...