【训练题48:想法 + 模拟】Lawn of the Dead | HDU6992 | 杭电多校四 08题
题意
- 【2021“MINIEYE杯”中国大学生算法设计超级联赛(4)】Lawn of the Dead | HDU6992
n×mn\times mn×m 的网格
有 kkk 个土豆雷,坐标为 xi,yix_i,y_ixi,yi
有一个僵尸在 (1,1)(1,1)(1,1)
一次移动可以向右 / 向下移动一格,但他不能走到土豆雷上,最后走到不能走为止。
他有多少个格子是能够走得到的? - 1≤n,m,k≤1051\le n,m,k\le 10^51≤n,m,k≤105
思路
- 什么?stdstdstd 是线段树? 那直接暴打 stdstdstd ( bushibushibushi
首先范围比较大,网格开不下
答案最大为 O(nm)O(nm)O(nm),答案肯定不是一格一格算的,是一坨一坨算的
考虑土豆雷怎么限制我们的移动范围:
- 可以看到,把我们上一行的所有可行范围存成一段一段的连续区间
当前行的暂时可行范围就是所有中间一段没有土豆雷的区间
那么当前行的真实可行范围是什么呢?
假设 上一行的一个可行范围为 [L1,R1][L1,R1][L1,R1],当前行的一个暂时可行范围为 [L2,R2][L2,R2][L2,R2]
若 [L1,R1]∩[L2,R2]≠∅[L1,R1]\cap [L2,R2]\ne \varnothing[L1,R1]∩[L2,R2]=∅ ,那么当前行的真实范围为 [max{L1,L2},R2][\max\{L1,L2\},R2][max{L1,L2},R2] - 然后就一行一行去推。因为若某一行无土豆雷,那么区间便只剩下一个 [1,m][1,m][1,m],所以区间段数不会很多,是 O(n+k)O(n+k)O(n+k) 级别的
代码
- 时间复杂度:O(n+klogk)O(n+k\log k)O(n+klogk)
#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
using namespace std;
typedef long long ll;
void show(){std::cerr << endl;}template<typename T,typename... Args>void show(T x,Args... args){std::cerr << "[ " << x << " ] , ";show(args...);}const int MAX = 1e5+50;
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
const double EPS = 1e-5;struct node{int x,y;bool operator< (const node &ND)const{if(x != ND.x)return x < ND.x;return y < ND.y;}
}mine[MAX];
struct node2{int zuo,you;
};
vector<node2>aa[2],lei; // aa[st] 上一行真实区间 aa[st^1] 当前真实行区间 lei 当前行暂时可行区间
int main()
{int T;T = read();while(T--){int n,m,k;n = read();m = read();k = read();for(int i = 1;i <= k;++i){mine[i].x = read();mine[i].y = read();}sort(mine+1,mine+1+k);int now = 1;ll ans = 0;int st = 0;aa[st].clear();aa[st^1].clear();aa[st].push_back((node2){1,1});for(int i = 1;i <= n;++i){lei.clear();if(mine[now].x == i){ // 把这一行的暂时可行区间拿出来int las = 1;while(now <= k && mine[now].x == i){if(las <= mine[now].y-1)lei.push_back((node2){las,mine[now].y-1});las = mine[now].y + 1;now++;}if(las <= m)lei.push_back((node2){las,m});}else{lei.push_back((node2){1,m});}
// show("i = " , i);
// for(auto it : lei){// show(it.zuo,it.you);
// }// show("i = " , i);
// for(auto it : aa[st]){// show(it.zuo,it.you);
// }int shu1 = aa[st].size();int shu2 = lei.size();int tmp = 0;for(int j = 0;j < shu2;++j){while(tmp < shu1 && aa[st][tmp].you < lei[j].zuo)tmp++; // 对于每一个暂时可行区间,去做操作if(tmp == shu1)break;int l = max(aa[st][tmp].zuo,lei[j].zuo);int r = min(aa[st][tmp].you,lei[j].you);int r2= lei[j].you;if(l <= r){aa[st^1].push_back((node2){l,r2});ans += (r2 - l + 1);}}aa[st].clear();st ^= 1; // 二维数组滚动一下}Print(ans,'\n');}Write();return 0;
}
/**
3
4 4 4
2 1
2 2
2 3
2 44 4 3
4 1
3 2
4 34 4 2
1 2
2 1
*/
【训练题48:想法 + 模拟】Lawn of the Dead | HDU6992 | 杭电多校四 08题相关推荐
- 【2022杭电多校5 1012题 Buy Figurines】STL的运用
题目描述 输入 输出 样例输入 1 5 3 2 4 1 3 5 1 3 4 4 2 样例输出 7 题意 有n个人去买东西,有m个窗口,每个人都有到达时间和花费时间,每个人到的时候都是挑一条人少的队排, ...
- 杭电计算机复试面试题库,杭电电子分院历年复试题(整理版)
杭电电子分院历年复试题(整理版) 这个是我自己整理的,希望大家喜欢... 06年的 1.名词解释: CDMASOCDSPVHDL3G 2.写出3种以上的EDA开发工具,年并说明其特点 3.有2个单刀双 ...
- 杭电计算机复试面试题库,杭电电子分院历年复试题(整理版).doc
杭电电子分院历年复试题(整理版).doc (2页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.90 积分 杭电电子分院历年复试题(整理版)这个是我 ...
- 【2019杭电多校训练赛】HDU6681 / 1002-Rikka with Cake 题解(扫描线)
[2019杭电多校训练赛]HDU6681 / 1002-Rikka with Cake 题解 题意 思路 代码 题目来自于:HDU6681 Rikka with Cake 题意 题目的大意是给定你一个 ...
- 杭电多校第六场个人补题6 7 9 10 12
杭电多校第六场个人补题6 7 9 10 12 6 题意 给定一棵有n结点的树,点权为1~n,求对所有结点子树的mex操作和的最大值 思路 其实就是从最底部开始网上找,由于0是唯一的一个,所欲最好给在最 ...
- 2019年杭电多校第一场 1001题blank(DP)HDU6578
2019年杭电多校第一场 1001题blank(DP)HDU6578 解决思路,开一个DP数组来存储0 1 2 3四个字符最后出现的位置,并且在DP中已经==排好序==. DP开四维,DP[i][j] ...
- 2021杭电多校补题——第一场
2021杭电多校补题--第一场 文章目录 Mod, Or and Everything Rocket land(待补) Puzzle loop(待补) Another thief in a Shop( ...
- 【2021杭电多校赛】2021“MINIEYE杯”中国大学生算法设计超级联赛(4)签到题4题
Solved Pro.ID Title Ratio(Accepted / Submitted) 1001 Calculus 23.59%(852/3611) (数学,签到,结论) 1002 Kanad ...
- 杭电acm的第1000题c语言解法
首先我选择的是c语言的解法,开始是输入如下的答案: #include "stdio.h" int main(void) { long long a,b; scanf("% ...
最新文章
- 3D目标检测深度学习方法中voxel-represetnation内容综述(三)
- docker 启动petalinux镜像脚本
- [转]Python UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 的解决办法...
- 安徽省2019年普通高校招生文史、理工类最低控制分数线一览表
- vb的GUID生成算法
- HttpClientFactory 使用说明 及 对 HttpClient 的回顾和对比
- 郑杰 | 如何拿回我们自己的医疗数据?
- 枚举值是什么意思_期权的Theta值是什么意思?有什么意义?
- 自动化测试框架的搭建
- 西门子s300编程实例_几个西门子plc编程实例图解(含程序应用实例)
- 未來用工新趨勢_2019年社会化用工成新趋势
- 微信小程序getUserInfo返回拼音的解决办法
- [高项]消极风险VS积极风险
- [转载] 支持支付宝付款的四大国外主机
- 点积与叉乘的运算与物理意义
- 无胁科技-TVD每日漏洞情报-2022-8-1
- XEN和KVM云计算虚拟化技术
- 【笔记】Java反射专题
- 支付系统流程以及防止订单重复提交
- Android自定义view之太极图