题目链接:点击查看

题目大意:给出一个 n∗mn*mn∗m 的矩阵,有 kkk 个点被 banbanban 掉了,现在从点 (1,1)(1,1)(1,1) 出发,只能向右或向下移动,问可以到达的点有多少个

题目分析:

先做一些定义,定义无法到达的点为“坏点”,可以到达的点为“好点”

虽然 n∗mn*mn∗m 很大,不能直接 bfsbfsbfs,但是单独的 nnn 或 mmm 却不大,这里我从列入手,考虑相邻的两列,假设 preprepre 为上一列的状态,现在考虑 curcurcur 的情况。对于第 curcurcur 列的每个“坏点”来说,设其横坐标为 xxx,我们需要找到第 preprepre 列中,行区间 [x+1,n][x+1,n][x+1,n] 中的首个“好点”的位置记为 ppp,不难看出,curcurcur 列中的行区间 [x,p−1][x,p-1][x,p−1] 这段都是无法到达的“坏点”。还有一种情况就是 ppp 不存在,也就是 preprepre 列的行区间 [x+1,n][x+1,n][x+1,n] 这段都是“坏点”,那么显然 curcurcur 列中行区间为 [x,n][x,n][x,n] 的点也是无法到达的

区间修改、区间查找某个数字首次出现的位置,用线段树很容易就能实现了,时间复杂度 O(nlog2n)O(nlog^2n)O(nlog2n)

需要注意的是,每一列的第 000 行也要视为一个坏点

代码:

// Problem: Lawn of the Dead
// Contest: Virtual Judge - HDU
// URL: https://vjudge.net/problem/HDU-6992
// Memory Limit: 262 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<list>
#include<unordered_map>
#define lowbit(x) (x&-x)
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
template<typename T>
inline void read(T &x)
{T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f;
}
template<typename T>
inline void write(T x)
{if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0');
}
const int inf=0x3f3f3f3f;
const int N=1e6+100;
struct Seg {struct Node {int l,r,len,sum,lazy;}tree[N<<2];void pushup(int k) {tree[k].sum=tree[k<<1].sum+tree[k<<1|1].sum;}void pushdown(int k) {if(tree[k].lazy!=-1) {int lz=tree[k].lazy;tree[k].lazy=-1;tree[k<<1].lazy=tree[k<<1|1].lazy=lz;tree[k<<1].sum=tree[k<<1].len*lz;tree[k<<1|1].sum=tree[k<<1|1].len*lz;}}void build(int k,int l,int r) {tree[k]={l,r,r-l+1,0,-1};if(l==r) {return;}int mid=(l+r)>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);}void update(int k,int l,int r,int val) {if(tree[k].l>r||tree[k].r<l) {return;}if(tree[k].l>=l&&tree[k].r<=r) {tree[k].lazy=val;tree[k].sum=tree[k].len*val;return;}pushdown(k);update(k<<1,l,r,val);update(k<<1|1,l,r,val);pushup(k);}int query_sum(int k,int l,int r) {if(tree[k].l>r||tree[k].r<l) {return 0;}if(tree[k].l>=l&&tree[k].r<=r) {return tree[k].sum;}pushdown(k);return query_sum(k<<1,l,r)+query_sum(k<<1|1,l,r);}int query(int k,int l,int r) {if(l>r||query_sum(k,l,r)==0) {return -1;}if(tree[k].l==tree[k].r) {return tree[k].l;}pushdown(k);if(query_sum(k<<1,l,r)) {return query(k<<1,l,r);} else {return query(k<<1|1,l,r);}}
}t[2];
vector<int>node[N];
int main()
{#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int w;cin>>w;while(w--) {int n,m,k;read(n),read(m),read(k);for(int i=1;i<=m;i++) {node[i].clear();node[i].push_back(0);}while(k--) {int x,y;scanf("%d%d",&x,&y);node[y].push_back(x);}LL ans=0;t[0].build(1,1,n),t[1].build(1,1,n);sort(node[1].begin(),node[1].end());if(node[1].size()>1) {t[1].update(1,1,node[1][1]-1,1);} else {t[1].update(1,1,n,1);}ans+=t[1].tree[1].sum;for(int i=2;i<=m;i++) {int cur=i&1,pre=cur^1;t[cur].update(1,1,n,1);for(auto it:node[i]) {int p=t[pre].query(1,it+1,n);if(p==-1) {t[cur].update(1,it,n,0);} else {t[cur].update(1,it,p-1,0);}}ans+=t[cur].tree[1].sum;}printf("%lld\n",ans);}return 0;
}

HDU多校4 - 6992 Lawn of the Dead(线段树+模拟)相关推荐

  1. HDU - 6992 Lawn of the Dead 线段树 + 思维

    传送门 文章目录 题意: 思路: 题意: 给你一张n∗mn*mn∗m的图,其中有kkk个点不能走,你只能向下和向右走,问你能到达多少点. n,m,k≤1e5n,m,k\le1e5n,m,k≤1e5 思 ...

  2. HDU 6183 2017广西邀请赛:Color it(线段树)

    题目太长了就直接放链接吧 http://acm.hdu.edu.cn/showproblem.php?pid=6183 题意: 一个空的坐标系,有④种操作:①1 x y c表示在(x, y)点染上颜色 ...

  3. HDU多校1 - 6756 Finding a MEX(分块+二分+树状数组)

    题目链接:点击查看 题目大意:给出一个 n 个点和 m 条边的无向图,每个点都有一个权值,现在需要执行 q 次操作,每次操作分为两种类型: 1 pos val :将第 pos 个点的权值修改为 val ...

  4. HDU 4893 Wow! Such Sequence!(2014年多校联合 第三场 G)(线段树)

    磨了一天的线段树,不能说完全搞清楚,只能说有一个大概的了解,靠着模板才把这道题A了,只能说太弱~~! 题意: 初始时有一字符串,全为0. 三种操作: 1 k d - add  把d加到第k个数上去 2 ...

  5. 2021牛客暑期多校训练营7 B-xay loves monotonicity(线段树+不降子序列)

    P4198 楼房重建 线段树维护以某点为开头的最长不下降子序列 使用下面calc函数能够计算线段树u维护的区间中,以x为开头最长不下降子序列的个数. calc需要维护区间最值. template< ...

  6. 2021牛客暑期多校训练营7 F-xay loves trees(线段树+滑动窗口)

    F-xay loves trees 考虑在树1中满足条件的一些点,首先不难想到一定是一条链,其次如果点uuu被选择那么在树2以uuu为根的子树的点就禁止被选,于是只需区间+,然后查询区间最值是否存在& ...

  7. 【HDU - 5493】Queue(思维,贪心,线段树)

    题干: NN people numbered from 1 to NN are waiting in a bank for service. They all stand in a queue, bu ...

  8. 【HDU - 3974】 Assign the task (dfs序 + 线段树维护 区间更新+ 单点查询)

    题干: There is a company that has N employees(numbered from 1 to N),every employee in the company has ...

  9. HDU 6194 string string string 后缀数组 + RMQ(线段树)

    传送门:HDU6194 题意:问给定字符串中有多少种出现k次的子串. 思路:首先想到后缀数组经典问题,求出现不少于k次的子串的最大长度,类似的这题肯定就是在height数组上搞事情啦. 将height ...

最新文章

  1. CPU_X86架构和ARM架构入门篇
  2. JVM技术周报第2期
  3. AndroidStudio部署项目时出现错误:Instant Run requires 'Tools | Android | Enable ADB integration' to be enabled
  4. 当我谈跑步时我谈些什么——村上春树
  5. java的class和object_Java中Class/Object/T的关系
  6. 利用一维数组输出杨辉三角
  7. c语言编程输入a是输出为a_C ++编程基本输入,输出,数据类型,声明能力倾向问题和解答...
  8. 【算法】剑指 Offer 30. 包含min函数的栈
  9. 在mysql支持关系模型中_MySQL支持关系模型中、和三种不同的完整性约束
  10. miracast和乐播投屏_【当贝市场】Windows 10 Mircast投屏到电视教程
  11. Chrome最新离线安装包下载
  12. FPGA 实现SVPWM调制
  13. java flex 聊天_【转帖】实现了视频私聊功能
  14. org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 文件提前结
  15. 亚马逊云科技赋能全新基于云的安全SaaS平台——安智联365
  16. 音视频通讯QoS技术及其演进
  17. subclipse使用详解
  18. 对付虚伪的人,用这招!
  19. 让我摘下星星送给你_想摘下星星给你摘下月亮给你是什么歌
  20. 80万条毛巾库存,16天就销售一空,并净赚240万的营销方案揭秘!

热门文章

  1. 10个相见恨晚的 Java 在线练手项目
  2. php warning: file_get_contents,Ecshop报警告:Warning: file_get_contents
  3. ocr python opencv_如何使用(opencv/python)来实现OCR处
  4. RabbitMQ 的概念
  5. 思考一下消息中间件的设计
  6. zookeeper的名词复盘-版本-保证分布式数据原子性
  7. 扫描指定包并解析为BeanDefinition
  8. https安全传输协议
  9. mybatis扫描mapper的xml文件参数
  10. spring的依赖注入