题意: 有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. Android 手机卫士17--缓存清理

    清理单个应用缓存 通过反射调用方法 需要权限:android.permission.DELETE_CACHE_FILES. 以上权限为系统权限,手机卫士应用为用户应用,不能拿到此权限 换思路: 调用系 ...

  2. SharpGL学习笔记(十三) 光源例子:环绕二次曲面球体的光源

    这是根据徐明亮<OpenGL游戏编程>书上光灯一节的一个例子改编的. 从这个例子可以学习到二次曲面的参数设置,程序中提供了两个画球的函数,一个是用三角形画出来的,一个是二次曲面构成的. 你 ...

  3. js和html5实现画板

    html5新添了一个重要又强大的标签元素<canvas>,该标签真有彻底替换掉flash的尽头,现在很多网页游戏就是用<canvas>完成的,下面代码就是用该标签制作的一个画板 ...

  4. swift学习笔记之-函数

    //函数 import UIKit /*获得系统时间 var date = NSDate() var timeFormatter = NSDateFormatter() timeFormatter.d ...

  5. 微信公共平台开发1 .net

    如果想通过微信去开发(当然,指的是开发模式下),首先 建议先申请一个服务号,因为服务号的功能与接口也多,有些功能订阅号是实现不了的.另外申请过以后必须得通过微信 认证才能开发,好像是得付300大洋,高 ...

  6. seajs快速了解

    详情请点击原文     SeaJS是一个遵循CommonJS规范的JavaScript模块加载框架,可以实现JavaScript的模块化开发及加载机制.与jQuery等JavaScript框架不同,S ...

  7. ABAP程序系统字段中英文详解

    SY-SUBRC: 系统执行某指令后,表示执行成功与否的变量,’0’ 表示成功SY-DBLNT: 被处理过的记录的笔数 SY-UNAME: 当前使用者登入SAP的USERNAME;SY-DATUM: ...

  8. 换SSD硬盘,重装系统,一阵子忙乱

    许久没重装过系统了,低声下气地问老板要了一块SSD硬盘,不马上安装上手痒得难受,但年底这个时候重装系统绝对忙乱,差点耽误了一份申请表和一份培训记录表.   SSD安装:先从网上找相关贴子,最主要的一个 ...

  9. IOS 二维码生成

    这篇博客将会介绍二维码的生成. 由于没有什么东西值得长篇大论的,所以这里我就通过代码的实现介绍二维码. 第一部分 第一部分是二维码的简单生成没有其他重点介绍. 效果图 代码部分 // // ViewC ...

  10. 【iOS开发】UIWebView与JavaScript(JS) 回调交互

    ------------------------------------------------- 很多关于objc 与 js 交互的文章都比较适用于 mac开发,iOS的webview 还是有所不一 ...