考虑将$(2i-1,2j-1)$和$(2i,2j)$缩为一个点,记作$(i,j)$

对于每一个点,只能选$(2i-1,2j-1)$或$(2i,2j)$(显然不能都选),而这样恰好为$nm$个,因此必须要至少选择一个

对于每一个点,障碍的状态分为以下几类:

1.无障碍,这类点暂时不考虑

2.都有障碍,若存在此类点必然不合法

3.有一个障碍,分两类讨论:

(1)$(2i-1,2j-1)$上有障碍,即这个点只能选$(2i,2j)$,考虑$(i+1,j)$和$(i,j+1)$,也只能选这个点,因此即对于其右下角的点,都要选$(2i,2j)$;

(2)$(2i,2j)$上有障碍,类似的,对于其左上角的点,都要选$(2i-1,2j-1)$

矛盾在于存在一个点$(i_{1},j_{1})$在$(2i_{1}-1,2j_{1}-1)$上有障碍,$(i_{2},j_{2})$在$(2i_{2},2j_{2})$上有障碍,且满足$i_{1}\le i_{2}$、$j_{1}\le j_{2}$,那么对于$([i_{1},i_{2}],[j_{1},j_{2}])$这个矩形就无解了

(其实第2类也可以看作此类情况,即$i_{1}=i_{2}$且$j_{1}=j_{2}$)

通过set,可以求出对于所有$i$,在$(2i-1,2j-1)$上有障碍的最小的$j$和在$(2i,2j)$上有障碍的最大的$j$

对于插入可以很好的支持,即判断新来的点是否会产生即可(通过线段树维护第一个前缀最小值以及第二个后缀最大值),那么删除通过线段树分治即可

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 200005
4 #define L (k<<1)
5 #define R (L+1)
6 #define mid (l+r>>1)
7 #define pii pair<int,int>
8 #define mp make_pair
9 #define fi first
10 #define se second
11 map<int,int>mat[N<<1];
12 map<int,int>::iterator it;
13 multiset<int>s1[N],s2[N];
14 vector<pii>v[N<<2];
15 pii f[N<<2];
16 int n,m,q,x,y,ans[N];
17 void add(int k,int l,int r,int x,int y,pii z){
18 if ((l>y)||(x>r))return;
19 if ((x<=l)&&(r<=y)){
20 v[k].push_back(z);
21 return;
22 }
23 add(L,l,mid,x,y,z);
24 add(R,mid+1,r,x,y,z);
25 }
26 pii merge(pii x,pii y){
27 return mp(min(x.fi,y.fi),max(x.se,y.se));
28 }
29 pii get(int k){
30 int x=m+1,y=0;
31 if (s1[k].size())x=(*s1[k].begin());
32 if (s2[k].size())y=(*--s2[k].end());
33 return mp(x,y);
34 }
35 void update(int k,int l,int r,int x){
36 if (l==r){
37 f[k]=get(x);
38 return;
39 }
40 if (x<=mid)update(L,l,mid,x);
41 else update(R,mid+1,r,x);
42 f[k]=merge(f[L],f[R]);
43 }
44 pii query(int k,int l,int r,int x,int y){
45 if ((l>y)||(x>r))return mp(m+1,0);
46 if ((x<=l)&&(r<=y))return f[k];
47 return merge(query(L,l,mid,x,y),query(R,mid+1,r,x,y));
48 }
49 void dfs(int k,int l,int r){
50 if (!ans[0])return;
51 for(int i=0;i<v[k].size();i++){
52 x=v[k][i].fi,y=v[k][i].se;
53 if (y&1){
54 s1[(x+1)/2].insert((y+1)/2);
55 if (query(1,1,n,(x+1)/2,n).se>=(*s1[(x+1)/2].begin()))ans[0]=0;
56 }
57 else{
58 s2[x/2].insert(y/2);
59 if (query(1,1,n,1,x/2).fi<=(*--s2[x/2].end()))ans[0]=0;
60 }
61 update(1,1,n,(x+1)/2);
62 }
63 if (l==r)ans[l]=ans[0];
64 else{
65 dfs(L,l,mid);
66 dfs(R,mid+1,r);
67 }
68 for(int i=0;i<v[k].size();i++){
69 x=v[k][i].fi,y=v[k][i].se;
70 if (y&1)s1[(x+1)/2].erase(s1[(x+1)/2].find((y+1)/2));
71 else s2[x/2].erase(s2[x/2].find(y/2));
72 update(1,1,n,(x+1)/2);
73 }
74 ans[0]=1;
75 }
76 int main(){
77 scanf("%d%d%d",&n,&m,&q);
78 for(int i=1;i<=q;i++){
79 scanf("%d%d",&x,&y);
80 if (!mat[x][y])mat[x][y]=i;
81 else{
82 add(1,1,q,mat[x][y],i-1,mp(x,y));
83 mat[x][y]=0;
84 }
85 }
86 for(int i=1;i<=2*n;i++)
87 for(it=mat[i].begin();it!=mat[i].end();it++)
88 if ((*it).se)add(1,1,q,(*it).se,q,mp(i,(*it).fi));
89 for(int i=1;i<=n;i++)update(1,1,n,i);
90 ans[0]=1;
91 dfs(1,1,q);
92 for(int i=1;i<=q;i++)
93 if (ans[i])printf("YES\n");
94 else printf("NO\n");
95 }

[cf1379F]Chess Strikes Back的更多相关文章

  1. hdu4405 Aeroplane chess

    Aeroplane chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  2. HDU 5742 Chess SG函数博弈

    Chess Problem Description   Alice and Bob are playing a special chess game on an n × 20 chessboard. ...

  3. POJ2425 A Chess Game[博弈论 SG函数]

    A Chess Game Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 3917   Accepted: 1596 Desc ...

  4. HDU 4832 Chess (DP)

    Chess Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  5. 2016暑假多校联合---A Simple Chess

    2016暑假多校联合---A Simple Chess   Problem Description There is a n×m board, a chess want to go to the po ...

  6. HDU5724 Chess(SG定理)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5724 Description Alice and Bob are playing a spe ...

  7. BFS AOJ 0558 Chess

    AOJ 0558 Chess http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0558    在H * W的地图上有N个奶酪工厂,每个 ...

  8. SGU 319. Kalevich Strikes Back (线段树)

    319. Kalevich Strikes Back Time limit per test: 0.5 second(s)Memory limit: 65536 kilobytes input: st ...

  9. Codeforces Round #379 (Div. 2) D. Anton and Chess 水题

    D. Anton and Chess 题目连接: http://codeforces.com/contest/734/problem/D Description Anton likes to play ...

随机推荐

  1. 从零入门 Serverless | 企业级 CI/CD 工具部署 Serverless 应用的落地实践

    背景知识 通过以往几节课程的学习,相信大家对于 SAE 平台已经有了一定的了解.SAE 为客户免除了很多复杂的运维工作,开箱即用.按用量付费:与此同时 SAE 提供了丰富的 Open API,可以很容 ...

  2. redis学习笔记-02 list列表类型命令

    一.lpush key value1 value2 value3 value4(命令将一个或多个值插入到列表头部. 如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作) lpush k1 ...

  3. CTF入门记录(1

    (https://ctf-wiki.org) 00 基础了解 CTF简介 (wolai.com) 00-1 CTF题目类型 Web 大部分情况下和网.Web.HTTP等相关技能有关. Web攻防的一些 ...

  4. 一个小众搞笑的xss漏洞练习平台

    XSS是当今网络安全事件中数量最多的攻击方式,虽然其危害性不高,但主要和其他攻击手段相结合,以实现一个复杂的攻击场景.那么,XSS是什么? XSS全称跨站脚本(Cross Site Scripting ...

  5. st表树状数组入门题单

    预备知识 st表(Sparse Table) 主要用来解决区间最值问题(RMQ)以及维护区间的各种性质(比如维护一段区间的最大公约数). 树状数组 单点更新 数组前缀和的查询 拓展:原数组是差分数组时 ...

  6. 5.27日Scrum Metting

    日期:2021年5月27日 会议主要内容概述:确定账单数据格式,确定需要添加新的图表,确定模板分享功能任务量. 一.进度情况# 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 ...

  7. the Agiles Scrum Meeting 博客汇总

    the Agiles 团队博客目录 一.Scrum Meeting 1. Alpha the Agiles Scrum Meeting 1 the Agiles Scrum Meeting 2 the ...

  8. [no code][scrum meeting] Beta 5

    $( "#cnblogs_post_body" ).catalog() 例会时间:5月18日14:30,主持者:叶开辉 下次例会时间:5月19日11:30,主持者:黎正宇 一.工作 ...

  9. Spring源码解读(二):Spring AOP

    一.AOP介绍 面向方面编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象编程(OOP).OOP中模块化的关键单元是类,而在AOP中,模块化单元是方面.方面实现了诸如跨越多种类型和对象的事务 ...

  10. 从零开始的DIY智能浇水应用

    前言 作为一个新世纪打工人,平常也会去养一些花草,来给我的房间增加点绿色和活力,但是常常因为工作忙而忘记一些事情.,毕竟我大部分的时间都是陪伴着电脑的(严正声明:我不是个单身狗!!! (¬◡¬)✧), ...