ECNU 2018 10月月赛 E 盖房子 (bitset + 倍增)
题目链接 ECNU Monthly 2018.10 Problem E
从开场写到结束……
显然要把三角形分成上下两部分。
把每一部分分成三部分,以上部分为例。
上面和右边,以及左下角的正方形。
也就是两个小三角形和一个正方形合起来。
处理正方形的时候稍微麻烦一些。
然后直接倍增就可以了。
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define fi first
#define se second
#define MP make_pair typedef long long LL; const int N = 1e3 + 10; bitset <102> f[N][N][10], g[N][N][10], ff[N][N][10], gg[N][N][10];
int n, m, q;
int T;
int lg[N + 10]; inline int check(int x, int y){
return x >= 1 && x <= n && y >= 1 && y <= m;
} int main(){ lg[1] = 0;
rep(i, 2, 1001) lg[i] = lg[i >> 1] + 1;
scanf("%d%d", &n, &m); rep(i, 1, n){
rep(j, 1, m){
int x;
scanf("%d", &x);
f[i][j][0].set(x);
g[i][j][0].set(x);
ff[i][j][0].set(x);
gg[i][j][0].set(x);
}
} rep(k, 1, 9){
rep(i, 1, n){
rep(j, 1, m){
int xx, yy, zz = 1 << (k - 1);
f[i][j][k] |= f[i][j][k - 1];
xx = i - zz;
yy = j; if (check(xx, yy)) f[i][j][k] |= f[xx][yy][k - 1]; xx = i;
yy = j + zz;
if (check(xx, yy)) f[i][j][k] |= f[xx][yy][k - 1]; xx = i - zz;
yy = j + zz;
if (check(xx, yy)) f[i][j][k] |= f[xx][yy][k - 1]; ff[i][j][k] |= ff[i][j][k - 1]; xx = i + zz;
yy = j;
if (check(xx, yy)) ff[i][j][k] |= ff[xx][yy][k - 1]; xx = i;
yy = j + zz;
if (check(xx, yy)) ff[i][j][k] |= ff[xx][yy][k - 1]; xx = i + zz;
yy = j + zz;
if (check(xx, yy)) ff[i][j][k] |= ff[xx][yy][k - 1]; }
}
} rep(k, 1, 9){
rep(i, 1, n){
rep(j, 1, m){
int xx, yy, zz = 1 << (k - 1);
g[i][j][k] |= f[i][j][k - 1];
xx = i - zz;
yy = j;
if (check(xx, yy)) g[i][j][k] |= g[xx][yy][k - 1]; xx = i;
yy = j + zz;
if (check(xx, yy)) g[i][j][k] |= g[xx][yy][k - 1]; gg[i][j][k] |= ff[i][j][k - 1];
xx = i + zz;
yy = j;
if (check(xx, yy)) gg[i][j][k] |= gg[xx][yy][k - 1]; xx = i;
yy = j + zz;
if (check(xx, yy)) gg[i][j][k] |= gg[xx][yy][k - 1]; }
}
} scanf("%d", &q);
while (q--){
int x, y, z;
scanf("%d%d%d", &x, &y, &z); if (z == 1){
puts("1");
continue;
} int c = lg[z]; bitset <102> ret; int xx, yy, zz = 1 << c; xx = x - z + zz;
yy = y; ret |= g[xx][yy][c]; xx = x;
yy = y + z - zz; ret |= g[xx][yy][c]; int t = (z) >> 1; int l = lg[t], ll = 1 << l; ret |= f[x][y][l]; xx = x - t + ll;
yy = y;
ret |= f[xx][yy][l]; xx = x;
yy = y + t - ll;
ret |= f[xx][yy][l]; xx = x - t + ll;
yy = y + t - ll;
ret |= f[xx][yy][l]; xx = x + z - zz;
yy = y;
ret |= gg[xx][yy][c]; xx = x;
yy = y + z - zz;
ret |= gg[xx][yy][c]; ret |= ff[x][y][l];
xx = x + t - ll;
yy = y;
ret |= ff[xx][yy][l]; xx = x;
yy = y + t - ll;
ret |= ff[xx][yy][l]; xx = x + t - ll;
yy = y + t - ll;
ret |= ff[xx][yy][l]; printf("%d\n", (int)ret.count());
} return 0; }
ECNU 2018 10月月赛 E 盖房子 (bitset + 倍增)的更多相关文章
- 【LGR-054】洛谷10月月赛II
[LGR-054]洛谷10月月赛II luogu 成功咕掉Codeforces Round #517的后果就是,我\(\mbox{T4}\)依旧没有写出来.\(\mbox{GG}\) . 浏览器 \( ...
- 洛谷 T28312 相对分子质量【2018 6月月赛 T2】 解题报告
T28312 「化学」相对分子质量 题目描述 做化学题时,小\(F\)总是里算错相对分子质量,这让他非常苦恼. 小\(F\)找到了你,请你来帮他算一算给定物质的相对分子质量. 如果你没有学过相关内容也 ...
- 洛谷10月月赛Round.3
Rank11:260=60+100+100 P2409 Y的积木 题目背景 Y是个大建筑师,他总能用最简单的积木拼出最有创意的造型. 题目描述 Y手上有n盒积木,每个积木有个重量.现在他想从每盒积木中 ...
- 洛谷10月月赛Round.1| P3398 仓鼠找sugar[LCA]
题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c) ...
- 洛谷10月月赛Round.1| P3400 仓鼠窝[单调栈]
题目描述 萌萌哒的Created equal是一只小仓鼠,小仓鼠自然有仓鼠窝啦. 仓鼠窝是一个由n*m个格子组成的行数为n.列数为m的矩阵.小仓鼠现在想要知道,这个矩阵中有多少个子矩阵!(实际上就是有 ...
- 洛谷10月月赛Round.1| P3399 丝绸之路 [DP]
题目背景 张骞于公元前138年曾历尽艰险出使过西域.加强了汉朝与西域各国的友好往来.从那以后,一队队骆驼商队在这漫长的商贸大道上行进,他们越过崇山峻岭,将中国的先进技术带向中亚.西亚和欧洲,将那里的香 ...
- csu 10月 月赛 H 题 A Very Hard Problem
Description CX老湿经常被人黑,被黑得多了,自己也就麻木了.于是经常听到有人黑他,他都会深情地说一句:禽兽啊! 一天CX老湿突发奇想,给大家出了一个难题,并且声称谁能够准确地回答出问题才能 ...
- csu 10月 月赛 I 题 The Contest
Description 殷犇有很多队员.他们都认为自己是最强的,于是,一场比赛开始了~ 于是安叔主办了一场比赛,比赛有n个题目,每个题目都有一个价值Pi和相对能力消耗Wi,但是有些题目因为太坑不能同时 ...
- csu 10月 月赛 J 题
Description CSU又到了一年中评奖学金的时候了……各大学霸都或多或少地拿到了各种奖学金(你们自己看着办吧). 在这里,评奖学金有个很奇怪的规矩——每个同学得到的奖学金数一定满足相邻的两个非 ...
随机推荐
- maven中package和install命令的区别
mvn package 编译并打包工程,根据pom文件中packaging是jar还是war进行打包,会在项目的target目录下生成一个jar/war包. mvn install 打包并安装到mav ...
- [USACO13NOV] Pogo-Cow
https://www.luogu.org/problem/show?pid=3089 题目描述 In an ill-conceived attempt to enhance the mobility ...
- 51Nod 1381 硬币游戏 | 概率(数学期望)
Input 第一行给出一个整数T,表示有T组数据(1<=T<=10000). 第2行到T+1,每行给出一个整数R.(0< R <= 10,000,000,000) Output ...
- PHP系统编程--03.PHP进程信号处理
PHP的pcntl扩展提供了信号处理的功能,利用它可以让PHP来接管信号的处理,在开发服务器端守护进程方面,信号处理至关重要. 函数原型 bool pcntl_signal(int $signo ,c ...
- Vuejs - 单文件组件
为什么需要单文件组件 在之前的实例中,我们都是通过 Vue.component 或者 components 属性的方式来定义组件,这种方式在很多中小规模的项目中还好,但在复杂的项目中,下面这些缺点就非 ...
- 大聊Python----quene队列
当必须在多个线程之间安全地交换信息时,队列在线程编程中特别有用. class queue.Queue(maxsize=0) # 先入先出class queue.LifoQueue(maxsize=0 ...
- 详解JS中Number()、parseInt()和parseFloat()的区别
三者的作用: Number(): 可以用于任何数据类型转换成数值: parseInt().parseFloat(): 专门用于把字符串转换成数值: 一.Number( ): (1)如果是Boolean ...
- python基础===flask使用整理(转)
flask 使用的一些整理 资源 Flask 文档|英文| expore flask| 快速教材| flask-admin| Flask-DebugToolbar| Flask-Login| Flas ...
- wifi驱动移植
目标板:Hi3518 内核版本:linux3.0.8 1.修改makefile #PLATFORM = PC //注释掉 PLATFORM = HI3518 //支持平台 ifeq ($(PLAT ...
- shell中引号的作用(转)
引号的作用 1 双引号(“”) 1)使用””可引用除字符$(美元符号).`(反引号).\(反斜线)外的任意字符或字符串.双引号不会阻止shell对这三个字符做特殊处理(标示变量名.命令替换.反斜线转义 ...