题目

很久很以前,有一个古老的村庄——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. 基于注解的springmvc开发

    原理简析 1. 背景知识:org.springframework.web.ServletContainerInitializer接口 在基于注解的servlet开发中,ServletContainer ...

  2. 中国MOOC_面向对象程序设计——Java语言_期末考试编程题_1细胞自动机

    期末考试编程题 返回   这是期末考试的编程题 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止时间之前提交答案,系统将取其中的最高分作为最终成 ...

  3. wpf slider刻度

    TickFrequency:刻度之间的间隔   IsSnapToTickEnabled:是否对齐到刻度   TickPlacement:刻度位置

  4. 远程桌面 使用 本地输入法(虚拟化 终端 远程接入 RemoteApp)

    远程桌面连接组件是微软从Windows 2000 Server开始提供的,该组件一经推出便受到了很多用户的拥护和使用.   在WINDOWS XP和WINDOWS SERVER 2003中微软公司将该 ...

  5. xmake新增对Qt编译环境支持

    在最新的xmake v2.2.1版本中,新增了对Qt SDK环境的支持,我们完全可以脱离Qt Creater进行Qt应用程序的开发,甚至配合vscode/idea等编辑器+xmake插件(xmake- ...

  6. 不容错过的 MySQL史上最全

    点击下方链接 http://c.biancheng.net/view/2361.html

  7. 图解 SQL 里的各种 JOIN

    约定 下文将使用两个数据库表 Table_A 和 Table_B 来进行示例讲解,其结构与数据分别如下: mysql> SELECT * FROM Table_A ORDER BY PK ASC ...

  8. 实验3&总结5

    老师:lijin2019,助教:晨晨果 提交作业 实验三 String类的应用 实验目的 掌握类String类的使用: 学会使用JDK帮助文档: 实验内容 1.已知字符串:"this is ...

  9. 安装开发环境vs2017+sql2016+tfs2017

    安装开发环境vs2017+sql2016+tfs2017 编写人:左丘文 2019-7-16 近一年了,一直没空着手写点什么,跟大家交待下吧,去年一次机会,其实也不完全是去年,因此离开了我工作15年的 ...

  10. echarts markLine 辅助线非直线设置

    效果图: 用例option: option = { title: { text: '未来一周气温变化', subtext: '纯属虚构' }, tooltip: { trigger: 'axis' } ...