gym104076H
hehezhou 的鬼才神仙题解根本看不懂好吧。
首先判掉 \(n=1\)。
然后考虑最后一步,发现只用考虑怎样的左右端点可能见面。
左右和右左构成双射,算出总量减去自己配自己再除 \(2\) 即可。
于是考虑怎样的端点可以被生成。
容易发现结论:
\([l_1,r_1)[l_2,r_2)\dots[l_m,r_m)\) 可以合成 \([\min l,\max r)\) 内所有点。(左闭右开方便后面操作)
把所有 \(l,r\) 拉出来排序,考虑每一段区间内的点能够达到的
对于一个点,其左右必须各选至少一个点,从而将其“框住”。
考虑一个显然的事实:
如果对一个点,其左边端点数达到 \(4\) 且右边端点达到 \(4\)(或者,更准确的,除了最左最右端点及其对应端点外还分别有端点),则其可以和 \([\min l,\max r)\) 中所有端点配对!
这部分贡献直接 \(O(1)\) 统计,
剩下的部分,区间数量是 \(O(1)\) 的,且其中一半的端点数目是 \(O(1)\) 的,考虑暴力枚举具体使用的一对区间端点,
然后可以对最左、最右可行端点暴力移动枚举,显然移动也是 \(O(1)\) 的,
最后再取这些可行区间的并即可。
怎么取并呢?
对每次得到的可行端点对,更新左端点对应的最大右端点,
然后对其用单调性扫描一遍,再差分即可。
可能有点不大清楚,但估计代码还是看得懂的。
下面是核心代码。
std::pair<uint,uint>P[200005];
int main()
{
#ifdef MYEE
freopen("QAQ.in","r",stdin);
// freopen("QAQ.out","w",stdout);
#endif
uint t;scanf("%u",&t);
while(t--){
uint n;scanf("%u",&n);
for(uint i=0;i<n;i++)
scanf("%u%u",&P[i<<1].first,&P[i<<1|1].first),
P[i<<1].first--,P[i<<1].second=P[i<<1|1].second=i;
if(n==1){puts("1");continue;}
std::sort(P,P+(n<<1));
ullt ans=0;
for(uint i=1;i<n*2;i++)if(P[i].first!=P[i-1].first){
ullt wil=0;
if(i>=4&&n*2-i>=4)
wil=P[n*2-1].first-P[0].first-1;
else{
static uint R[200005];
for(uint j=0;j<n*2;j++)R[j]=j;
for(uint x=0;x<i;x++)for(uint y=i;y<n*2;y++){
uint l=0,r=n*2-1;
while(l<n*2&&(P[l].second==P[x].second||P[l].second==P[y].second))
l++;
if(l==n*2)continue;
while(~r&&(P[r].second==P[x].second||P[r].second==P[y].second))
r--;
_max(R[l],r);
}
for(uint j=1;j<n*2;j++)_max(R[j],R[j-1]);
for(uint j=0;j+1<n*2;j++)if(R[j]>j)
wil+=i==j+1?P[i].first-P[j].first-1:P[j+1].first-P[j].first;
}
ans+=wil*(P[i].first-P[i-1].first);
}
ans/=2;
printf("%llu\n",ans);
}
return 0;
}
gym104076H的更多相关文章
随机推荐
- js正则匹配多行文本
原文:https://lwebapp.com/zh/post/regular-expression-to-match-multiple-lines-of-text 需求 最近有小伙伴提了个需求,想用正 ...
- pycharm过期解决方案
如果你的pycharm老是过期,你可以直接下载最新版本的pycharm,然后加入一个网站获取激活码即可 http://idea.medeming.com/jets/
- mysql8使用tmpfs内存磁盘当内存数据库的配置方法
序: 内存关系数据库没有找到开源好用的,很多都是商用.虽然mysql有memory引擎,但写是整体锁表,没法用. 一直想将mysql放入内存中,搜索n次资料,没找到合适的,可能之前思路不对. 最近在测 ...
- Hadoop搭建超级详解
html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, ...
- mac 暗黑破坏神2
https://590m.com/f/28636472-500475496-61a14b (访问密码:7410) 此版本可以更改人员属性参数,过程有点复杂,如需了解,请留言+v沟通吧... 编辑 ...
- Angular 依赖注入的错误 NullInjectorError, No provider for XXX
一.在module的providers区域里,为pipe维护具体的实现类 二.如果不想改动module.ts,可选择直接在组件中注入
- Telerik GridView ----Pdf
ExportToPDF exporter = new ExportToPDF(this.radGridView1); exporter.FileExtension = "pdf"; ...
- 原始的jdbc
jdbc的概念 什么是jdbc? jdbc是java数据库连接.为多种关系型数据库提供统一的访问. jdbc的操作步骤 导入jar包 加载驱动 获取数据库连接 获取执行者对象 执行SQL语句 处理结果 ...
- kotlin information
Kotlin常用的by lazy你真的了解吗 => https://juejin.cn/post/7057675598671380493 END
- 遇到bug怎么分析,这篇文章值得一看
博主总结的非常到位:https://mp.weixin.qq.com/s/UpaLWjix2tnfTqybx9dmoQ 为什么定位问题如此重要? 可以明确一个问题是不是真的"bug" ...