P1047 校门外的树

P1047

 

题目描述

  某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,,L,都种有一棵树。由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

 

 

输入输出格式

 

 

 

 

 

 

 

 

 

解法1:循环打表

 

思路:

  第一遍,利用0和1标记,若已经移树,则为1.

  第二遍,直接在输入的循环里判断、标记。

  第三遍,最后再过一遍,计数。

 

 

【代码】

#include <bits/stdc++.h>
using namespace std;
int main(){int i,j,k,m,n,l,sum=0;int a[10001],q,z;cin>>l>>m;for(i=0;i<=l;i++)a[i]=0;for(i=1;i<=m;i++){cin>>q>>z;      for(j=q;j<=z;j++)if(a[j]==0)a[j]++;} for(i=0;i<=l;i++)if(a[i]==0)sum++;cout<<sum;return 0;
}

 

 

 

 

 

 

 

解法2:差分数组

 

思路:

tree记录每个人砍树的开头和结尾。

cut记录一棵树被多少人砍。

  把不同次数的砍树看做不同的人砍树

  第一步:输入,并记录每次砍树的开头和结尾。

  第二步:扫描,同时更新cut。

    如果cut==0,那么说明这棵树没有被(残暴的人类)砍伐。

    否则,则有人砍这棵树,这棵树活不下来。

  由于这里把区间计算变成了端点的计算,所以是差分法。

差分法利用范围比较广,只要可以把区间计算变成端点计算,都可以用差分法,而且时间复杂度一般比较小,实用性强。

 

 

 【代码】 

#include<bits/stdc++.h>
using namespace std;
int main()
{int tree[10010];int leight=0,moved=0,result=0;cin>>leight>>moved;for(int i=0;i<10010;i++)tree[i]=0;while(moved--){int start=0,end=0;cin>>start>>end;tree[start]++;tree[end+1]--;}for(int i=0,cut=0;i<=leight;i++){cut+=tree[i];if(cut<=0)result++;   }cout<<result<<endl;return 0;
}

 

 

 

 

 

 

 

 

解法3:线段树

 

【代码】

#include <bits/stdc++.h>
#define re register
#define FOR(i,l,r) for(re int i=l;i<=r;++i)
using namespace std;int a[100001],ans[100001],tag[100001],m,n,k,l,t,cnt,x,y;inline int in(){  char ch;  int a=0;  while(!(((ch=getchar())>='0')&&(ch<='9')));  a*=10;a+=ch-'0';  while(((ch=getchar())>='0')&&(ch<='9'))a*=10,a+=ch-'0';  return a;  
}inline void out(int a){if(a>=10)out(a/10);putchar(a%10+'0');
}inline int ls(int ss){return ss<<1;
}inline int rs(int ss){return (ss<<1)|1;
}inline void push_up(int k){ans[k]=ans[ls(k)]+ans[rs(k)];
}inline void push_down(int i){if(tag[i]){tag[i]=0;tag[ls(i)]=1;tag[rs(i)]=1;ans[ls(i)]=0;ans[rs(i)]=0;}
}inline void build(int p,int l,int r){if(l==r){ans[p]=1;return;}int mid=(l+r)>>1;build(ls(p),l,mid);build(rs(p),mid+1,r);push_up(p);
}inline void update(int nl,int nr,int l,int r,int p){if(nl<=l&&r<=nr){tag[p]=1;ans[p]=0;return;}push_down(p);int mid=(l+r)>>1;if(nl<=mid) update(nl,nr,l,mid,ls(p));if(nr>mid) update(nl,nr,mid+1,r,rs(p));push_up(p);
}int main(){n=in(),m=in();build(1,1,n+1);FOR(i,1,m){x=in(),y=in();update(x+1,y+1,1,n+1,1);}out(ans[1]);puts("");
}

 

 

 

 

 

 

 

解法4:分块

 

 

 【代码】

#include<bits/stdc++.h>
#define maxn 500010
#define re register
#define FOR(i,l,r) for(re int i=l;i<=r;++i)
using namespace std;int n,m,c,r,t,x,y,z,sq,anss;
int a[maxn],b[maxn],tag[maxn],ans[maxn];inline void in(int &x){x=0;char c=getchar();while(c<'0'||c>'9'){c=getchar();}while(c<='9'&&c>='0'){x=(x<<1)+(x<<3)+(c^'0');c=getchar();}
}inline void out(int a){if(a>=10)out(a/10);putchar(a%10+'0');
}void doit(int x,int y){if(tag[b[x]]!=1)FOR(i,x,min(y,b[x]*sq))ans[b[x]]-=a[i],a[i]=0;if(b[x]!=b[y]&&tag[b[y]]!=1)FOR(i,(b[y]-1)*sq+1,y)ans[b[y]]-=a[i],a[i]=0;FOR(i,b[x]+1,b[y]-1)tag[i]=1,ans[i]=0;
}int main(){in(n),in(m);sq=sqrt(n);FOR(i,0,n)a[i]=1,b[i]=(i-1)/sq+1,++ans[b[i]];FOR(i,1,m){in(x),in(y);doit(x,y);}FOR(i,1,b[n])anss+=ans[i];out(anss);puts("");
} 

 

 

 

 

 

 

解法5:树状数组

 

思路:

  树状数组的经典应用二:区间更新、单点查询,维护的是数列的差分数组(t[i]=a[i]-a[i-1]),区间加就显得很方便,log n 求一遍前缀和就是单点查询了了,巧妙的转化了问题。

  唯一需要注意的点是,由于二进制的特殊性,树状数组中 0 下标是不能用的,然而这道题需要 0,所以我们需要将整个树状数组向右平移一位。

 

 

 

【代码】

#include<cstdio>
int l,t[10005];
//树状数组经典函数,没什么好说的
void add(int x,int y){if(!x)return;for(;x<=l+1;x+=x&-x)//平移一位t[x]+=y;
}
int query(int x){int s=0;for(;x;x-=x&-x)s+=t[x];return s;
}
int main(){int m,x,y;scanf("%d%d",&l,&m);while(m--){scanf("%d%d",&x,&y);add(x+1,1);//原来应该是 [x..n]++, [y+1..n]-- 实现区间加,这里平移一位以凸显 0,无伤大雅。add(y+2,-1);}int ans=0;for(int i=1;i<=l+1;i++)//同样 [0..l] 平移至 [1..l+1]ans+=query(i)==0;//如果为 0 则说明这里没有被砍伐过,累计入答案printf("%d\n",ans);return 0;
}

 

 

 

 

 

 

 

 

解法6:珂朵莉树

 

 

解释:

  珂朵莉树是一种基于set的暴力数据结构

  珂朵莉树的关键在于推平一段区间,即把一段区间的数变的一样(似乎所有珂朵莉树的讲解里面都说了这一句话)

  对每一个点建立一个集合

  当需要修改的时候,就把要修改区间分成两部分,一部分是需要修改的,一部分是不需要修改的,返回需要修改的地址;

  然后把这一段区间内所有的集合都删掉,用一个大集合代替之就可以了。

 

 

 

 

【代码】

 

 1 #include <bits/stdc++.h> 
 2 #define re register
 3 #define FOR(i,l,r) for(re int i=l;i<=r;++i)
 4 #define IT set<node>::iterator
 5 using namespace std;
 6 
 7 int n,m,x,y;
 8 
 9 inline void in(re int &x){
10     x=0;char c=getchar();
11     while(c<'0'||c>'9'){
12         c=getchar();
13     }
14     while(c<='9'&&c>='0'){
15         x=(x<<1)+(x<<3)+(c^'0');
16         c=getchar();
17     }
18 }
19 
20 inline void out(re int a){
21     if(a>=10)out(a/10);
22     putchar(a%10+'0');
23 }
24 
25 struct node{
26     int l,r;
27     mutable int v;
28     node(int L,int R=-1,int V=0):l(L),r(R),v(V) {}
29     bool operator <(const node &o)const{
30         return l<o.l;
31     }
32 };
33 
34 set<node> s;
35 
36 inline IT split(re int pos){
37     IT it=s.lower_bound(node(pos));
38     if(it!=s.end()&&it->l==pos)
39       return it;
40     --it;
41     int L=it->l;
42     int R=it->r;
43     int V=it->v;
44     s.erase(it);
45     s.insert(node(L,pos-1,V));
46     return s.insert(node(pos,R,V)).first;
47 }
48 
49 inline void assign_val(re int l,re int r,re int val=0){
50     IT itr=split(r+1),itl=split(l);
51     s.erase(itl,itr);
52     s.insert(node(l,r,val));
53 }
54 
55 inline int query(re int l,re int r){
56     int res=0;
57     IT itr=split(r+1),itl=split(l);
58     for(;itl!=itr;++itl)
59       res+=(itl->r-itl->l+1)*(itl->v);
60     return res;
61 }
62 
63 int main(){
64     in(n),in(m);
65     s.insert(node(0,n,1));
66     FOR(i,1,m){
67         in(x),in(y);
68         assign_val(x,y,0);
69     }
70     out(query(0,n));
71     puts("");
72 }
73  

 

转载于:https://www.cnblogs.com/fangxiaoqi/p/10365000.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.Net Core Swagger:Actions require an explicit HttpMethod binding for Swagger 2.0

添加完Swagger包引用后运行报错&#xff1a;Actions require an explicit HttpMethod binding for Swagger 2.0 第一时间想到了父类控制器 没有添加 [HttpPost] 之类的特性 添加后就可以解决这个报错原因 但是我的父类控制器里的两个方法只是为了做返回值的一些处理&#xff0c…

matlab impdt,实验1 基于Matlab的数字信号处理基本操作

图1-7 离散时间信号的基本运算及波形图>>title(x2(n)),axis([-15 15 0 1]) >>subplot(413)>>stem(n3,x,fill),grid on >>title(x3(n)),axis([-15 15 0 1]) >>subplot(414)>>stem(n4,x,fill),grid on >>title(x4(n)),axis([-15 15 0 …

通过Katas进行Java教程:网球比赛(轻松)

编程kata是一种练习&#xff0c;可以帮助程序员通过练习和重复练习来磨练自己的技能。 本文是“通过Katas的Java教程”系列的一部分。 文章分为易&#xff0c;中和难。 Fizz Buzz&#xff08;轻松&#xff09; -Java 7 柏林时钟&#xff08;简易&#xff09; – Java 7和8 …

关于动画的几种状态表示的含义以及能够使用2d动画表述为什么要使用3d动画表述

transform 四种转换 translate 位置scale 缩放rotate 旋转skew 倾斜 以上四种转换方式是比较特殊的&#xff0c;其实他们都是由matrix 矩阵转换来&#xff1b; animation的五种状态 动画速度这些曲线称之为贝塞尔曲线CSS88 这是一个css有关的网站&#xff1b;ease 由快到慢 最…

画函数图形的C#程序(改进版) (转)

我在10月份发表过一篇随笔“画函数图形的C#程序&#xff0c;兼论一个病态函数”&#xff0c;在那篇随笔中写道&#xff1a; 这个画函数图形的C#程序有一个严重的缺点&#xff0c;就是函数表达式是直接写的源程序中的&#xff0c;不能象SciLab和Matlab那样交互式地输入。 后来&a…

Swift-UITextView占位文字及占位文字颜色扩展(可在xib中直接使用)

使用案例 extension UITextView {private struct RuntimeKey {static let hw_placeholderLabelKey UnsafeRawPointer.init(bitPattern: "hw_placeholderLabelKey".hashValue)/// ...其他Key声明}/// 占位文字IBInspectable public var placeholder: String {get {re…

Easy.Ajax 部分源代码, 支持文件上传功能, 兼容所有主流浏览器

下面是Easy.Ajax类的初稿&#xff0c;如须发表&#xff0c;在代码上还要修改以达到最简&#xff0c;但API是不会变了&#xff0c; Easy.Ajax (function (WINDOW) {ajax {proxyPool: {length: function () {var i 0;for (var p in this)i;return i - 1;}},index: 0,clearCach…

Java 8中Lambda表达式的阴暗面

这篇文章可能不会使我成为任何新朋友。 哦&#xff0c;好吧&#xff0c;无论如何我从来没有真正在学校受到欢迎。 但是&#xff0c;让我们说清楚。 就语言而言&#xff0c;Java 8的最大特色无疑是Lambda表达式。 几年来&#xff0c;它一直是功能语言&#xff08;例如Scala和Clo…

复旦大学长跑协会财务制度(初稿)

(一)活动资金来源及主要支出 1、资金主要来源&#xff1a;会费、学校的拨款&#xff0c;私人捐助、企业赞助等。 2、活动性支出&#xff1a;活动宣传、场地租用费、租借多媒体仪器费用及活动经费。事物性支出&#xff1a;协会运作所需物资(如文具等硬件)。 (二)财务报销原则 1、…

JQ实现弹幕效果

JQ实现弹幕效果&#xff0c;快来吐糟你的想法吧 效果图&#xff1a; 代码如下&#xff0c;复制即可使用&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>JQ实现弹幕效果</title><style type"t…

Iterator作用

前言 下面的内容是我从百度知道拷贝出来的&#xff0c;也就不在贴出链接了。我总结下就是迭代器在集合中使用&#xff0c;用户不需要关心具体集合实现的是如何遍历&#xff08;不暴露细节&#xff09;&#xff0c;按照迭代器的方式遍历。 作用 Iterator模式是用于遍历集合类的标…

Django:URL映射

导航 跳转&#xff1a;视图简介 跳转&#xff1a;URL映射 跳转&#xff1a;一、URL中添加参数 跳转&#xff1a;二、指定默认的参数 跳转&#xff1a;三、URL中包含另一个urls模块 跳转&#xff1a;  include函数 跳转&#xff1a;四、path函数 跳转&#xff1a;  自定义ur…

php-v 查看不到版本,解決php -v查看到版本於phpinfo()打印的版本不一致問題

整個事件的起因是這樣的通過git拉取laraevl項目發現缺少.env文件&#xff0c;打算使用composer install生成一個.env文件&#xff0c;然后提示composer最低使用php版本7.1.3而檢測到我的版本為5.4.16。提示如下&#xff1a;然后使用phpinfo打印一下發現版本是7.2.6。打印結果如…

将jOOQ与Spring结合使用:排序和分页

JOOQ是一个库&#xff0c;可以帮助我们控制SQL。 它可以从我们的数据库生成代码&#xff0c;并允许我们使用其流畅的API来构建类型安全的数据库查询。 本教程前面的部分向我们介绍了如何配置应用程序的应用程序上下文&#xff0c;如何从数据库生成代码以及如何将CRUD操作添加到…

获取表的所有列名

selectname fromsyscolumns whereidobject_id(表名)下面这样也可以:selectcolumn_name frominformation_schema.columns wheretable_name news转载于:https://www.cnblogs.com/zhuboxingzbx/archive/2007/09/03/880049.html

天下武功唯快不破------实验吧

题目地址&#xff1a;http://www.shiyanbar.com/ctf/1854 打开链接 全是英文&#xff0c;能力有限&#xff0c;翻译一下&#xff0c;好像没其他东西了&#xff0c;查看一下源码 让用post请求&#xff0c;丢到burp改一下 看到response有一个FLAG: UDBTVF9USElTX1QwX0NINE5HRV9GT…

JS实现文本中查找并替换字符

JS实现文本中查找并替换字符 效果图&#xff1a; 代码如下&#xff0c;复制即可使用&#xff1a; <!DOCTYPE html><html> <head><style type"text/css">*{font-family:"微软雅黑";font-size:16px;margin:0;padding:0;letter-spaci…

数据依赖的公理系统

ArmStrong公理系统 学习数据依赖的公理系统是进行模式分解的算法的理论基础。而Armstrong公理系统是一个具有有效性和完备性的公理系统。 U是属性总体&#xff0c;F是函数依赖&#xff0c;对于R<U,F>推理规则如下&#xff1a; A1 自反律 &#xff1a;若Y⊆X⊆U&#xff0…

在没有IDE的情况下编译和运行Java

最近一个名为“ 不使用IDE编译Java软件包 ”的Java subreddit线程提出了一个问题&#xff1a;“是否有一个命令将软件包内的一组Java文件编译到一个单独的文件夹中&#xff08;以下简称为bin&#xff09;&#xff0c;以及如何我会去运行新的类文件吗&#xff1f;” 该帖子的作者…

java statement 返回类型,6.3 返回类型和返回语句 | Return type Return statement

无返回值函数对于返回类型是void的函数&#xff0c;return后不跟表达式。最后的 return; 可以没有而让程序隐式执行。在void函数中的return语句还有提前使函数退出的作用而不进行接下来的计算&#xff0c;如定义一个swap函数在二者相同时不继续运算直接退出&#xff1a;void sw…