题意: 有n个地鼠,m个CD碟,每个CD碟有一个影响范围,范围内的地鼠都会被吵到,每次有一个操作就是移动CD碟,然后求每次被影响的地鼠有多少只。

解法: 线段树做。我们只关注地鼠有没有被吵到就可以了,之前我还去把所有可能移到的位置都存下来离散化一下,然后维护也维护错了。一堆bug,真是想多了。

线段树维护两个值:  cntS[rt]表示该段被多少个区间所覆盖, NOG[rt]表示此区间内没有被影响到的地鼠有多少个。

那么我们更新到区间,然后直接pushup即可, 因为更新到区间的时候已经可以确定NOG[rt]了:

如果 l == r : 说明是叶子节点, 那么如果cntS[rt] > 0,NOG[rt]就为0,否则为1

否则,如果cntS[rt] = 0 , 那么 NOG[rt] = NOG[2*rt]+NOG[2*rt+1],  否则说明这段被区间覆盖,NOG[rt] = 0.

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 501007 int NOG[*N],cntS[*N];
struct Shift{
int L1,R1,L2,R2;
}sf[];
int x[],b[];
int seg[][]; void pushup(int l,int r,int rt)
{
if(l == r)
{
if(cntS[rt]) NOG[rt] = ;
else NOG[rt] = ;
return;
}
if(!cntS[rt]) NOG[rt] = NOG[rt<<] + NOG[rt<<|];
else NOG[rt] = ;
} void build(int l,int r,int rt)
{
cntS[rt] = ;
if(l == r)
{
NOG[rt] = ;
return;
}
int mid = (l+r)/;
build(l,mid,*rt);
build(mid+,r,*rt+);
pushup(l,r,rt);
} void update(int l,int r,int aa,int bb,int val,int rt)
{
if(aa <= l && bb >= r)
{
cntS[rt] += val;
pushup(l,r,rt);
return;
}
int mid = (l+r)/;
if(aa <= mid)
update(l,mid,aa,bb,val,*rt);
if(bb > mid)
update(mid+,r,aa,bb,val,*rt+);
pushup(l,r,rt);
} int main()
{
int n,m,d,l,i,j,val,p,r;
while(scanf("%d%d%d%d",&n,&m,&d,&l)!=EOF)
{
x[] = ;
for(i=;i<=n;i++)
scanf("%d",&x[i]);
for(i=;i<=m;i++)
{
scanf("%d",&val);
seg[i][] = max(,val-l);
seg[i][] = min(,val+l);
}
for(i=;i<=d;i++)
{
scanf("%d%d",&p,&r);
sf[i].L1 = max(,p-l);
sf[i].R1 = min(,p+l);
sf[i].L2 = max(,r-l);
sf[i].R2 = min(,r+l);
}
build(,n,);
for(i=;i<=m;i++)
{
int L = lower_bound(x+,x+n+,seg[i][])-x;
int R = upper_bound(x+,x+n+,seg[i][])-x;
R--;
update(,n,L,R,,);
}
printf("%d\n",n-NOG[]);
for(i=;i<=d;i++)
{
int L1 = lower_bound(x+,x+n+,sf[i].L1)-x;
int R1 = upper_bound(x+,x+n+,sf[i].R1)-x-;
int L2 = lower_bound(x+,x+n+,sf[i].L2)-x;
int R2 = upper_bound(x+,x+n+,sf[i].R2)-x-;
update(,n,L1,R1,-,);
update(,n,L2,R2,,);
printf("%d\n",n-NOG[]);
}
}
return ;
}

2014-2015 Codeforces Trainings Season 2 Episode 7 G Gophers --线段树的更多相关文章

  1. 2016-2017 CT S03E06: Codeforces Trainings Season 3 Episode 6(8/13)

    2016-2017 CT S03E06: Codeforces Trainings Season 3 Episode 6 比赛连接: http://codeforces.com/gym/101124/ ...

  2. 2016-2017 CT S03E05: Codeforces Trainings Season 3 Episode 5 (2016 Stanford Local Programming Contest, Extended) E

    链接:http://codeforces.com/gym/101116 学弟写的,以后再补 #include <iostream> #include <algorithm> # ...

  3. 2016-2017 CT S03E05: Codeforces Trainings Season 3 Episode 5 (2016 Stanford Local Programming Contest, Extended) J

    链接:http://codeforces.com/gym/101116 题意:给出n个点,要求一个矩形框将(n/2)+1个点框住,要面积最小 解法:先根据x轴选出i->j之间的点,中间的点(包括 ...

  4. 2016-2017 CT S03E05: Codeforces Trainings Season 3 Episode 5 (2016 Stanford Local Programming Contest, Extended) I

    链接:http://codeforces.com/gym/101116 题意:选六个数,必须出现次数最多,且数字最小,如果出现7优先加入7 解法:排序,出现7优先加入7,最后再将6个数排序 #incl ...

  5. 2016-2017 CT S03E05: Codeforces Trainings Season 3 Episode 5 (2016 Stanford Local Programming Contest, Extended) B

    链接:http://codeforces.com/gym/101116 学弟做的,以后再补 #include <iostream> #include <stdio.h> #in ...

  6. 2016-2017 CT S03E07: Codeforces Trainings Season 3 Episode 7 - HackerEarth Problems Compilation

    B: 思路: 暴力,每两个判断一下; C: 思路: 容斥定理,先枚举脖子下面那个点和那个不可描述的点,算出所有的方案数,这里面有多的腿当成了脖子或者胳膊的,然后就再枚举这种情况把这些减去,又减多了; ...

  7. 2016-2017 CT S03E02: Codeforces Trainings Season 3 Episode 2

    A HHPaint B Square Root C Interesting Places D Road to Home E Ant and apples F Square G Pair H The F ...

  8. 2016-2017 CT S03E06: Codeforces Trainings Season 3 Episode 6 The Baguette Master

    比赛看不懂 之后不确定题意去瞄了题解,需要分类讨论?囧 之后按照队友已经ac的题意 就是求外面一圈周长,直接可以求得 #include<bits/stdc++.h> using names ...

  9. 2016-2017 CT S03E07: Codeforces Trainings Season 3 Episode 7

    B. Pen Pineapple Apple Pen Solved. 题意:将一个序列合并成一个数. 思路:分类讨论一下, 水. #include<bits/stdc++.h> using ...

随机推荐

  1. ButterKnife

    1.简介 ButterKnife是注解中相对简单易懂的很不错的开源框架 1.强大的View绑定和Click事件处理功能,简化代码,提升开发效率 2.方便的处理Adapter里的ViewHolder绑定 ...

  2. bootstrap glyphicon图标无法显示

    如果不注意bootstrap引入css和fonts的规范,则可能会导致bootstrap 在显示glyphicon图标时无法正常显示,显示为方框. 此时可搜索bootstrap.css中的.glyph ...

  3. mybatis/callablestatement调用存储过程mysql connector产生不必要的元数据查询

    INFO | jvm 1 | 2016/08/25 15:17:01 | 16-08-25 15:17:01 DEBUG pool-1-thread-371dao.ITaskDao.callProce ...

  4. virtualenv and virtualenvwrapper on Ubuntu 14.04

    In this post I’ll go over my attempt to setup virtual environments for Python development. Most Pyth ...

  5. JAVA书写规范

    java程序书写规范 命名规范    1.一般概念        1.尽量使用完整的英文描述符        2.采用适用于相关领域的术语        3.采用大小写混合使名字可读        4 ...

  6. 初识python(1)

    1.python简介 Python是一种面向对象.直译式计算机程序语言.也是一种功能强大而完善的通用型语言,已经具有十多年的发展历史,成熟且稳定. Python语法简捷而清晰,具有丰富和强大的类库.它 ...

  7. 聊聊Function的bind()

    bind顾名思义,绑定. bind()方法会创建一个新函数,当这个新函数被调用时,它的this值是传递给bind()的第一个参数,它的参数是bind()的其他参数和其原本的参数. 上面这个定义最后一句 ...

  8. AX2012 R3 Data upgrade checklist sync database step, failed to create a session;

    最近在做AX2012 R3 CU9 到CU11的upgrade时 (用的Admin帐号), 在Date upgrade 的 synchronize database 这步 跑了一半,报出错误 说“fa ...

  9. Oracle EBS在编码方式为AL32UTF8时的注意事项

    现如今的EBS系统中,为了推进国际化的进程,以及系统向全球化的扩展,在Oracle数据库的编码方式上渐渐从支持中国本土简体中文的ZHS16GBK转向了更趋于国际化的AL32UTF8编码方式.但随之而来 ...

  10. 安卓开发_浅谈Android动画(三)

    一.LayoutAnimation布局动画 用于为一个layout里面的控件,或者是一个ViewGroup里面的控件设置动画效果 在res-anim文件下新建一个动画xml文件 <?xml ve ...