尼玛,这种简单的模拟题居然成了913天之前我还是小蒟蒻的时候的技术难关。这不就是个破模拟吗,谁都会,不要想得那么复杂。模拟真好,我爱模拟!!!
看到网上一堆玄学高级而离谱的解法,比如说线段树,珂朵莉树之类的,虽说高效,但是看到那一长串代码就感觉没啥胃口看下去。反正模拟可以解决的题,老子肯定用模拟(主要是因为懒得写那一些giao级算法,看着能把我难死)。
总之,这一道题我心里是五味杂陈啊!!
先看题目吧。
题目描述
某校大门外长度为 l 的马路上有一排树,每两棵相邻的树之间的间隔都是 1 米。我们可以把马路看成一个数轴,马路的一端在数轴 0 的位置,另一端在 l 的位置;数轴上的每个整数点,即 0,1,2,…,l,都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
输入格式
第一行有两个整数,分别表示马路的长度 l 和区域的数目 m。
接下来 m 行,每行两个整数 u,v,表示一个区域的起始点和终止点的坐标。
输出格式
输出一行一个整数,表示将这些树都移走后,马路上剩余的树木数量。
输入输出样例
输入 #1复制
500 3 150 300 100 200 470 471
输出 #1复制
298
说明/提示
【数据范围】
- 对于 20%20% 的数据,保证区域之间没有重合的部分。
- 对于 100%100% 的数据,保证1<=l<=10^4,1<=m<=100,0<=u<=v<=l。
【题目来源】
NOIP 2005 普及组第二题
这一题网上的做法是上下翻飞奇奇葩葩的,但是我还是喜欢回归本真,用我30个月之前学的模拟来做(主要是省事qwq……)
上代码!
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4 + 10;
int l,a,b,m,ans=0;
int trees[N];
int main(){
cin>>l>>m;
while(m--){
cin>>a>>b;
for(int i=a;i<=b;i++) trees[i] = 1;
}
for(int i=0;i<=l;i++) if(!trees[i]) ans++;
cout<<ans<<endl;
return 0;
}
程序猿要有写简单低效代码的勇气。这个代码的思路再逊,只要学到初级知识多那么一miumiu就可以看懂吧。
定义一个长度1e4+10的int数组,代表数砍没被砍的状态,没被砍的话0,砍了的话1(主要是省事,不用再memset1一遍,正好全局数组自动全部搞成0)。之后的思路比才喝几罐就醉了的彬彬还要逊2.5倍,输入lm,然后m次操作,每一次都修改区间(我甚至都没有用差分,我哭死),tmd直接暴力我看谁能拿我怎么样!每一次要砍了,甭管他砍没砍,直接设置为已砍状态,砍完了的就当树根给拔喽(开玩笑的,目的就是把区间内没砍的都修改状态,那么改就完事了,如果已经砍掉了那再设置一遍也无妨),最后再从0到l统计有几个数还没被砍掉,ans++,最后输出ans。
就他妈这么简单!!!!
再见,今天心情很差。