【NOIP2015模拟11.2晚】我的天
题目
很久很以前,有一个古老的村庄——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晚】我的天的更多相关文章
- JZOJ 4298. 【NOIP2015模拟11.2晚】我的天
4298. [NOIP2015模拟11.2晚]我的天 (File IO): input:ohmygod.in output:ohmygod.out Time Limits: 1000 ms Memor ...
- 【NOIP2015模拟11.2晚】JZOJ8月4日提高组T2 我的天
[NOIP2015模拟11.2晚]JZOJ8月4日提高组T2 我的天 题目 很久很以前,有一个古老的村庄--xiba村,村子里生活着n+1个村民,但由于历届村长恐怖而且黑暗的魔法统治下,村民们各自过着 ...
- JZOJ4307. 【NOIP2015模拟11.3晚】喝喝喝
Description
- [JZOJ 4307] [NOIP2015模拟11.3晚] 喝喝喝 解题报告
题目链接: http://172.16.0.132/senior/#main/show/4307 题目: 解题报告: 题目询问我们没出现坏对的连续区间个数 我们考虑从左到有枚举右端点$r$,判断$a[ ...
- 【NOIP2015模拟11.4】JZOJ8月6日提高组T1 刷题计划
[NOIP2015模拟11.4]JZOJ8月6日提高组T1 刷题计划 题目 题解 题意 有\(n\)道题,编号为1~\(n\) 给出\(m\)次操作 每次操作有3种类型 1 \(x\) 表示交了\(A ...
- 【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\)个元素的 ...
- 【NOIP2015模拟11.5】JZOJ8月5日提高组T1 俄罗斯套娃
[NOIP2015模拟11.5]JZOJ8月5日提高组T1 俄罗斯套娃 题目 题解 题意就是说 将1~\(n\)排列,问有多少种方案使得序列的逆序对个数小于\(k\) 很容易想到DP 设\(f[i][ ...
- 【NOIP2015模拟11.4】JZOJ2020年8月6日提高组T2 最优交换
[NOIP2015模拟11.4]JZOJ2020年8月6日提高组T2 最优交换 题目 题解 题意 有一个长度为\(n\)的正整数 最多可以进行\(k\)次操作 每次操作交换相邻两个位置上的数 问可以得 ...
- 【NOIP2015模拟11.5】JZOJ8月5日提高组T3 旅行
[NOIP2015模拟11.5]JZOJ8月5日提高组T3 旅行 题目 若不存在第\(k\)短路径时,输出"Stupid Mike" 题解 题意 给出一个有\(n\)个点的树 问这 ...
随机推荐
- 基于注解的springmvc开发
原理简析 1. 背景知识:org.springframework.web.ServletContainerInitializer接口 在基于注解的servlet开发中,ServletContainer ...
- 中国MOOC_面向对象程序设计——Java语言_期末考试编程题_1细胞自动机
期末考试编程题 返回 这是期末考试的编程题 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止时间之前提交答案,系统将取其中的最高分作为最终成 ...
- wpf slider刻度
TickFrequency:刻度之间的间隔 IsSnapToTickEnabled:是否对齐到刻度 TickPlacement:刻度位置
- 远程桌面 使用 本地输入法(虚拟化 终端 远程接入 RemoteApp)
远程桌面连接组件是微软从Windows 2000 Server开始提供的,该组件一经推出便受到了很多用户的拥护和使用. 在WINDOWS XP和WINDOWS SERVER 2003中微软公司将该 ...
- xmake新增对Qt编译环境支持
在最新的xmake v2.2.1版本中,新增了对Qt SDK环境的支持,我们完全可以脱离Qt Creater进行Qt应用程序的开发,甚至配合vscode/idea等编辑器+xmake插件(xmake- ...
- 不容错过的 MySQL史上最全
点击下方链接 http://c.biancheng.net/view/2361.html
- 图解 SQL 里的各种 JOIN
约定 下文将使用两个数据库表 Table_A 和 Table_B 来进行示例讲解,其结构与数据分别如下: mysql> SELECT * FROM Table_A ORDER BY PK ASC ...
- 实验3&总结5
老师:lijin2019,助教:晨晨果 提交作业 实验三 String类的应用 实验目的 掌握类String类的使用: 学会使用JDK帮助文档: 实验内容 1.已知字符串:"this is ...
- 安装开发环境vs2017+sql2016+tfs2017
安装开发环境vs2017+sql2016+tfs2017 编写人:左丘文 2019-7-16 近一年了,一直没空着手写点什么,跟大家交待下吧,去年一次机会,其实也不完全是去年,因此离开了我工作15年的 ...
- echarts markLine 辅助线非直线设置
效果图: 用例option: option = { title: { text: '未来一周气温变化', subtext: '纯属虚构' }, tooltip: { trigger: 'axis' } ...