Codeforces Round #585 (Div. 2) F. Radio Stations 2-sat + 神仙建模
傳送門
文章目錄
- 題意:
- 思路:
題意:
你現(xiàn)在有ppp種電臺,有nnn對關(guān)系(x,y)(x,y)(x,y)代表xxx電臺或yyy電臺中至少有一個,mmm對關(guān)系(x,y)(x,y)(x,y)代表xxx電臺或yyy電臺中最多有一個,每個電臺有兩個參數(shù)li,ril_i,r_ili?,ri?,你需要在[1,M][1,M][1,M]中選擇一個主頻fff,如果f∈[li,ri]f\in [l_i,r_i]f∈[li?,ri?],那么第iii個電臺你可以選擇是否啟用,否則無法啟用。
請給出fff并構(gòu)造電臺啟用方案,無解輸出?1-1?1。
2≤n,p,m,M≤4e52\le n,p,m,M\le 4e52≤n,p,m,M≤4e5
思路:
對于n,mn,mn,m這幾個條件,顯然是2?sat2-sat2?sat板子了,以下設(shè)uuu代表選uuu這個點,u′u'u′代表不選uuu這個點。
對于nnn對關(guān)系,我們建x′?>y,y′?>xx'->y,y'->xx′?>y,y′?>x。
對于mmm對關(guān)系,我們建x?>y′,y?>x′x->y',y->x'x?>y′,y?>x′。
熱身完畢,現(xiàn)在開始正菜。
考慮如何制定fff呢?我們運用前綴和的思想,嘗試將[l,r][l,r][l,r]拆成[1,l?1],[1,r][1,l-1],[1,r][1,l?1],[1,r]。
我們把f∈[1,li?1],f∈[1,ri]f\in [1,l_i-1],f\in [1,r_i]f∈[1,li??1],f∈[1,ri?]的真值表寫出來。
f∈[1,li?1]f∈[1,ri]i能否啟用00001110不存在110\begin{array}{ccc} f\in [1,l_i-1] & f\in [1,r_i] & i能否啟用 \\ \hline \ 0&0&0\\ \ 0&1&1\\ \ 1&0&不存在\\ \ 1&1&0\\\\\end{array}f∈[1,li??1]?0?0?1?1?f∈[1,ri?]0101?i能否啟用01不存在0??
我們可以發(fā)現(xiàn)總結(jié)一下就是以下三個限制:
(1)(1)(1)若f∈[1,li?1]f\in [1,l_i-1]f∈[1,li??1],則iii不能啟用。
(2)(2)(2)若f∈[1,ri]f\in [1,r_i]f∈[1,ri?]不滿足,則iii不能啟用。
(3)(3)(3) 若iii啟用,則f∈[li,ri]f\in [l_i,r_i]f∈[li?,ri?]。
所以我們拿出來[n+1,n+M+1][n+1,n+M+1][n+1,n+M+1]來代表[0,M][0,M][0,M],我們用這個來繼續(xù)限制。
我們設(shè)滿足n+i+1n+i+1n+i+1的時候就是f≤if\le if≤i,否則f>if>if>i。
首先就是n+i+1?>n+i+2,(n+i+2)′?>(n+i+1)′n+i+1->n+i+2,(n+i+2)'->(n+i+1)'n+i+1?>n+i+2,(n+i+2)′?>(n+i+1)′,這個比較顯然,因為f≤if\le if≤i,那么f≤i+1f\le i+1f≤i+1,如果f>i+1f>i+1f>i+1,那么f>if>if>i。
讓后就是限制一下上面的條件
(1)(1)(1) n+li?>i′,i?>(n+li)′n+l_i->i',i->(n+l_i)'n+li??>i′,i?>(n+li?)′。
(2)(2)(2)(n+ri+1)′?>i′,i?>n+ri+1(n+r_i+1)'->i',i->n+r_i+1(n+ri?+1)′?>i′,i?>n+ri?+1。
還有就是fff不能為000,這個用n+1?>(n+1)′n+1->(n+1)'n+1?>(n+1)′限制一下即可,算是2?sat2-sat2?sat的小技巧了。
跑完之后,n+f+1n+f+1n+f+1成立而n+fn+fn+f不成立的時候的分界點就是fff。
// Problem: F. Radio Stations // Contest: Codeforces - Codeforces Round #585 (Div. 2) // URL: https://codeforces.com/contest/1215/problem/F // Memory Limit: 256 MB // Time Limit: 7000 ms // // Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native") //#pragma GCC optimize(2) #include<cstdio> #include<iostream> #include<string> #include<cstring> #include<map> #include<cmath> #include<cctype> #include<vector> #include<set> #include<queue> #include<algorithm> #include<sstream> #include<ctime> #include<cstdlib> #include<random> #include<cassert> #define X first #define Y second #define L (u<<1) #define R (u<<1|1) #define pb push_back #define mk make_pair #define Mid ((tr[u].l+tr[u].r)>>1) #define Len(u) (tr[u].r-tr[u].l+1) #define random(a,b) ((a)+rand()%((b)-(a)+1)) #define db puts("---") using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); } //void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); } //void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int> PII;const int N=2000010,M=N*10,mod=1e9+7,INF=0x3f3f3f3f; const double eps=1e-6;int p,n,q,m; int e[M],ne[M],h[N],idx; int dfn[N],low[N],id[N],tot,cnt; int stk[N],top; bool in[N];void add(int a,int b) {e[idx]=b,ne[idx]=h[a],h[a]=idx++; }void tarjan(int u) {dfn[u]=low[u]=++tot;stk[++top]=u; in[u]=true;for(int i=h[u];~i;i=ne[i]){int ver=e[i];if(!dfn[ver]){tarjan(ver);low[u]=min(low[u],low[ver]);}else if(in[ver]) low[u]=min(low[u],dfn[ver]);}if(dfn[u]==low[u]){int y; ++cnt;do{y=stk[top--];in[y]=false; id[y]=cnt;}while(y!=u);} }int yes(int x) { return x<<1; }int no(int x) { return x<<1|1; }void link(int x,int y) {add(x,y); add(y^1,x^1); }bool check() {for(int i=0;i<=n+m;i++) if(id[yes(i)]==id[no(i)]) return false;return true; }int main() { // ios::sync_with_stdio(false); // cin.tie(0);scanf("%d%d%d%d",&p,&n,&m,&q);idx=0;memset(h,-1,sizeof(h));for(int i=1;i<=p;i++) {int a,b; scanf("%d%d",&a,&b);a--; b--;// add(2*a,2*b+1); // add(2*b,2*a+1);link(no(a),yes(b));}for(int i=0;i<m;i++) {// add(n*2+i*2+1,n*2+(i+1)*2+1),add(n*2+(i+1)*2,n*2+i*2);link(yes(n+i),yes(n+i+1));}// link(yes(n),no(n));// add(n*2,n*2+1);// add(n*2+1,n*2);for(int i=0;i<n;i++) {int l,r; scanf("%d%d",&l,&r);l--; link(yes(i),no(n+l));link(yes(i),yes(n+r));// add(n*2+l*2+1,i*2); add(i*2+1,n*2+l*2);// add(n*2+r*2,i*2); add(i*2+1,n*2+r*2+1);}for(int i=1;i<=q;i++) {int a,b; scanf("%d%d",&a,&b);a--; b--;link(yes(a),no(b));// add(a*2+1,b*2);// add(b*2+1,a*2);}//n*2+(m+1)*2for(int i=0;i<2*n+(m+1)*2;i++) if(!dfn[i]) tarjan(i);if(check()) {vector<int>ans;for(int i=0;i<n;i++) if(id[yes(i)]<id[no(i)]) ans.pb(i+1);for(int i=1;i<=m;i++) if(id[yes(n+i)]<id[no(n+i)]) {printf("%d %d\n",ans.size(),i);break;}for(auto x:ans) printf("%d ",x); puts("");} else puts("-1");return 0; }總結(jié)
以上是生活随笔為你收集整理的Codeforces Round #585 (Div. 2) F. Radio Stations 2-sat + 神仙建模的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pandas fillna_6个提升效率
- 下一篇: I2C驱动框架分析(3):DW_I2C驱