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的更多相关文章
随机推荐
- C - Functions again CodeForces - 789C
			
C - Functions again CodeForces - 789C 这道题考查了对Map的运用 #include<iostream> #include<cstdio> ...
 - LP1-5:接口测试方法
 - Vue基础之v-if与v-show
			
Show Time! 说再多不如直接上效果: (一)v-if <div id="app"> <div v-if="flag" class=&q ...
 - k8s安装metrics-server
			
Kubernetes Metrics Server: Kubernetes Metrics Server 是 Cluster 的核心监控数据的聚合器,kubeadm 默认是不部署的. Metrics ...
 - java SE02
			
目录 五.面向对象 1. 封装 2. 多态 3. 继承 六.内部类 1. 局部内部类 2. 局部内部类 3. 静态内部类 4.匿名内部类 七.异常 1. 五个关键字 2. 自定义异常 五.面向对象 1 ...
 - Software_programming_tools_IDEA
			
13:45:55 key promtoer 快捷键提示插件
 - MapReduce原理——切片代码分析
			
(1)程序先找到数据存储的目录 (2)遍历目录对每个文件进行切片 (3)遍历一个文件: 获取文件大小 计算切片大小 默认情况下,切片大小等于blocksize 每次切片时都要判断剩下部分师否大于块的1 ...
 - Docker 安全加固
			
一.docker安全加固 1.利用LXCFS增强docker容器隔离性和资源可见性 (proc容器与宿主机之间是共享的 没有进行隔离) 此rpm包在真机桌面q目录中 需先传到虚拟机/root/下 在 ...
 - web开发(2): html标签/web语义化
			
chapter2 html 标签 在sublime中敲入!, 按tab 进行拓展,得到如下框架 <!DOCTYPE html> <html lang="en"&g ...
 - maven项目pom.xml报未找到指定路径文件
			
解决方法: 错误环境:Tomcat7 + Eclipse + Maven + Spring + SpringMvc + Mybatis 错误描述: 错误解决步骤: 1.找到eclipse的projec ...