[POI2015] Pustynia(差分约数,线段树优化建图,拓扑)
生活随笔
收集整理的這篇文章主要介紹了
[POI2015] Pustynia(差分约数,线段树优化建图,拓扑)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
傳送門
Description
給定一個長度為n的正整數序列aaa,每個數都在111到10910^9109范圍內,告訴你其中sss個數,并給出mmm條信息,每條信息包含三個數l,r,kl,r,kl,r,k以及接下來kkk個正整數x1,x2,...,xkx_1,x_2,...,x_kx1?,x2?,...,xk?,表示a[l],a[l+1],...,a[r?1],a[r]a[l],a[l+1],...,a[r-1],a[r]a[l],a[l+1],...,a[r?1],a[r]里 a[x1],a[x2],...,a[xk]a[x_1],a[x_2],...,a[x_k]a[x1?],a[x2?],...,a[xk?]這kkk個數中的任意一個 都比 剩下的r?l+1?kr-l+1-kr?l+1?k個數中的任意一個大(嚴格大于,即沒有等號)。
請任意構造出一組滿足條件的方案,或者判斷無解。
Solution
差分約數系統+線段樹優化建圖+按拓撲序DP
#include<iostream> #include<cstdio> #include<queue> using namespace std; const int N=1e5+10; struct Edge{int v,w;}; vector<Edge> g[N*10]; int tot,rt,ls[N*10],rs[N*10],id[N],a[N*10],dis[N*10],in[N*10]; queue<int> q; int n,s,m; void add(int u,int v,int w){g[u].push_back((Edge){v,w});in[v]++; } void build(int &u,int l,int r){u=++tot;if(l==r){id[l]=u;return;}int mid=(l+r)>>1;build(ls[u],l,mid);build(rs[u],mid+1,r);add(ls[u],u,0);add(rs[u],u,0); } void update(int u,int l,int r,int ql,int qr){if(ql>qr) return;if(ql<=l&&r<=qr){add(u,tot,0);return;}int mid=(l+r)>>1;if(ql<=mid) update(ls[u],l,mid,ql,qr);if(qr>mid) update(rs[u],mid+1,r,ql,qr); } int main(){scanf("%d%d%d",&n,&s,&m);build(rt,1,n);for(int i=1;i<=s;i++){int p,d;scanf("%d%d",&p,&d);a[id[p]]=d;}for(int i=1;i<=m;i++){int l,r,k,x,lst;scanf("%d%d%d",&l,&r,&k);tot++;lst=l-1;for(int j=1;j<=k;j++){scanf("%d",&x);add(tot,id[x],1);update(1,1,n,lst+1,x-1);lst=x;}update(1,1,n,lst+1,r);}for(int i=1;i<=tot;i++){if(in[i]==0){dis[i]=1;q.push(i);}}int t=0;while(!q.empty()){int u=q.front();q.pop();t++;if(dis[u]>1000000000) return puts("NIE"),0;if(a[u]&&dis[u]>a[u]) return puts("NIE"),0;dis[u]=max(dis[u],a[u]);for(int i=0;i<g[u].size();i++){int v=g[u][i].v,w=g[u][i].w;dis[v]=max(dis[u]+w,dis[v]);in[v]--;if(in[v]==0) q.push(v);}}if(t<tot) return puts("NIE"),0;puts("TAK");for(int i=1;i<=n;i++) printf("%d ",dis[id[i]]);return 0; } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的[POI2015] Pustynia(差分约数,线段树优化建图,拓扑)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [集训队作业2018] count(笛卡
- 下一篇: [NOI2014] 起床困难综合症(二进