题目

很久很以前,有一个古老的村庄——xiba村,村子里生活着n+1个村民,但由于历届村长恐怖而且黑暗的魔法统治下,村民们各自过着独立的生活,完全没有意识到其他n个人的存在。

但有一天,村民xiba臻无意中也得到了魔法,并发现了这个恐怖的事实。为了反抗村长,他走遍了全世界,找到了其他n个村民,并组织他们发动革命。但让这n个素不相识的村民(xiba臻已跟他们认识)同心协力去抵抗村长是很困难的,所以xiba臻决定先让他们互相认识。

这里,xiba臻用了xiba村特有的xiba思维:先让这n个人排成一列,并依次从1-n标号。然后每次xiba臻会选出一个区间[l, r],在这个区间中的人会去认识其他在这个区间中的人,但已经认识过得不会再去认识。这样,进行m次操作后,xiba臻认为这n个人能认识到许多人。

但是,为了精确地知道当前有多少对人已经认识了,xiba臻想要知道每次操作后会新产生出多少对认识的人,但这已是xiba思维无法解决的事了,你能帮帮他吗?

分析

很容易想到50%方法:

f[i]表示第i个人认识i+1~f[i],显然f[i]=max(f[i],r),答案边做边统计。

然后发现f是单调不下降的,所以就可以用带标记线段树维护区间最大值(当r<=最大值时,不可以统计答案)、最小值(当r<=最小值时,就不用往下做了)、以及区间和(统计答案用的),O(N)。


#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const long long maxlongint=2147483647;
using namespace std;
long long n,m,ans;
struct ljj
{
long long l,r,v,mn,mx,lf;
};
ljj tree[3000000];
long long set(long long v,long long l,long long r)
{
tree[v].l=l;
tree[v].r=r;
if(l==r)
{
tree[v].v=tree[v].mx=tree[v].mn=l;
return 0;
}
long long mid=(l+r)/2;
set(v*2,l,mid);
set(v*2+1,mid+1,r);
tree[v].v=tree[v*2].v+tree[v*2+1].v;
tree[v].mx=max(tree[v*2].mx,tree[v*2+1].mx);
tree[v].mn=min(tree[v*2].mn,tree[v*2+1].mn);
}
long long find(long long v,long long l,long long r,long long x,long long y,long long ri)
{
long long mid=(l+r)/2;
if(ri<=tree[v].mn) return 0;
if(l==r)
{
if(ri<=tree[v].mx) return 0;
tree[v].mx=ri;
tree[v].mn=ri;
long long g=ri-tree[v].v;
tree[v].v=ri;
return g;
}
if(ri<tree[v].mx)
{
long long g=tree[v].lf;
if(g)
{
tree[v*2].lf=tree[v*2+1].lf=g;
tree[v].lf=0;
tree[v*2].v=(mid-l+1)*g;
tree[v*2+1].v=(r-(mid+1)+1)*g;
tree[v*2].mx=tree[v*2].mn=tree[v*2+1].mx=tree[v*2+1].mn=g;
}
if(y<=mid)
{
g=find(v*2,l,mid,x,y,ri);
}
else
if(x>mid)
{
g=find(v*2+1,mid+1,r,x,y,ri);
}
else
{
g=find(v*2,l,mid,x,mid,ri)+find(v*2+1,mid+1,r,mid+1,y,ri);
}
tree[v].v=tree[v*2].v+tree[v*2+1].v;
tree[v].mx=max(tree[v*2].mx,tree[v*2+1].mx);
tree[v].mn=min(tree[v*2].mn,tree[v*2+1].mn);
return g;
}
else
{
if(l==x && y==r)
{
tree[v].lf=ri;
tree[v].mx=ri;
tree[v].mn=ri;
long long g=tree[v].v;
tree[v].v=ri*(r-l+1);
return tree[v].v-g;
}
else
{
long long g=tree[v].lf;
if(g)
{
tree[v*2].lf=tree[v*2+1].lf=g;
tree[v].lf=0;
tree[v*2].v=(mid-l+1)*g;
tree[v*2+1].v=(r-(mid+1)+1)*g;
tree[v*2].mx=tree[v*2].mn=tree[v*2+1].mx=tree[v*2+1].mn=g;
}
if(y<=mid)
{
g=find(v*2,l,mid,x,y,ri);
}
else
if(x>mid)
{
g=find(v*2+1,mid+1,r,x,y,ri);
}
else
{
g=find(v*2,l,mid,x,mid,ri)+find(v*2+1,mid+1,r,mid+1,y,ri);
}
tree[v].v=tree[v*2].v+tree[v*2+1].v;
tree[v].mx=max(tree[v*2].mx,tree[v*2+1].mx);
tree[v].mn=min(tree[v*2].mn,tree[v*2+1].mn);
return g;
}
}
}
int main()
{
long long i,j,k,x,y;
scanf("%lld%lld\n",&n,&m);
set(1,1,n);
for(i=1;i<=m;i++)
{
scanf("%lld%lld\n",&x,&y);
ans=find(1,1,n,x,y,y);
printf("%lld\n",ans);
}
}

【NOIP2015模拟11.2晚】我的天的更多相关文章

  1. JZOJ 4298. 【NOIP2015模拟11.2晚】我的天

    4298. [NOIP2015模拟11.2晚]我的天 (File IO): input:ohmygod.in output:ohmygod.out Time Limits: 1000 ms Memor ...

  2. 【NOIP2015模拟11.2晚】JZOJ8月4日提高组T2 我的天

    [NOIP2015模拟11.2晚]JZOJ8月4日提高组T2 我的天 题目 很久很以前,有一个古老的村庄--xiba村,村子里生活着n+1个村民,但由于历届村长恐怖而且黑暗的魔法统治下,村民们各自过着 ...

  3. JZOJ4307. 【NOIP2015模拟11.3晚】喝喝喝

    Description

  4. [JZOJ 4307] [NOIP2015模拟11.3晚] 喝喝喝 解题报告

    题目链接: http://172.16.0.132/senior/#main/show/4307 题目: 解题报告: 题目询问我们没出现坏对的连续区间个数 我们考虑从左到有枚举右端点$r$,判断$a[ ...

  5. 【NOIP2015模拟11.4】JZOJ8月6日提高组T1 刷题计划

    [NOIP2015模拟11.4]JZOJ8月6日提高组T1 刷题计划 题目 题解 题意 有\(n\)道题,编号为1~\(n\) 给出\(m\)次操作 每次操作有3种类型 1 \(x\) 表示交了\(A ...

  6. 【NOIP2015模拟11.5】JZOJ8月5日提高组T2 Lucas的数列

    [NOIP2015模拟11.5]JZOJ8月5日提高组T2 Lucas的数列 题目 PS:\(n*n*T*T<=10^{18}\)而不是\(10^1*8\) 题解 题意: 给出\(n\)个元素的 ...

  7. 【NOIP2015模拟11.5】JZOJ8月5日提高组T1 俄罗斯套娃

    [NOIP2015模拟11.5]JZOJ8月5日提高组T1 俄罗斯套娃 题目 题解 题意就是说 将1~\(n\)排列,问有多少种方案使得序列的逆序对个数小于\(k\) 很容易想到DP 设\(f[i][ ...

  8. 【NOIP2015模拟11.4】JZOJ2020年8月6日提高组T2 最优交换

    [NOIP2015模拟11.4]JZOJ2020年8月6日提高组T2 最优交换 题目 题解 题意 有一个长度为\(n\)的正整数 最多可以进行\(k\)次操作 每次操作交换相邻两个位置上的数 问可以得 ...

  9. 【NOIP2015模拟11.5】JZOJ8月5日提高组T3 旅行

    [NOIP2015模拟11.5]JZOJ8月5日提高组T3 旅行 题目 若不存在第\(k\)短路径时,输出"Stupid Mike" 题解 题意 给出一个有\(n\)个点的树 问这 ...

随机推荐

  1. 003-unity3d 物理引擎-示例2 打箱子

    一.基础知识点 1.坐标.向量等 )) { //1.将鼠标坐标 转化为 世界坐标 由于鼠标z轴 可能不存在,故自定义为3 Vector3 targetPos = Camera.main.ScreenT ...

  2. script标签defer与async的区别

    总结: async 会在文件下载完毕后立即执行 会阻止html parser defer 会下载完以后等html parser结束后执行,保证顺序

  3. 如何保存不连着电脑跑monkey?如何跑多个APK的monkey?

    哈喽,大家有没有遇到用真机跑monkey的时候,跑到一半结果小手一抖不小心把线碰掉了,结果报告就没获取到啦~ 今天就来解决这个问题 1.如何保存不连着电脑跑monkey? 1).输入命令进入shell ...

  4. css简介和属性

    CSS指的是层叠样式表(Cascading Style Sheets) 样式定义如何显示HTML元素,通常存储在样式表中. css使用方式 内联式 <!DOCTYPE html> < ...

  5. (转)Eclipse - CDT使用GDB调试C++的问题-无源文件命名(No source file named)

    http://tech.ddvip.com/2014-09/1411618782213496.html Eclipse CDT调试C++, 使用的Unix的调试器GDB; 由于在Unix下, 文件的目 ...

  6. java虚拟机学习总结之GC回收算法与GC收集器

    GC回收算法 1.标记清除算法分为标记阶段和清除阶段标记阶段:通过特定的判断方式找出无用的对象实例并将其标记清除阶段:将已标记的对象所占用的内存回收缺点:运行多次以后容易产生空间碎片,当需要一整段连续 ...

  7. win10上的Django项目实现内网映射

    网上有很多关于django项目发布uwsgi模块在 windows上的下载以及安装过程, 可是他们也并没有真正的在windows上使用到这个模块(至少目前在网上还没看到过), 而大部分人就是在Djan ...

  8. TCP滑动窗体

    TCP的滑动窗体攻克了端到端的流量控制问题,同意接受方对传输进行限制.直到它拥有足够的缓冲空间来容纳很多其他的数据.滑动窗体的大小由接收方确定,接收方在发送确认信号给发送方的同一时候告诉发送方自己的缓 ...

  9. 配置ssh免密码登录设置后还是提示需要输入密码

    工作之余搭建了一个集群测试,配置了ssh免密码登录以后  ,所有的ssh-copy-id 密钥也都分发了 ,各项配置也没有问题,但是使用ssh进行免密登录时,没有报错,但是要输入被ssh主机的登录密码 ...

  10. XIB约束布局问题(通过优先级改变界面布局)

    需要注意的是,只能修改可选约束的优先级,也就是说: 不允许将优先级由小于1000的值改为1000 不允许将优先级由1000修改为小于1000的值 例如,如果将优先级由250修改为1000,则会抛出异常 ...