题意

  • 【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+klog⁡k)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题相关推荐

  1. 【2022杭电多校5 1012题 Buy Figurines】STL的运用

    题目描述 输入 输出 样例输入 1 5 3 2 4 1 3 5 1 3 4 4 2 样例输出 7 题意 有n个人去买东西,有m个窗口,每个人都有到达时间和花费时间,每个人到的时候都是挑一条人少的队排, ...

  2. 杭电计算机复试面试题库,杭电电子分院历年复试题(整理版)

    杭电电子分院历年复试题(整理版) 这个是我自己整理的,希望大家喜欢... 06年的 1.名词解释: CDMASOCDSPVHDL3G 2.写出3种以上的EDA开发工具,年并说明其特点 3.有2个单刀双 ...

  3. 杭电计算机复试面试题库,杭电电子分院历年复试题(整理版).doc

    杭电电子分院历年复试题(整理版).doc (2页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.90 积分 杭电电子分院历年复试题(整理版)这个是我 ...

  4. 【2019杭电多校训练赛】HDU6681 / 1002-Rikka with Cake 题解(扫描线)

    [2019杭电多校训练赛]HDU6681 / 1002-Rikka with Cake 题解 题意 思路 代码 题目来自于:HDU6681 Rikka with Cake 题意 题目的大意是给定你一个 ...

  5. 杭电多校第六场个人补题6 7 9 10 12

    杭电多校第六场个人补题6 7 9 10 12 6 题意 给定一棵有n结点的树,点权为1~n,求对所有结点子树的mex操作和的最大值 思路 其实就是从最底部开始网上找,由于0是唯一的一个,所欲最好给在最 ...

  6. 2019年杭电多校第一场 1001题blank(DP)HDU6578

    2019年杭电多校第一场 1001题blank(DP)HDU6578 解决思路,开一个DP数组来存储0 1 2 3四个字符最后出现的位置,并且在DP中已经==排好序==. DP开四维,DP[i][j] ...

  7. 2021杭电多校补题——第一场

    2021杭电多校补题--第一场 文章目录 Mod, Or and Everything Rocket land(待补) Puzzle loop(待补) Another thief in a Shop( ...

  8. 【2021杭电多校赛】2021“MINIEYE杯”中国大学生算法设计超级联赛(4)签到题4题

    Solved Pro.ID Title Ratio(Accepted / Submitted) 1001 Calculus 23.59%(852/3611) (数学,签到,结论) 1002 Kanad ...

  9. 杭电acm的第1000题c语言解法

    首先我选择的是c语言的解法,开始是输入如下的答案: #include "stdio.h" int main(void) { long long a,b; scanf("% ...

最新文章

  1. 3D目标检测深度学习方法中voxel-represetnation内容综述(三)
  2. docker 启动petalinux镜像脚本
  3. [转]Python UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 的解决办法...
  4. 安徽省2019年普通高校招生文史、理工类最低控制分数线一览表
  5. vb的GUID生成算法
  6. HttpClientFactory 使用说明 及 对 HttpClient 的回顾和对比
  7. 郑杰 | 如何拿回我们自己的医疗数据?
  8. 枚举值是什么意思_期权的Theta值是什么意思?有什么意义?
  9. 自动化测试框架的搭建
  10. 西门子s300编程实例_几个西门子plc编程实例图解(含程序应用实例)
  11. 未來用工新趨勢_2019年社会化用工成新趋势
  12. 微信小程序getUserInfo返回拼音的解决办法
  13. [高项]消极风险VS积极风险
  14. [转载] 支持支付宝付款的四大国外主机
  15. 点积与叉乘的运算与物理意义
  16. 无胁科技-TVD每日漏洞情报-2022-8-1
  17. XEN和KVM云计算虚拟化技术
  18. 【笔记】Java反射专题
  19. 支付系统流程以及防止订单重复提交
  20. Android自定义view之太极图

热门文章

  1. HTTP协议、【HTTP请求、响应格式】及一次HTTP请求的完整过程
  2. string和字符数组的reverse函数
  3. 浅谈神经网络之链式法则与反向传播算法
  4. linux系统下u盘变成只读模式如何修改
  5. 【数据库】什么是 PostgreSQL?开源数据库系统
  6. 计算机应用基础与实训教程word2003文字处理软件 教学目标,计算机基础教学计划多篇...
  7. 绘图工具-PlantUML
  8. (深度学习快速入门)第三章第一节:多层感知器简介
  9. np.load()读取npy文件
  10. 调取创蓝253国际短信验证码-代码示例2