原题传送门:P1204 [USACO1.2]挤牛奶Milking Cows

实际是道很弱智的题目qaq

但窝还是觉得用珂朵莉树写会++rp(窝都初二了,还要考pj)

前置芝士:珂朵莉树

窝博客里对珂朵莉树的介绍

没什么好说的自己看看吧

每个农夫就assign_val一下,但要注意一下细节qaq

窝不会告诉你因这个错调了我十几分钟qaq

应该写assign_val(l,r-1,1),查询时应写query(lmin,rmax,1/0)

其他没什么好说的了,细节详见程序

#pragma GCC optimize("O3")
#include<bits/stdc++.h>
#define IT set<node>::iterator
using namespace std;
struct IO_Tp
{
static const int _I_Buffer_Size = 1 << 24;
char _I_Buffer[_I_Buffer_Size];
char* _I_pos;
static const int _O_Buffer_Size = 1 << 24;
char _O_Buffer[_O_Buffer_Size];
char* _O_pos;
IO_Tp() : _I_pos(_I_Buffer), _O_pos(_O_Buffer)
{
fread(_I_Buffer, 1, _I_Buffer_Size, stdin);
}
~IO_Tp()
{
fwrite(_O_Buffer, 1, _O_pos - _O_Buffer, stdout);
}
inline bool is_digit(const char ch)
{
return '0' <= ch && ch <= '9';
}
inline IO_Tp& operator>>(int& res)
{
res = 0;
while (!is_digit(*_I_pos))
++_I_pos;
do
(res *= 10) += (*_I_pos++) & 15;
while (is_digit(*_I_pos));
return *this;
}
inline IO_Tp& operator<<(int n)
{
static char _buf[10];
char* _pos(_buf);
do
*_pos++ = '0' + n % 10;
while (n /= 10);
while (_pos != _buf)
*_O_pos++ = *--_pos;
return *this;
}
inline IO_Tp& operator<<(char ch)
{
*_O_pos++ = ch;
return *this;
}
} IO;
inline int Max(register int a,register int b)
{
return a>b?a:b;
}
inline int Min(register int a,register int b)
{
return a<b?a:b;
}
struct node
{
int l,r;
mutable bool v;
node(int L, int R=-1, bool V=0):l(L), r(R), v(V) {}
bool operator<(const node& o) const
{
return l < o.l;
}
};
set<node> s;
IT split(int pos)
{
IT it = s.lower_bound(node(pos));
if (it != s.end() && it->l == pos)
return it;
--it;
int L = it->l, R = it->r;
bool V = it->v;
s.erase(it);
s.insert(node(L, pos-1, V));
return s.insert(node(pos, R, V)).first;
}
void assign_val(int l,int r,bool v)
{
IT itr = split(r+1),itl = split(l);
s.erase(itl, itr);
s.insert(node(l, r, v));
}
inline int query(register int l,register int r,register bool v)
{
int sum=0,res=0;
IT itr = split(r+1),itl = split(l);
for(;itl!=itr;++itl)
if(itl->v==v)
sum+=itl->r-itl->l+1;
else
{
res=Max(res,sum);
sum=0;
}
return res;
}
int main()
{
int n;
IO>>n;
int a=1000005,b=0;
s.insert(node(0,1000005));
while(n--)
{
int l,r;
IO>>l>>r;
assign_val(l,r-1,1);
a=Min(a,l);
b=Max(b,r);
}
IO<<query(a,b,1)<<' '<<query(a,b,0);
return 0;
}

最新文章

  1. JVM虚拟机结构
  2. Java虚拟机及运行时数据区
  3. 使用 json_in_java
  4. Unity3D脚印6——模型动画
  5. C#做音乐播放器时在自动下一曲中报异常的解决办法
  6. 有趣的库:pipe(类似linux | 管道)库
  7. HDU2015校赛 The Magic Tower
  8. Java web App 部署静态文件
  9. codeforces 613A. Peter and Snow Blower
  10. wpf将表中数据显示到datagrid示例(转)
  11. DB2 “The transaction log for the database is full” 存在的问题及解决方案
  12. 染色[SDOI2011]
  13. JAVA 的关键字 、
  14. 使用DBMS_LOCK控制程序并发
  15. kaldi chain模型的序列鉴别性训练代码分析
  16. [MicroPython]TurnipBit开发板旋转按钮控制直流电机转速
  17. Python:GUI之tkinter学习笔记2界面布局显示
  18. logback logback.xml常用配置详解(二)&lt;appender&gt;
  19. iuplua test failure
  20. python(29)----时间模块

热门文章

  1. react 嵌套组件的通信
  2. InterProScan 5.25-64.0 安装和使用
  3. Nodejs中原生遍历文件夹
  4. MongoDB下,启动服务
  5. Unity之Vector3.SignedAngle实现
  6. 5.无监督学习-DBSCAN聚类算法及应用
  7. Vue系列之 =&gt; 使用钩子函数的第二个参数传参
  8. 扇入Fan-in和扇出Fan-out
  9. mysql 对表字段进行长度截取操作
  10. numpy高级应用