C/C++ code#include

using namespace std;

#define LEN 20000

#define NO_POSTER -2 //无海报

#define MIX_POSTER -1 //混合(间断)海报

#define NO_FLAG 0

//线段树的静态表示,左边界,右边界,标志域,结点对应海报编号,海报能否看见的标记数组,结点数量,最终能看见的海报数量

int left_bound[LEN],right_bound[LEN],flag[LEN],poster[LEN],ref[LEN],node_num,count_poster;

//clear(int index),更新poster[index],flag[index],flag[left_child[index]],flag[right_child[index]]

void clear(int index)

{

poster[index]=flag[index];

flag[2*index]=flag[index];

flag[2*index+1]=flag[index];

flag[index]=NO_FLAG;

}

//创建线段树

void construct(int left,int right,int num=1)

{

++node_num;

left_bound[num]=left;

right_bound[num]=right;

poster[num]=NO_POSTER;

if(left+1

{

int mid=(left+right)/2;

construct(left,mid,2*num);

construct(mid,right,2*num+1);

}

}

//贴海报

void insert(int index,int left,int right,int num)

{

if(flag[index]!=NO_FLAG) //如果有标志域,说明被完全覆盖过,所以更新自己的海报信息与孩子的标志域******PS:标志域的作用就是当前结点与之下子结点信息一致时,免去一次性全部更新的浪费

//先用标志域存储起来,下次需要用时临时更新需要的结点获得信息..看下一条注释!

{

clear(index);

}

if(left==left_bound[index]&&right_bound[index]==right)//例如: 如果某结点完全覆盖,那么它的子结点与该结点继承同一海报,所以这时候用标志域比用poster[]记录要有效得多!看下一条注释!

{

flag[index]=num;

return;

}

else//如果没有完全覆盖,那么就不能标志当前结点的flag,因为子结点与该结点没有相同的特征,子结点只是零散的覆盖该结点,所以这时只要修改poster[index]为混合标记就可以了.

{

poster[index]=MIX_POSTER;

int mid=(left_bound[index]+right_bound[index])/2;

if(left

{

insert(2*index,left,right,num);

}

if(leftmid)

{

insert(2*index,left,mid,num);

insert(2*index+1,mid,right,num);

}

if(left>=mid&&right>mid)

{

insert(2*index+1,left,right,num);

}

}

}

//数海报数量,这里完全依赖于poster[]的记录来数海报数量,所以必须根据flag刷新被完全覆盖结点的海报编号. 判断条件依赖于: poster[] 中有编号,混合海报,没有覆盖海报,一共三个情况。

void count(int index)

{

if(flag[index]!=NO_FLAG)

{

clear(index);

}

if(poster[index]!=NO_POSTER)

{

if(poster[index]!=MIX_POSTER)

{

if(ref[poster[index]]==0)

{

ref[poster[index]]=1;

++count_poster;

}

}

else

{

count(2*index);

count(2*index+1);

}

}

}

int main()

{

node_num=0;

count_poster=0;

memset(ref,0,sizeof(ref));

int num;//海报数量

int left,right;//海报覆盖范围

cin>>left>>right>>num;//输入墙的范围

construct(left,right);//构造线段树

for(int cnt=1;cnt<=num;++cnt)

{

cin>>left>>right;

insert(1,left,right,cnt);

}

count(1);

cout<

}

c语言海报,C语言 竞选海报相关推荐

  1. c语言海报,竞选海报 c语言

    C/C++ code#include using namespace std; #define LEN 20000 #define NO_POSTER -2 //无海报 #define MIX_POS ...

  2. c语言表达式3178的值为,【C语言】C语言运算符

    c语言 &amp;取地址运算符的理解 对于c语言中的&运算符,百度百科是这样定义的:(&p)则是这样一种运算,返回当时声明p 时开辟的地址:但是根据我对代码的观察,我觉得&am ...

  3. 多语言php,多语言 · ThinkPHP5.0完全开发手册 · 看云

    ThinkPHP内置通过`\think\Lang`类提供多语言支持,如果你的应用涉及到国际化的支持,那么可以定义相关的语言包文件.任何字符串形式的输出,都可以定义语言常量. ## 开启和加载语言包 默 ...

  4. 为什么要使用Go语言?Go语言的优势在哪里?

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. Go语言之所有越来越受到开发者的欢迎,我认为与其超高的实用价值密不可分.要知道Go语言是为了解决现实问题而设计的,而不是 ...

  5. java 全局变量_Java语言与C语言、C++语言有何差异以及优劣势

    差异 熟悉C语言和C++语言的读者一定想搞清楚这个问题,实际上,Java确实是从C语言和C++语言继承了许多成分,甚至可以将Java看成是类C语言发展和衍生的产物.比如Java语言的变量声明.操作符的 ...

  6. python是高级动态语言_Python动态语言之魅力揭秘

    之前的文章跟大家讲解了鸭子类型,其实鸭子类型是编程语言中动态类型语言中的一种设计风格.今天跟大家一起谈谈动态语言的魅力. 根据维基百科,动态编程语言是这样子定义的:动态编程语言是高级编程语言的一个类别 ...

  7. 自学编程是从python语言还是c语言开始-非计算机专业大学生想自学编程应该学C语言还是学Python?...

    之前总结的文章,分享过来,希望对你有帮助.windliang:到底学哪一门编程语言​zhuanlan.zhihu.com 发展进程 学哪一门编程语言,我们不妨先梳理一下语言的发展过程. 机器语言 计算 ...

  8. 脚本编程语言python语言-python语言是脚本语言吗

    Python是一种编程语言还是脚本语言? Python是GuidoVanRossum开发的最著名的编程语言之一.Python在开发人员中很受欢迎,因为它具有清晰的语法和简单的代码,甚至对于初学者来说也 ...

  9. 【Groovy】Groovy 动态语言特性 ( Groovy 语言与 Java 语言执行效率对比 | 以动态特性编译的 Groovy 类 | 以静态特性编译的 Groovy 类 )

    文章目录 一.以动态特性编译的 Groovy 类 二.Groovy 语言与 Java 语言执行效率对比 三.以静态特性编译的 Groovy 类 一.以动态特性编译的 Groovy 类 Groovy 类 ...

最新文章

  1. django框架--路由系统
  2. python pyOpenGL安装
  3. MySQL DISTINCT:去重(过滤重复数据)
  4. OpenCV使用VideoCapture界面读取一系列图像的实例(附完整代码)
  5. Cloud for Customer UI toolbar里按钮的渲染逻辑
  6. Android 上滑背景变淡,在Android中,如何平滑地将背景从一种颜色淡化到另一种颜色? (如何使用线程)...
  7. oracle导入导出多个文件
  8. java 删除列 csv,Java- CSV / Delete column in csv file
  9. Eclipse中如何更改工作空间(之前一直不知道,几天终于知道了!)。
  10. storm1.x支持主节点nimbus高可用 多master集群部署
  11. Selenium之浏览器驱动下载和配置使用
  12. 如何解决计算机前置音频设备无声音输出的方法之一
  13. java 图片深度_图像的色彩值称为图像的颜色深度,黑白图像的颜色深度为( )位。...
  14. Java基础-多线程
  15. 从play_mp3例程出发理解ESP32-ADF的使用方法
  16. ros学习记录1 Hello World 使用c++
  17. Win32_CDROMDrive 光驱 的参数说明
  18. 人到中年怎样防止头发花白
  19. 哦耶OYE-0001 OpenWrt路由器折腾记(by quqi99)
  20. 一个简单的点对点文件传输程序

热门文章

  1. 游戏开发中为什么要控制模型的面数
  2. IT男的15次相親經歷
  3. C#连接达梦数据库基础功公共类
  4. 从经济学角度解释:为什么画家总是死后成名?
  5. 读书笔记——吴翰清《白帽子讲Web安全》
  6. 聚合支付码是什么意思及它产生的背景
  7. 气虚 血虚 阴虚 阳虚4种体虚如何养生保健
  8. 【蓝桥杯省赛真题32】Scratch帆船运动 少儿编程scratch蓝桥杯省赛真题讲解
  9. 闲谈IPv6-IPv6地址聚类分配原则于源地址选择的关系
  10. 极简WEB文件管理工具(群晖)——TinyManager