[CF542A]Place Your Ad Here

题目大意:

有\(n(n\le2\times10^5)\)个广告和\(m(m\le2\times10^5)\)个电视台,第\(i\)个广告只能在\([l_i,r_i]\)内播放,第\(j\)个电视台会在时间段\([a_j,b_j]\)播出,并且有\(c_j\)个人收看。选择第\(x\)个广告和第\(y\)个电视台的收益为\((v-u)c_y\),其中\([u,v]=[l_x,r_x]\cap[a_y,b_y]\)。

从中选取一个广告和一个电视台,使收益最大。求最大收益,并输出任意一种方案。

思路:

将广告拆成两个端点排序,将电视台按照右端点排序。

枚举每个电视台\([l,r]\),若一个广告只有左端点在\(r\)前,那么我们只关心最左的左端点;若一个广告左右端点均在\([l,r]\)内,那么我们只关心其长度;若一个广告左端点在\(l\)前,右端点在\([l,r]\)内,那么我们只关心其右端点的位置。

对于第一种情况,用set维护即可;后两种情况只需用线段树维护区间最大值。

时间复杂度\(\mathcal O(n\log n)\)。

源代码:

  1. #include<set>
  2. #include<cstdio>
  3. #include<cctype>
  4. #include<algorithm>
  5. inline int getint() {
  6. register char ch;
  7. while(!isdigit(ch=getchar()));
  8. register int x=ch^'0';
  9. while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
  10. return x;
  11. }
  12. typedef long long int64;
  13. struct Node {
  14. int p,id;
  15. bool operator < (const Node &rhs) const {
  16. return p<rhs.p;
  17. }
  18. };
  19. struct Seg {
  20. int l,r,w,id;
  21. bool operator < (const Seg &rhs) const {
  22. return r<rhs.r;
  23. }
  24. };
  25. const int N=2e5+1,K=8e5+1;
  26. Node a[N],b[N];
  27. Seg c[N];
  28. int rnk[N],tmp[K];
  29. class SegmentTree {
  30. #define _left <<1
  31. #define _right <<1|1
  32. #define mid ((b+e)>>1)
  33. private:
  34. std::pair<int,int> val[K<<2];
  35. void push_up(const int &p) {
  36. val[p]=std::max(val[p _left],val[p _right]);
  37. }
  38. public:
  39. void modify(const int &p,const int &b,const int &e,const int &x,const std::pair<int,int> &v) {
  40. if(b==e) {
  41. val[p]=std::max(val[p],v);
  42. return;
  43. }
  44. if(x<=mid) modify(p _left,b,mid,x,v);
  45. if(x>mid) modify(p _right,mid+1,e,x,v);
  46. push_up(p);
  47. }
  48. std::pair<int,int> query(const int &p,const int &b,const int &e,const int &l,const int &r) const {
  49. if(b==l&&e==r) return val[p];
  50. std::pair<int,int> ret(0,0);
  51. if(l<=mid) ret=std::max(ret,query(p _left,b,mid,l,std::min(mid,r)));
  52. if(r>mid) ret=std::max(ret,query(p _right,mid+1,e,std::max(mid+1,l),r));
  53. return ret;
  54. }
  55. #undef _left
  56. #undef _right
  57. #undef mid
  58. };
  59. SegmentTree t1,t2;
  60. std::set<std::pair<int,int> > set;
  61. int main() {
  62. const int n=getint(),m=getint();
  63. int tot=0;
  64. for(register int i=1;i<=n;i++) {
  65. const int l=getint(),r=getint();
  66. a[i]=(Node){l,i};
  67. b[i]=(Node){r,i};
  68. tmp[++tot]=l;
  69. tmp[++tot]=r;
  70. }
  71. for(register int i=1;i<=m;i++) {
  72. tmp[++tot]=c[i].l=getint();
  73. tmp[++tot]=c[i].r=getint();
  74. c[i].w=getint();
  75. c[i].id=i;
  76. }
  77. std::sort(&tmp[1],&tmp[tot]+1);
  78. for(register int i=1;i<=n;i++) {
  79. a[i].p=std::lower_bound(&tmp[1],&tmp[tot]+1,a[i].p)-tmp;
  80. b[i].p=std::lower_bound(&tmp[1],&tmp[tot]+1,b[i].p)-tmp;
  81. }
  82. for(register int i=1;i<=m;i++) {
  83. c[i].l=std::lower_bound(&tmp[1],&tmp[tot]+1,c[i].l)-tmp;
  84. c[i].r=std::lower_bound(&tmp[1],&tmp[tot]+1,c[i].r)-tmp;
  85. }
  86. std::sort(&a[1],&a[n]+1);
  87. std::sort(&b[1],&b[n]+1);
  88. std::sort(&c[1],&c[m]+1);
  89. for(register int i=1;i<=n;i++) {
  90. rnk[a[i].id]=i;
  91. }
  92. int64 ans=0;
  93. int x,y;
  94. for(register int i=1,j=1,k=1;i<=m;i++) {
  95. for(;j<=n&&a[j].p<=c[i].r;j++) {
  96. set.insert(std::make_pair(tmp[a[j].p],a[j].id));
  97. }
  98. for(;k<=n&&b[k].p<=c[i].r;k++) {
  99. const int j=rnk[b[k].id];
  100. set.erase({tmp[a[j].p],a[j].id});
  101. t1.modify(1,1,tot,a[j].p,{tmp[b[k].p]-tmp[a[j].p],a[j].id});
  102. t2.modify(1,1,tot,a[j].p,{tmp[b[k].p],a[j].id});
  103. }
  104. //-: ad
  105. //=: tv
  106. int len=0,z=0;
  107. if(!set.empty()) {
  108. // ------
  109. //======
  110. const int t=tmp[c[i].r]-std::max(tmp[c[i].l],set.begin()->first);
  111. if(t>len) {
  112. len=t;
  113. z=set.begin()->second;
  114. }
  115. }
  116. {
  117. // --
  118. //======
  119. const auto p=t1.query(1,1,tot,c[i].l,c[i].r);
  120. if(p.first>len) {
  121. len=p.first;
  122. z=p.second;
  123. }
  124. }
  125. {
  126. //------
  127. // ======
  128. const auto p=t2.query(1,1,tot,1,c[i].l);
  129. if(p.first-tmp[c[i].l]>len) {
  130. len=p.first-tmp[c[i].l];
  131. z=p.second;
  132. }
  133. }
  134. if(1ll*len*c[i].w>ans) {
  135. ans=1ll*len*c[i].w;
  136. x=z,y=c[i].id;
  137. }
  138. }
  139. printf("%lld\n",ans);
  140. if(ans) printf("%d %d\n",x,y);
  141. return 0;
  142. }

[CF542A]Place Your Ad Here的更多相关文章

  1. Sharepoint2013 AD组用户不同步

    背景: SP2013列表库使用AD安全组授权访问,向AD安全组添加一个用户A,在Sharepoint AD同步(增量和完全)后,用户A仍然无法访问列表库:原因: 参考:安全令牌上的缓存  SP2013 ...

  2. freeradius整合AD域作anyconncet认证服务器

    一.服务器要求 Radius服务器:centos6.6.hostname.selinux  disabled.stop iptables AD域服务器:Windows Server 2008 R2 E ...

  3. 讲座:Modeling User Engagement for Ad and Search

    讲座:http://bdai.ruc.edu.cn/?p=118 Modeling User Engagement for Ad and Search ppt 链接: Dr. Ke(Adam) Zho ...

  4. Azure AD Connect 手动同步

    我们目前采用工具Azure AD Connect 目录同步工具将本地域控制器的用户信息同步至office365和Azure 在之前目录同步工具中使用Windows 任务计划程序或单独的 Windows ...

  5. SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问

    delphi ado 跨数据库访问 语句如下 ' and db = '帐套1' 报错内容是:SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATE ...

  6. 如何查看/统计当前AD域控制器的活动用户?

    最近公司想知道某台AD域控制器上当前连接了多少活动用户? 此前个人只知道以下不是非常完善且统计起来比较麻烦的方法: 方法1:查看共享会话数.(不完全准确) 方法2:查看当前的DNS记录.(这种方法统计 ...

  7. AD域-让共享目录只显示用户有权限访问的文件夹

    问题: 在AD域中,我们一般都会用到共享,如果有很多部门,我们可能还会按部门.职位配置权限.比如CSD,IT,PA等,但文件夹一多,用户看着就头大,而且用户没权限访问的文件夹误点击进去还会提示无权限访 ...

  8. AD域的安装(在Windows Server 2003中安装Active Directory)

    在Active Directory中提供了一组服务器作为身份验证服务器或登录服务器,这类服务器被称作域控制器(Domain Controller,简称DC).建立一个AD域的过程实际就是在一台运行Wi ...

  9. 使用Ruby来实现批量更新AD中字段

    准备工作 安装需要用到的gem gem install net-ldap gem install roo 准备好要更新的数据,比如exel表: /root/account.xlsx,内容如下 姓名 性 ...

随机推荐

  1. 解决Navicat远程连接MySQL出现 10060 unknow error

    前言:今天想远程连接一下自己服务器上的MySQL,用的用的软件是Navicat,服务器上的MySQL版本为5.7 第一次连接的时候就出意外了 大概意思是 无法连接MySQL服务,解决步骤如下 第一:首 ...

  2. js值类型转换(boolean/String/number),js运算符,if条件,循环结构,函数,三种弹出框

    js值类型转换 number | string | boolean boolean类型转换 num = 0; var b1 = Boolean(num); console.log(b1) 转化为数字类 ...

  3. MySQL关于日志配置安全整改及处理方法

    [环境介绍] 系统环境:Linux + mysql 5.7.18 + 主从复制架构 [背景描述] 需求:MySQL数据库都有每年的集团安全整改,常常要求弱口令扫描,基线扫描,漏洞扫描等等.对于MySQ ...

  4. [再寄小读者之数学篇](2014-06-26 Besov space estimates)

    (1) $$\bex \sen{D^k f}_{\dot B^s_{p,q}}\sim \sen{f}_{\dot B^{s+k}_{p,q}}. \eex$$ (2) $$\beex \bea &a ...

  5. Javaweb学习笔记——(二十七)——————泛型、泛型的通配符、反射泛型信息、反射注解、注解

    泛型     1.泛型类:具有一个或多个类型变量的类,称之为泛型类 class A<T>{ } 2.在创建泛型实例时,需要为其类型变量赋值 A<String> a = new ...

  6. JAVA进阶9

    间歇性混吃等死,持续性踌躇满志系列-------------第9天 1.使用throw语句抛出异常 在通常情况下,程序发生错误时系统会自动抛出异常,而有时希望程序自动抛出异常,可以使用throw语句来 ...

  7. Centos7 安装 jdk 1.8

    Centos7 安装 jdk 1.8 1.下载安装包 链接: https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloa ...

  8. vlan 知识学习

    背景     有人反映打印机总是提示ip冲突,经检查,打印机虽然设置了固定ip,但是所有员工在路由器都是设置了DHCP,所以会存在员工占用打印机IP 情况,在路由器添加某一段的ip不自动分配解决此问题 ...

  9. linux 乌班图 lnmp环境搭建

    1.#安装Apache2,目前163的源是2.2.22版本02.sudo apt-get install apache203. 04.#安装MySQL,目前163的源是5.5.24版本05.apt-g ...

  10. [转载]解决在win10中webstrom无法使用命令行(Terminal)

    转载地址:https://qiaolevip.iteye.com/blog/2217688 原因:计算机从win7更新到win10,webstorm9命令框无法输入,以为是webstorm问题和win ...