首页 > 其他分享 >[思维] [树形数据结构] CF1379F1 Chess Strikes Back (easy version)

[思维] [树形数据结构] CF1379F1 Chess Strikes Back (easy version)

时间:2024-02-29 11:24:59浏览次数:35  
标签:格子 CF1379F1 白格 Back yy int xx version 国王

注意到棋盘大小为 $2n,2m$,共 $2nm$ 个白格,同时国王数量为 $nm$,尝试将 $2$ 个国王捆绑在一块,即将棋盘均匀划分为若干个 $2*2$ 大小的大格子。

在此基础上观察,显然同一个大格子内的两个白格不能同时放置国王,同时大格子数量为 $nm$,因此问题转化为判定能否使得所有大格子都有一个国王,这是此题不易想到但是很必要的一步。

初始情况下显然满足条件,那么移去一个白格,显然这个白格所属的大格子只能将国王安置在另一个白格上。

对移去的白格在大格子中的位置分类讨论,设左上角的被移去,则当前大格子正下方和正右方的大格子的左上角也无法放置,也就是说这个两个大格子的安置方案也被唯一确定了。依次类推,可以发现当前大格子到棋盘右下角的矩形内的所有大格子都无法将国王安置到左上白格。同理,假如移去白格位于右下,则当前大格子到棋盘左上角的矩形内的所有大格子都无法将国王安置到右下白格。

考虑什么时候无解,即存在某个大格子的左上、右下白格均无法安置国王。换句话说,我们定义左上白格被移去的大格子为 $1$ 类格子,右下白格被移去的为 $2$ 类白格,那么无解当且仅当存在 $2$ 类格子在一类格子的右下方。

这个问题显然可以开两个树状数组解决,线段树也行。复杂度 $O(q\log n)$。

#### 代码

```cpp
#include<bits/stdc++.h>
using namespace std;

const int N = 2e5 + 5, inf = 1e9;
int n, m, q, x, y, xx, yy;
bool flag;

namespace BIT{
int t[N], t2[N];
inline void init(int t[]) {for(int i = 0; i < N; ++i) t[i] = inf;}
inline void upd(int t[], int a, int k) {for(; a < N; a += a & (-a)) t[a] = min(t[a], k);}
inline int qry(int t[], int a) {int res = inf; for(; a > 0; a -= a & (-a)) res = min(res, t[a]); return res;}
}
using namespace BIT;
signed main(){
init(t), init(t2);
cin >> n >> m >> q;
while(q--){
scanf("%d%d", &x, &y);
xx = (x + 1) >> 1, yy = (y + 1) >> 1;
if(x & 1){
if(-qry(t2, n - xx + 1) >= yy) flag = true;
upd(t, xx, yy);
}
else{
if(qry(t, xx) <= yy) flag = true;
upd(t2, n - xx + 1, -yy);
}
(flag == true) ? printf("NO\n") : printf("YES\n");
}
return 0;
}
```

标签:格子,CF1379F1,白格,Back,yy,int,xx,version,国王
From: https://www.cnblogs.com/Zwi1113/p/18043039

相关文章

  • CF1209G2 Into Blocks (hard version) 题解
    Description给你\(n\),\(q\),\(n\)表示序列长度,\(q\)表示操作次数。我们需要达成这么一个目标状态:如果存在\(x\)这个元素,那么必须满足所有\(x\)元素都必须在序列中连续。然后你可以进行这么一种操作,将所有的\(x\)元素的变为任意你指定的\(y\)元素,并且花费\(cnt[x......
  • B. Minimize Inversions
    原题链接题解逆序对数最小的排列是严格升序的排列,因此我猜想有一个严格升序的排列最优的证明;冒泡排序,我们把排列a中最大的元素不断地往右作相邻对换,这样一来,序列a的逆序对数必定减少一,序列b的逆序对数可能减少一,可能不变,可能加一,但是两个排列的总逆序对数不可能增加。然后再......
  • 聊聊maven指定version区间的妙用
    前言在我们开发微服务项目的过程中,难免会依赖各种jar,开发环境可能引用1.0.0-SNAPSHOT,而到了正式环境,则需要引用1.0.0。之前我们的做法是通过pom配置profile来达到不同环境,使用不同的版本。形如下<profiles><!--开发环境--><profile><properti......
  • 如何计算两个正太分布的KL散度 —— 正太分布的KL散度 (Kullback-Leibler divergence)
    参考:https://blog.csdn.net/int_main_Roland/article/details/124650909给出实现代码:defget_kl():mean0,log_std0,std0=policy_net(Variable(states))mean1=Variable(mean0.data)log_std1=Variable(log_std0.data)std1......
  • I recommend a very small Linux, it is Watt OS version 13
    Dearall,MyfirsttimeusingLinuxWattOSversion12,itisverynice. Superfast!However,fornewusers,youneedthesecommandtostart:sudopasswdsudodate--setmm/dd/yyyysudoaptinstallgdebiItisworthytostudythesecommandline,because......
  • Backpropagation
    backpropagation(反向传播)在计算gradient的vector时可以有效率地把vector计算出来我们先考虑一个neuron考虑链式法则,现计算$\frac{\partialz}{\partialw}$,计算较为简单,规律发现就是input以上步骤就叫forwardpass,接下来介绍backwardpass,即计算$\frac{\partialC}{\parti......
  • vue页面上显示package.json中的version
    在Vue项目中,你可以使用process.env来访问构建时注入的环境变量,包括package.json中的某些字段。但是,process.env通常不会直接包含package.json的所有内容。不过,你可以通过构建脚本将version字段注入到环境变量中。以下是如何在Vue项目中获取package.json中的version字段的步骤:在......
  • vue项目npm run build的时候自动更新package.json中的version
    在vue项目最外侧新增一个addVersion.js 脚本,脚本中编写逻辑来解析当前的版本号//addVersion.jsconstfs=require('fs');constpath=require('path');constpackageJsonPath=path.join(__dirname,'package.json');try{//读取package.json......
  • 安装IntelliJ IDEA Ultimate Version 2018.3.6
    参考博客:idea2018.3.6安装与破解教程1、下载安装文件ideaIU-2018.3.6.exe2、无脑下一步安装博主安装位置D:\IntelliJIDEA2018.3.6安装后,先不要运行IDEA3、下载jar文件JetbrainsIdesCrack-4.2-release.jar将下载后的jar包放入到IDEA安装目录的bin目录下,即D:\Inte......
  • 遇到Failed to get response from https://registry.npm.taobao.org/vue-cli-version-
    1.问题在启动vueui时,总是遇到报错,如下图:2.解决参考:vuecli创建项目报错:Failedtogetresponsefrom/vue-cli-version-marker找到你的.vuerc文件:C:\Users\trmbh\.vuerc,这里根据自己的用户名更改然后改为{"useTaobaoRegistry":false,"packageManager":"npm"}第......