乱人伦 国语对白海角社区,五月激情丁香婷婷综合中文字幕,欧美伊人婷婷久久五月综合,亚洲精品无amm毛片,亚洲男人第一无码AV网站,国产日韩欧美丝袜一区二区,亚洲一区精品在线观看

Rooks Defenders(二分)-X米6体育

Rooks Defenders(二分)

2026-01-16 23:06:50投稿人:奔馳彩票平臺(晉城)有限公司圍觀363 評論

Rooks Defenders(二分)

題目 https://codeforces.com/contest/1679/problem/C

題意:給定一個的矩陣,有三種操作

  • 往矩陣埋一顆地雷,保證對應的點之前不存在地雷 。
  • 往矩陣挖掉一個顆地雷 ,保證對應的點之前存在地雷 。
  • 查詢子矩陣是否所有點都被地雷覆蓋 。一個點(x,y)被地雷覆蓋 ,當且僅當至少存在一個地雷(a,b),使得x==a或y==b。即至少存在一個地雷和它同行或同列。

思路 :維護沒有被地雷覆蓋的行和列。對于每次查詢,如果在對應范圍內 ,存在至少一個沒有被覆蓋的行 ,和至少一個沒有被覆蓋的列 ,則說明子矩陣沒有被覆蓋。否則 ,說明矩陣被完全覆蓋 。詳見代碼 。


#include using namespace std;const int maxn = 100010;int n, q, op;int x, y, x2, y2;setrow, col;int numr[maxn], numc[maxn];void init() { 	row.clear();	col.clear();	memset(numr, 0, sizeof(numr));	memset(numc, 0, sizeof(numc));	vectorve;	for (int i = 1; i <= n; ++i) { 		ve.push_back(i);	}	row = { ve.begin(), ve.end()};	col = { ve.begin(), ve.end()};}// 查找s集合是否存在 [st,ed] 的元素 bool check(set&s, int st, int ed) { 	// >= st	// 用通用lower_bound超時了,還是內置的香 //	set::iterator it = lower_bound(s.begin(), s.end(), st);	set::iterator it = s.lower_bound(st);	if (it == s.end()) { 		return false;	}	if (*it >ed) { 		return false;	}		return true;}void solve() { 	scanf("%d%d", &n, &q);	init();	while (q--) { 		scanf("%d%d%d", &op, &x, &y);		switch (op) { 			case 1: 				if (numr[x]++ == 0) 					row.erase(row.find(x));				if (numc[y]++ == 0) 					col.erase(col.find(y));				break;			case 2:				if (--numr[x] == 0)					row.insert(x);				if (--numc[y] == 0)					col.insert(y);				break;			case 3:				scanf("%d%d", &x2, &y2);				if (check(row, x, x2) && check(col, y, y2))					printf("No");				else					printf("Yes");				break;		}	}}int main() { 	int t;	t = 1;	while (t--) { 		solve();	}}/*8 101 2 43 6 2 7 21 3 23 6 2 7 21 4 33 2 6 4 82 4 33 2 6 4 81 4 83 2 6 4 8*/
展開閱讀全文

投稿時間:2022-05-23  最后更新 :2022-09-04