首页 > 其他分享 >DTOJ 5093 淘淘种地 题解

DTOJ 5093 淘淘种地 题解

时间:2022-11-13 19:22:06浏览次数:39  
标签:nm int 题解 5093 这题 数组 DTOJ 拆位

题面

题目链接

题解

这个是CSP前最后一场测试的 T2,打的不是很好,没有想到这题正解,但是这题暴力分很多ww

二进制拆位的思想要有((

30分

暴力模拟 \(O(nmT)\)

70分

满足 \(1 \leq a[i][j], k[i] \leq 2\)

对每种肥料做一遍前缀和,得出每个点被哪些种类覆盖. \(O(T+nm)\). 因为只有两种所以很可做.

100分

部分分启发我们二进制拆位(虽然测试的时候没启发到我)

总之拆位.

对每一位的 \(0\) 和 \(1\) 分别做一遍前缀和,最后如果与 \(a[i][j]\) 不同的位上有肥料,他就安详地去世了.

效率就是\(O((T+nm)\log nm)\)

然后你会发现你 RE MLE

实现要注意:

不要用 vector,空间真的很容易炸

把二维数组压成一位数组

把枚举位数的循环扔外面,数组可以少一位

然后你就快乐 AC

(当然这题有别的做法,什么树状数组之类的

代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e6+5;
int n,m,T;
int a[N<<2],d[2][N<<2],xa[N],ya[N],xb[N],yb[N],k[N],ans[N<<2];
inline int f(int i, int j) { return i*(m+3)+j; }
int main()
{
	scanf("%d%d%d",&n,&m,&T);
	for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) scanf("%d",&a[f(i,j)]);
	for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) ans[f(i,j)]=1;
	for(int i=1; i<=T; i++) 	scanf("%d%d%d%d%d",&xa[i],&ya[i],&xb[i],&yb[i],&k[i]);
	for(int c=0; c<22; c++)
	{	
		for(int t=0; t<=1; t++) for(int i=0; i<=n+1; i++) for(int j=0; j<=m+1; j++) d[t][f(i,j)]=0;
		for(int i=1; i<=T; i++)
		{
			d[(k[i]>>c)&1][f(xa[i],ya[i])]++;
			d[(k[i]>>c)&1][f(xb[i]+1,yb[i]+1)]++;
			d[(k[i]>>c)&1][f(xa[i],yb[i]+1)]--;
			d[(k[i]>>c)&1][f(xb[i]+1,ya[i])]--;
		}
		for(int t=0; t<=1; t++) for(int i=1; i<=n; i++) for(int j=1; j<=m; j++)
			d[t][f(i,j)]+=d[t][f(i,j-1)]+d[t][f(i-1,j)]-d[t][f(i-1,j-1)];
		for(int i=1; i<=n; i++)
			for(int j=1; j<=m; j++)
			{
				int t=(a[f(i,j)]>>c)&1;
				if(d[t^1][f(i,j)]>0) ans[f(i,j)]=0;
			}
	}
	int cnt=0;
	for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) if(!ans[f(i,j)]) cnt++;
	printf("%d\n",cnt);
	return 0;
}

标签:nm,int,题解,5093,这题,数组,DTOJ,拆位
From: https://www.cnblogs.com/copper-carbonate/p/16886591.html

相关文章

  • DTOJ 6316 沙丘 题解
    DTOJ6316沙丘题解题面:http://59.61.75.5:8018/p/P6316在满天的星光下,灰大狼一人孤独地堆起了小沙丘。有\(n\)堆沙丘,每堆沙丘有相对高度\(h_i\),每次灰大狼可以选择......
  • CF1748E Yet Another Array Counting Problem 题解
    可能更好的阅读体验题目传送门题目大意给定一个长度为\(n\)的序列\(a\)和\(m\),定义\([l,r]\)的最左边的最大值为最小的\(l\lei\ler\)满足\(x_i=\max\{a_......
  • CF1748D ConstructOR 题解
    可能更好的阅读体验题目传送门题目大意给定\(a,b,d\),要求找到一个\(0\lex\le2^{60}\),满足\(a|x,b|x\)都是\(d\)的倍数(\(|\)代表按位或)。\(T\le10^4\),\(0\le......
  • 能力提升综合题单-模拟,前缀和差分 题解
    好久没有写题解了,今天回来了!!A-铺地毯在luogu,享受coding的快乐见到题以后,一道水题直接模拟二位数组。。。《真·ACcode》:点击查看代码#include<bits/stdc++.h>u......
  • CF1746D题解
    很好的一道贪心题。首先对于每条路径,由于要最大化权值,每条路径肯定要延伸到叶子节点。切入点肯定在\(|c_u-c_v|\leq1\),也就是说由节点\(i\)延伸下去的路径要均匀分配......
  • DTOJ 2022.11.02 图论专题
    题单P1117无序字母对P5240「NOIP2020」排水系统P4042「NOIP2018」旅行P5169「CSP-S2020」函数调用P4563「NOIP2017」逛公园题解A题面:给定\(n\)个各不相同的......
  • [CEOI2016] kangaroo题解
    P5999[CEOI2016]kangaroo一类插入式的dp。对于这道题,我们得先做出一个转化,依次考虑每个数插到哪个位置,于是变成了求\(1\)~\(n\)的排列同时满足每个位置上的元素要么......
  • P1858 多人背包 题解
    本题解灵感来源于题解P1858【多人背包】sto顾zorz本篇题解仅仅是对该题解的解释和说明。主要对原题解的解析部分加以补充:该文章中刷表的地方,是通过两个值去更新新......
  • 【题解】CSP-S2022 T2策略游戏
    简要题意有两串数A[1 n],B[1 m]A[1 n],B[1 m],有两个人小L和小QL和小Q,给出q组l1,r1,l2,r2q组l1,r1,l2,r2,对于每组,小L在A[l1 r1]A[l1 r1]中取一数x,小Q在B[l2 r2]B[l2......
  • Codeforces Round #833 (Div. 2) A-C题解
    比赛链接A、手摸不难发现,能做出的正方形大小就是当前的最大长度。所以直接输出向上取整即可。点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineN......