[BZOJ1818][CQOI2010]内部白点

news/2024/11/16 4:55:22/

题目链接:

BZOJ1818

首先,题目根本不会有\(-1\)的情况,且所有节点变色只发生在第一秒。

证明?如果一个节点\((x,y)\)在第二秒变色,那么一定有一个节点会在第一秒内于\((x,y)\)的四周生成。

假设在左边(其他方向也一样),则设坐标为\((x`,y)\)

那么因为\((x`,y)\)出现了,说明\((x`,y)\)是个内部节点,那么在此之前\((x`,y)\)的左边也一定有一个黑色节点,否则此节点不能变色。

那么\((x,y)\)就可以在第一秒变色。

则题目变成求线段(两个\(x\)\(y\)轴坐标相同点的连线)的交点数量。

那么将所有线段离散化,从左向右扫描竖线,对于横线用树状数组维护当前哪些地方有横向线段。

若碰到线段左端,此线段对\(y\)坐标做出\(1\)的贡献,反之\(-1\)

对于如\((1,1),(3,1),(5,1)\)三个点,应该拆成两条线段,防止覆盖。

看了看别人的代码,感觉自己的好麻烦。。还慢

时间复杂度 \(O(nlog_2n)\)

#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>int n,Horc,Verc;
int xs[100005],ys[100005];
int as[100005];
std::vector<int> cs[100005],St[100005],Ed[100005];struct Segment
{int l,r,p;
}Hor[100005],Ver[100005];//线段,Hor为横向struct Binary_Indexed_Tree
{int c[100005];inline void Modify(int x,int v){for(;x<=n;x+=x&-x)c[x]+=v;}inline int Query(int x){int Res=0;for(;x;x^=x&-x)Res+=c[x];return Res;}
}BIT;//树状数组void Simplify(int *a)//离散化
{memcpy(as,a,sizeof as);std::sort(as+1,as+n+1);int nl=std::unique(as+1,as+n+1)-as-1;for(int i=1;i<=n;++i)a[i]=std::lower_bound(as+1,as+nl+1,a[i])-as;
}void Getseg(int *a,int *b,int &Cnt,Segment *Tar)//求线段
{for(int i=1;i<=n;++i)cs[i].clear();for(int i=1;i<=n;++i)cs[b[i]].push_back(a[i]);for(int i=1;i<=n;++i)std::sort(cs[i].begin(),cs[i].end());for(int i=1;i<=n;++i)for(int j=1;j<(int)cs[i].size();++j)if(cs[i][j]-cs[i][j-1]>=2)Tar[++Cnt]=(Segment){cs[i][j-1]+1,cs[i][j]-1,i};
}int main()
{scanf("%d",&n);for(int i=1;i<=n;++i)scanf("%d%d",&xs[i],&ys[i]);Simplify(xs);Simplify(ys);Getseg(xs,ys,Horc,Hor);Getseg(ys,xs,Verc,Ver);for(int i=1;i<=Horc;++i){St[Hor[i].l].push_back(Hor[i].p);Ed[Hor[i].r].push_back(Hor[i].p);}int Sv=1;long long Ans=0;for(int i=1;i<=n;++i){for(int j=0;j<(int)St[i].size();++j)BIT.Modify(St[i][j],+1);//碰到左端端点for(;Sv<=Verc&&Ver[Sv].p==i;++Sv)Ans+=BIT.Query(Ver[Sv].r)-BIT.Query(Ver[Sv].l-1);for(int j=0;j<(int)Ed[i].size();++j)BIT.Modify(Ed[i][j],-1);//碰到右端端点}printf("%lld\n",Ans+n);//还要加上原来的黑点return 0;
}

转载于:https://www.cnblogs.com/LanrTabe/p/10176166.html


http://www.ppmy.cn/news/244209.html

相关文章

【bzoj1818】[Cqoi2010]内部白点

Description 无限大正方形网格里有n个黑色的顶点&#xff0c;所有其他顶点都是白色的&#xff08;网格的顶点即坐标为整数的点&#xff0c;又称整点&#xff09;。每秒钟&#xff0c;所有内部白点同时变黑&#xff0c;直到不存在内部白点为止。你的任务是统计最后网格中的黑点…

集合求交,51nod1818,根号分治

正题 Portal 这题发现总的元素数量不超过M&#xff0c;所以我们可以对一个集合内的元素数量来根号分治。 当询问的时&#xff0c;暴力维护每一个权值以位置为关键字的线段树&#xff08;动态开点&#xff09;&#xff0c;这部分的时间复杂度是。 当询问的时&#xff0c;我们对于…

HDU 1818 RP problem解题报告

一开始&#xff0c;我想的是建一个矩阵&#xff0c;然后尽量多的乘&#xff0c;做快速幂&#xff0c;做到后面会自然稳定&#xff0c;但是没去实现&#xff0c;考虑到一个问题&#xff0c;每个点的出度不一样&#xff0c;所以不是简单的求和&#xff0c;而且后面改边又要做矩阵…

BZOJ 1818: [Cqoi2010]内部白点

Description 如果一个点左右上下都有黑点&#xff0c;那么这个点也会变成黑点&#xff0c;问最后有多少个黑点\(n\leqslant 10^5\). Solution 扫描线. 显然变化后的点并不会产生新点&#xff0c;因为他的产生就需要他上下左右有点。 可以把他们转化成一些横纵的互不相交的直线.…

eoj1818 dijkstra求最短路及其条数

求出有n(1 < n < 100)个结点有向图中&#xff0c;结点1到结点n的最短路径&#xff0c;以及最短路径的条数。 Input 第一行有2个整数n和m( 0 < m < 3000)&#xff0c;接下来m行每行有三个整数u,v,w结点u到v之间有一条权为w的边(w<100000)。 Output 输出只有一…

自考总结:202304考期

考虑成绩昨天刚出&#xff0c;打算做下2023年4月考期的总结。 报考 202304考期报了三科&#xff1a;数据结构导论、管理经济学、信息系统开发与管理。这三科之中&#xff0c;除了信息系统开发与管理已经考过 2 次了&#xff0c;数据结构导论上次学了弃考了&#xff08;考前复…

bzoj 1818/1732 聚会

首先&#xff0c;答案的点一定在三组lca中的一个上 它在那个最深的lca上&#xff0c;不要问我为什么 或者&#xff0c;这三组lca一定有两个重复的&#xff0c;答案是那个不重复的。 #include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>…

Yolov5 (v6.1)添加注意力机制

Apply Transformer in the backbone 1、要把注意力结构代码放到common.py文件中 2、手把手带你Yolov5 (v6.1)添加注意力机制(一)&#xff08;并附上30多种顶会Attention原理图&#xff09; 3、手把手带你Yolov5 (v6.1)添加注意力机制(二)&#xff08;在C3模块中加入注意力机…