广告 网站举例,有没有招代理商的网站,简单的网页设计代码记事本,常德今天最新通告~~~~~ P3588 [POI2015] PUS ~~~~~ 总题单链接
思路 ~~~~~ 这道题的关键点在于线段树优化建图。 ~~~~~ 对每条限制新建一个虚电 p p p#xff0c;将输入的 x 1 ∼ k x_{1\sim k} x1∼k 连向 p p p#xff0c;再将 p p p 连向区间内单的其他点#xff0c;建完图后拓扑排… ~~~~~ P3588 [POI2015] PUS ~~~~~ 总题单链接
思路 ~~~~~ 这道题的关键点在于线段树优化建图。 ~~~~~ 对每条限制新建一个虚电 p p p将输入的 x 1 ∼ k x_{1\sim k} x1∼k 连向 p p p再将 p p p 连向区间内单的其他点建完图后拓扑排序即可。 ~~~~~ 但如果每个区间都是 [ 1 , 100000 ] [1,100000] [1,100000] 且 k 1 k1 k1那么就会连 ∑ k × n \sum k\times n ∑k×n 条边。 ~~~~~ 怎么办发挥想象力用线段树优化建图。 ~~~~~ 每个限制的区间最多会被拆分成 k 1 k1 k1 个区间暴力枚举区间用线段树建图即可。
代码
#includebits/stdc.h
#define ll long long
using namespace std;vectorlleg[500005];ll n,s,m,tot,usr;
ll vis[500005],din[500005],mx[500005];class{
public:struct Point{ll L,R,id;}po[400005];void build(ll x,ll y,ll p1){po[p]{x,y,tot};if(xy){eg[po[p].id].push_back(x),din[x];return;}ll mid(xy)1;build(x,mid,p1);build(mid1,y,p1|1);eg[po[p].id].push_back(po[p1].id),din[po[p1].id];eg[po[p].id].push_back(po[p1|1].id),din[po[p1|1].id];}void query(ll wc,ll x,ll y,ll p1){if(po[p].Rx||po[p].Ly)return;if(po[p].Lxpo[p].Ry){eg[wc].push_back(po[p].id);din[po[p].id];return;}query(wc,x,y,p1);query(wc,x,y,p1|1);}
}tr;queuellque;
void tupo(){for(ll i1;itot;i)if(!din[i])que.push(i);while(!que.empty()){ll uque.front();que.pop();usr;if(mx[u]1||vis[u]mx[u]){coutNIE;exit(0);}for(ll v:eg[u]){din[v]--;if(un)mx[v]min(mx[v],mx[u]-1);else mx[v]min(mx[v],mx[u]);if(din[v]0)que.push(v);}}if(usr!tot){coutNIE;exit(0);}
}vectorllnow;
signed main(){ios::sync_with_stdio(false);cinnsm;totn;for(ll i1;is;i){ll x,y;cinxy;vis[x]y;}tr.build(1,n);for(ll q1;qm;q){ll x,y,k;cinxyk;now.clear();for(ll i1;ik;i){ll g;cing;now.push_back(g);}tot;if(now[0]-1x)tr.query(tot,x,now[0]-1);for(ll i1;inow.size();i){if(now[i-1]1now[i]-1)continue;tr.query(tot,now[i-1]1,now[i]-1);}for(ll it:now)eg[it].push_back(tot),din[tot];if(ynow[now.size()-1]1)tr.query(tot,now[now.size()-1]1,y);}for(ll i1;itot;i){if(vis[i])mx[i]vis[i];else mx[i]1000000000;}tupo();coutTAKendl;for(ll i1;in;i)coutmx[i] ;return 0;
}