乐从网站制作,seo算法,本地打开WordPress慢,网站模版与模板的使用正题
题目链接:https://www.luogu.com.cn/problem/P5025 题目大意
.nnn个炸弹#xff0c;每个在xxx位置处#xff0c;范围为rrr。定义fif_ifi表示第iii个炸弹爆炸能连锁的炸弹数#xff0c;要求输出∑i1nfi∗i\sum_{i1}^nf_i*ii1∑nfi∗i 解题思路
将每个炸弹可以炸…正题
题目链接:https://www.luogu.com.cn/problem/P5025 题目大意
.nnn个炸弹每个在xxx位置处范围为rrr。定义fif_ifi表示第iii个炸弹爆炸能连锁的炸弹数要求输出∑i1nfi∗i\sum_{i1}^nf_i*ii1∑nfi∗i 解题思路
将每个炸弹可以炸开的炸弹连边然后每个强连通分量之间可以互相炸然后在tarjantarjantarjan时统计这个强连通分量内的炸弹炸的范围li,ril_i,r_ili,ri。然后用dfsdfsdfs在DAGDAGDAG上更新即可。
但是这样建的边是n2n^2n2级别的显然不能通过本题因为建的边都是在一个区间内用线段树优化建边每个节点代表这个这个节点能够通向连向的区间点然后优化为nlognn\log nnlogn的级别。 codecodecode
#includecstdio
#includecstring
#includealgorithm
#includestack
#define ll long long
using namespace std;
const ll N2e610,XJQ1e97;
struct node{ll to,from,next;
}a[N*15];
ll n,tot,num,cnt,ans;
ll lso[N],rso[N],dfn[N],low[N];
ll l[N],r[N],ls[N],fa[N],w[N],rr[N];
stackint S;
bool v[N];
void addl(ll x,ll y){a[tot].toy;a[tot].fromx;a[tot].nextls[x];ls[x]tot;return;
}
ll build(ll x,ll l,ll r){if(lr)return l;if(!x)xcnt;ll mid(lr)1;lso[x]build(lso[x],l,mid);rso[x]build(rso[x],mid1,r);addl(x,lso[x]);addl(x,rso[x]);return x;
}
void change(ll x,ll L,ll R,ll l,ll r,ll pos){if(LlRr){addl(pos,x);return;}ll mid(LR)1;if(rmid)change(lso[x],L,mid,l,r,pos);else if(lmid)change(rso[x],mid1,R,l,r,pos);else change(lso[x],L,mid,l,mid,pos),change(rso[x],mid1,R,mid1,r,pos);return;
}
void tarjan(ll x){dfn[x]low[x]num;v[x]1;S.push(x);for(ll ils[x];i;ia[i].next){ll ya[i].to;if(!dfn[y]){tarjan(y);low[x]min(low[x],low[y]);}else if(v[y]) low[x]min(low[x],dfn[y]);}if(dfn[x]low[x]){ll y;do{yS.top();v[y]0;fa[y]x;l[x]min(l[x],l[y]);r[x]max(r[x],r[y]);S.pop();}while(x!y);}return;
}
void dfs(ll x){v[x]1;for(ll ils[x];i;ia[i].next){ll ya[i].to;if(!v[y])dfs(y);l[x]min(l[x],l[y]);r[x]max(r[x],r[y]);}return;
}
int main()
{scanf(%lld,n);for(ll i1;in;i)scanf(%lld%lld,w[i],rr[i]);cntn;build(0,1,n);memset(l,127,sizeof(l));w[n1]2147483647;for(ll i1;in;i){ll Llower_bound(w1,w1n,w[i]-rr[i])-w;ll Rupper_bound(w1,w1n,w[i]rr[i])-w-1;change(n1,1,n,L,R,i);l[i]L;r[i]R;}for(ll i1;icnt;i)if(!dfn[i])tarjan(i);ll TOTtot;tot0;memset(ls,0,sizeof(ls));for(ll i1;iTOT;i){ll xa[i].from,ya[i].to;if(fa[x]fa[y])continue;addl(fa[a[i].from],fa[a[i].to]);}memset(v,0,sizeof(v));for(ll i1;icnt;i)if(fa[i]i)dfs(i);for(ll i1;in;i)ans(ans(r[fa[i]]-l[fa[i]]1)*i%XJQ)%XJQ;printf(%lld,ans);return 0;
}