牛客暑假多校第二场J-farm
一、题意
White Cloud wants to help White Rabbit fertilize plants, but the i-th plant can only adapt to the i-th fertilizer. If the j-th fertilizer is applied to the i-th plant (i!=j), the plant will immediately die.
Now White Cloud plans to apply fertilizers T times. In the i-th plan, White Cloud will use k[i]-th fertilizer to fertilize all the plants in a rectangle [x1[i]...x2[i]][y1[i]...y2[i]].
White rabbits wants to know how many plants would eventually die if they were to be fertilized according to the expected schedule of White Cloud.
二、解题思路
要求使用一种数据结构进行批量染色操作,且要求后面可以检测是否被"其他颜色污染"。
则看了题解很容易想到,使用某种数据结构做批量增加的操作,之后检测增加后的值是否能够整除原来的元素。
考虑如果直接按照1、2、3、4进行赋值就会有:同样是染色2次,有3+3 = 6和2+2+2 = 6,无法有效判断整除。考虑加一个操作:增加染色次数的判定,但是同样也会有3+3 = 6 = 2+4的问题,因此对数组进行重新设计,则直觉告诉我们,1,2,4,7,......an,an+n这个数列可以完美解决这个问题——不存在第2种组合可以使用相同数目的数列元素相加得到数列的某个其他元素。
因此,使用一位数组开足够大的数组之后,动态的按照二维数组的方式进行寻址,即可完成上述操作。
#include<bits/stdc++.h>
using namespace std; #define ll intmax_t const int MAXN=; ll mapp[MAXN];
ll farm[MAXN];
ll times[MAXN];
ll color[MAXN]; int maxx_numebr = ;
int add_number = ; int m,n,k; void insert_mex(ll *v,int a,int b,ll key)
{
a+=;
b+=;
while(a<n+)
{
int num = a*(m+);
int pos = b;
while(pos<m+)
{
v[num+pos] += key;
pos+= pos&(-pos);
}a+=a&(-a); }
}
ll find_mex(ll *v,int a,int b)
{
a+=;
b+=;
ll cntt = ;
while(a)
{
int num = a*(m+);
int pos = b;
while(pos)
{
cntt += v[num+pos];
pos -= pos&(-pos);
}
a-=a&(-a);
}
return cntt;
} void insert(ll *v,int a,int b,int c,int d,ll key)
{
// cout<<"coor :"<<a<<" "<<b<<endl;
// cout<<"coor :"<<a<<" "<<d<<endl;
// cout<<"coor :"<<c<<" "<<b<<endl;
// cout<<"coor :"<<c<<" "<<d<<endl; insert_mex(v,a,b,key);
insert_mex(v,c,d,key);
insert_mex(v,a,d,-key);
insert_mex(v,c,b,-key);
} ll find(ll *v,int a,int b)
{
ll cntt = ;
cntt += find_mex(v,a,b);
return cntt;
} void init()
{
memset(color,-,sizeof(color));
for(int i=;i<n;++i)
{
int pos = i*m;
for(int j=;j<m;++j)
{
// int ppos = pos +j;
scanf("%d",&mapp[pos]);
if(color[pos] == -)color[mapp[pos]] = (maxx_numebr += (add_number++));
pos++;
}
}
for(int i=;i<k;++i)
{
int a,b,c,d,kk;
scanf("%d%d%d%d%d",&a,&b,&c,&d,&kk);
if(color[kk] == -)color[kk] = (maxx_numebr += add_number++ );
ll key = color[kk];
a--;b--;
insert(farm,a,b,c,d,key);
insert(times,a,b,c,d,);
}
int cntt = n*m;
int pos = ;
for(int i=;i<n;++i)
{
for(int j=;j<m;++j)
{
// int pos = i*(m+23)+j;
ll kk = color[mapp[pos]];
int time_now = find(times,i,j);
ll res = find(farm,i,j);
// cout<<"check: "<<i<<" "<<j<<" times: "<<time_now<<" color "<<mapp[pos]<<endl;
if(time_now == || res == time_now*kk)cntt--;
pos++;
}
}
cout<<cntt<<endl; } int main()
{
cin>>n>>m>>k;
init(); return ;
}
牛客暑假多校第二场J-farm的更多相关文章
- 牛客暑假多校第二场 F trade
题意: 白兔有n个仓库,每个仓库有啊ai个货物,在每个仓库白兔可以装上任意数量的货物,也可以卸下任意数量的货物,现在有k个圆形信号阻隔器,然后有m个顾客下个一个订单,每个顾客的收货量有一个上限, 在每 ...
- 牛客暑假多校第二场 K carpet
题意:给你一个n*m的矩阵 ,每个位置都有一个字符并且都有一个值,现在需要找到一个p*q的子矩阵, 原来的矩阵可以由现在这个矩阵无限复制然后截取其中的一部分得到,并且要求 子矩阵里最大的值 * (p+ ...
- 牛客暑假多校第一场 J Different Integers
题意:给你一个数组, q次询问, 每次询问都会有1个[l, r] 求 区间[1,l] 和 [r, n] 中 数字的种类是多少. 解法1, 莫队暴力: 代码: #include<bits/stdc ...
- 2019 牛客暑期多校 第二场 H Second Large Rectangle (单调栈)
题目:https://ac.nowcoder.com/acm/contest/882/H 题意:一个大的01矩阵,然后现在要求第二大的全一矩阵是多少 思路:在这里我们首先学习一下另一个东西,怎么求直方 ...
- 2019牛客暑期多校第二场题解FH
F.Partition problem 传送门 题意:有2n个人,分两组,每组n个,要求sum(vij)最大值. 题解:n并不大我们可以枚举每个人是在1组还是2组爆搜. 代码: #include &l ...
- 牛客暑假多校第一场J-Different Integers
一.题目描述: 链接:https://www.nowcoder.com/acm/contest/139/JGiven a sequence of integers a1, a2, ..., an an ...
- 2021牛客暑期多校训练营3 J 思维
传送门 J-Counting Triangles_2021牛客暑期多校训练营3 (nowcoder.com) 题目 Goodeat finds an undirected complete graph ...
- 2019牛客暑假多校赛(第二场) F和H(单调栈)
F-Partition problem https://ac.nowcoder.com/acm/contest/882/F 题意:输入一个数n,代表总共有2n个人,然后每个人对所有人有个贡献值,然后问 ...
- 牛客网暑期ACM多校训练营(第二场)J farm (二维树状数组)
题目链接: https://www.nowcoder.com/acm/contest/140/J 思路: 都写在代码注释里了,非常好懂.. for_each函数可以去看一下,遍历起vector数组比较 ...
随机推荐
- python网络编程-paramiko模块
paramiko模块 该模块基于SSH用于连接远程服务器并执行相关操作 参考文档 SSHClient 用于连接远程服务器并执行命令 import paramiko #创建SSH对象 ssh = par ...
- 必须夸夸Sublime,大文件打开
今天有个问题的事情日志文件67.8M大文件打开问题开始: 1.vscode必须挨批:直接就给个错误the file cannt be displayed in the editor because i ...
- 笨办法学Python(三十四)
习题 34: 访问列表的元素 列表的用处很大,但只有你能访问里边的内容时它才能发挥出作用来.你已经学会了按顺序读出列表的内容,但如果你要得到第 5 个元素该怎么办呢?你需要知道如何访问列表中的元素.访 ...
- Verilog频率计设计
这是以前的一个可编程逻辑课上机实验三 实验报告 数字频率计的基本设计思路是在给定一个time开始测量的时候产生的T的个数,也就是采用一个标准的基准时钟,在单位时间(1秒)里对被测信号的脉冲数进行计数. ...
- 概念:RPG游戏中两个兵种互相攻击的逻辑
直接上题目: 解析题目: 根据题目的解析,进行代码的实现: 输出结果: 心得: (1) 当我们面对‘公式结果不是我们想要的’时,应该在脑海里将一个完整的攻击流程进行想象,就会对流程有个更清晰的思路 ( ...
- [转载]弹出一个不带地址栏、工具栏的IE非模态窗口
标签:ie /非模态窗口 window.open(url,'_blank','menubar=no,fullscreen=1,toolbar=no,resizable=no,location=no,s ...
- 常用mysql系统参数参考
http://aaronsa.blog.51cto.com/5157083/1741481
- POJ-2395 Out of Hay---MST最大边
题目链接: https://vjudge.net/problem/POJ-2395 题目大意: 求MST中的最大边,和POJ-2495类似 思路: 模板直接过 #include<iostream ...
- (转)Fidder详解之get和post请求
https://www.cnblogs.com/langhuagungun/p/7737204.html 前言 本文会对Fidder这款工具的一些重要功 能,进行详细讲解,带大家进入Fidder的世界 ...
- VPS 运行 Node.js 的一些经验
VPS 系统选择 各系统安装难易对比 Ubuntu.Debian 较为简单,CentOS 稍麻烦,32位系统比64位更节省内存 DigitalOcean 甚至推出了 Ubuntu + Node.js ...