首页 > 其他分享 >loj#2880. JOISC 2014 稻草人

loj#2880. JOISC 2014 稻草人

时间:2024-06-30 21:33:41浏览次数:25  
标签:node 2880 return loj mid top2 JOISC int cdq

搞了很久,题解区有线段树爆改pushup高妙做法

说下cdq分治

先将点都按横坐标从小到大排序,cdq分治,那我们现在只需要考虑分治过程中\([l,mid]\)和\([mid+1,r]\)互相形成的合法点对,显然左边的横坐标都小于右边的横坐标。能够发现,如果右边有一个点插在一对本来合法的点之间,那么那对合法的就非法了,于是按y从大到小排序,每次把大于新来的点的横坐标的点就删掉,贡献不了答案。

然后左边的怎么办,显然同理,有一点插在一对本来合法的点之间,那么就贡献-1。假设当前扫描到点\(i\),找到前面的点在自己右边的点\(j\),计算出点\(j\)能和右半边构成贡献的结果,这个东西能二分算出,然后减掉就行了,单调栈维护上面两个东西

写到这里感觉代码最好懂:

#include<bits/stdc++.h>
#define vd void 
#define MAXN 200005
int gi(){
	char c;int x=0,f=0;
	while(!isdigit(c=getchar()))f|=(c=='-');
	while(isdigit(c))x=(x*10)+(c^48),c=getchar();
	return f?-x:x;
}
struct node{
	int x,y;
}q[MAXN];
int n,st1[MAXN],st2[MAXN],top1,top2;
long long ans=0;
int calc(int yy){
	int l=0,r=top2+1;
	while(l+1<r){
		int mid=(l+r)>>1;
		if(q[st2[mid]].y>yy)l=mid;
		else r=mid;
	}
	return l;
}
vd cdq(int l,int r){
	if(l==r)return;
	int mid=(l+r)>>1;
	cdq(l,mid),cdq(mid+1,r);
	std::sort(q+l,q+mid+1,[&](node a,node b){return a.y>b.y;});
	std::sort(q+mid+1,q+r+1,[&](node a,node b){return a.y>b.y;});
	int j=mid+1;top1=top2=0;
	for(int i=l;i<=mid;i++){
		while(j<=r&&q[i].y<q[j].y){
			while(top2&&q[st2[top2]].x>q[j].x)--top2;
			st2[++top2]=j++;
		}
		ans+=top2;
		while(top1&&q[st1[top1]].x<q[i].x)--top1;
		if(top1)ans-=calc(q[st1[top1]].y);
		st1[++top1]=i;
	}
}
int main(){
	n=gi();
	for(int i=1;i<=n;i++)q[i].x=gi(),q[i].y=gi();
	std::sort(q+1,q+n+1,[&](node a,node b){return a.x<b.x;});
	cdq(1,n);
	printf("%lld\n",ans);
	return 0;
}

标签:node,2880,return,loj,mid,top2,JOISC,int,cdq
From: https://www.cnblogs.com/xiaboxin/p/18276980

相关文章

  • 怎样利用 Clojure 的宏来创建自定义的控制结构,并且如何避免常见的错误?
    在Clojure中,宏是一种宏展开的机制,它可以用于创建自定义的控制结构。通过使用宏,你可以在编写代码时引入新的语法,从而使代码更具可读性和表达力。要创建一个宏,你需要使用defmacro宏,并将宏名称与一个参数列表和一个展开形式绑定。这个展开形式将在宏被调用时用于生成代码。......
  • 对于大型 Clojure 项目,如何进行有效的代码组织和模块划分以提高可维护性?
    在大型Clojure项目中,以下是一些有效的代码组织和模块划分的方法,可提高可维护性:使用命名空间(namespace):将相关函数和数据结构组织到逻辑上相关的命名空间中,以便更好地理解和管理代码。按照功能或模块划分命名空间,可以避免命名冲突和代码混乱。使用文件和文件夹:将每个命......
  • JOISC 2024 Day3 T1 : Card Collection / 卡牌收集
    首先,注意到对于一组询问,我们只需要关注每个数与\((T_j,W_j)\)的相对大小关系。这一共有\(9\)种情况,于是我们直接做区间DP,设一个形如\(f(l,r,0/1/2,0/1/2)\)的状态,即可得到\(O(N^3M)\)的做法;进一步使用bitset优化可以做到\(O(\frac{N^3M}{w})\),但是无法通过(甚至\(N=20......
  • P10432 [JOISC 2024 Day1] 滑雪 2
    MyBlogsP10432[JOISC2024Day1]滑雪2感觉是挺好的观察性质题,vp的时候场切了。首先酒店一定是建在最低的某一个点。把高度离散化之后,把点扔到对应的位置。可以发现高度为\(i\)的层的所有点,如果能接上一层的连接器那一定会尽量接上(因为到了下一层它本身也可以贡献一个空......
  • P7219 [JOISC2020] 星座 3 题解
    会发现题目的坐标其实是平面直角坐标系。我们按\(y\)坐标从小到大考虑所有的星星,假设当前考虑到了星星\(i\)。我们先计算出之前所有能够影响到\(i\)的星星的代价和为\(cost\)(可以用树状数组维护)。然后分类讨论。若\(c_i\lecost\),那么肯定直接将\(i\)直接涂黑,因为它更......
  • LibreOJ 2839 「JOISC 2018 Day 3」安全门
    令\(S\)为题面的\(S'\)。首先考虑刻画出\(\texttt{()}\)对应的折线。首先如果\(S\)本身合法,那么直接DP算一下就行了。否则考虑不合法的情况,考虑反转\((l,r]\)合法的情况的判定。令\(s_i\)为前\(S_{1\simi}\)的前缀和的值。那么有:\(s_r-s_l=\frac{s_n}......
  • LOJ#4149. 「JOISC 2024 Day1」滑雪 2
    首先,不存在\(H_i<H_j\)时增高\(H_i\)至\(H_j+1\)后连\(i\toj\)更优,因为增高后原来能连\(i\)的点现在不一定能连\(i\)了,原来能连\(j\)的点还是能连\(j\),此时的方案集必然是原方案集的子集,答案一定不会更优,又因为你付出了增高的费用,所以这样一定劣。那么我们......
  • JOISC 2024 记录
    感觉我太滞后了Day1T1Fish3我们可以做的操作是单点加\(D\)和后缀加\(1\),考虑把这个操作放在差分数组上,则操作变成了:单点加\(1\)。\(i\)处加\(D\),\(i+1\)处\(-D\)。需要最小化第二种操作的使用次数,发现只有对于所有差分数组中的负数是不得不用第二种操作的,而对于......
  • loj#575. 「LibreOJ NOI Round #2」不等关系
    记事件\(A\)为「当\(s_i=\texttt<\)时\(p_i<p_{i+1}\)」,事件\(B\)为「当\(s_i=\texttt<\)时\(p_i<p_{i+1}\),且存在\(s_j=\texttt>\),满足\(p_i<p_{i+1}\)。所求即\(n(A)-n(B)\)。\(n(A)\)是好求的,相当于部分定序排列,记每个递增段的长度为\(a_1......
  • loj#566. 「LibreOJ Round #10」yanQval 的生成树
    \(\mu\)取值即所选边权的中位数。把每条边拆成两条(黑边和白边),边权分别为\(\mu-w_i\)和\(w_i-\mu\),要求黑边和白边各选\(\left\lfloor\dfrac{n-1}2\right\rfloor\)条,求最大生成树。可以直接wqs二分,时间复杂度\(\mathcalO(nm\logw~\alpha(n))\)。把所有边的边权......