题解 CF1214G 【Feeling Good】
skydogli
2020-10-09 17:44:39
题意:一个 $n\times m$ 的 $01$ 矩阵,每次操作为对一行的一段区间取反,每次输出一个矩阵,要求对角值不同,无解输出 $-1$ 。
关键性质:如果存在两行满足这两行的 $1$ 的位置集合没有包含关系,则这两行肯定可以构造出合法的矩阵,构造方法是左右端点分别为两行的第一次单独出现 $1$ 的位置,这个比较显然。
同时,按 $1$ 的个数从小到大排序,如果全局存在满足条件的两行,那么必有相邻两行满足条件。
证明:假设 $i<j<k$ 且 $S_i \cap S_k\neq S_i$ ,如果 $S_i\subset S_j$,则必有 $S_j\cap S_k\neq S_j$,否则 $S_i\cap S_j\ne S_i$。
于是用 ```set``` 维护 $1$ 的个数的大小关系以及 ```bitset``` 判断两行间的包含关系即可。
```cpp
#include<bits/stdc++.h>
using namespace std;
int read(){
int a=0;char c=getchar();
while(c>'9'||c<'0')c=getchar();
while('0'<=c&&c<='9'){
a=a*10+c-48;
c=getchar();
}
return a;
}
#define MN 2005
#define pii pair<int,int>
#define mp make_pair
#define x first
#define y second
bitset<MN>tmp,qwq,bit[MN];
int n,m,q,cnt[MN];
struct cmp{
bool operator () (const int &a,const int &b){
if(cnt[a]==cnt[b])return a<b;
return cnt[a]<cnt[b];
}
};
set<int,cmp>S;
#define itset set<int,cmp>::iterator
int now;
set<pii >mat;
void INS(int a){
S.insert(a);
itset it=S.find(a),il=it,ir=it;
il--;ir++;
if(cnt[*il]&&ir!=S.end()&&((bit[*il]&bit[*ir])!=bit[*il]))
mat.erase(mp(*il,*ir));
if(cnt[*il]&&((bit[*il]&bit[*it])!=bit[*il])){
mat.insert(mp((*il),(*it)));
}
if(ir!=S.end()&&((bit[*it]&bit[*ir])!=bit[*it])){
mat.insert(mp(*it,*ir));
}
}
void DEL(int a){
itset it=S.find(a),il=it,ir=it;
il--;ir++;
if(cnt[*il]&&ir!=S.end()&&((bit[*il]&bit[*ir])!=bit[*il]))
mat.insert(mp(*il,*ir));
if(cnt[*il]&&((bit[*il]&bit[*it])!=bit[*il]))mat.erase(mp((*il),(*it)));
if(ir!=S.end()&&((bit[*it]&bit[*ir])!=bit[*it]))mat.erase(mp(*it,*ir));
S.erase(a);
}
int main(){
n=read();m=read();q=read();
for(int i=0;i<=n;++i)S.insert(i);
for(int i=1;i<=q;++i){
int a=read(),l=read(),r=read();
tmp.set();tmp>>=(MN-(r-l+1));tmp<<=l;
DEL(a);
bit[a]^=tmp;
cnt[a]=bit[a].count();
INS(a);
if(!mat.size())puts("-1");
else{
pii w=*mat.begin();
int x1=w.x,x2=w.y;
qwq=bit[w.x]^bit[w.y];
int y1=(qwq&bit[w.x])._Find_first();
int y2=(qwq&bit[w.y])._Find_first();
if(x1>x2)swap(x1,x2);
if(y1>y2)swap(y1,y2);
printf("%d %d %d %d\n",x1,y1,x2,y2);
}
}
return 0;
}
```