首页 > 其他分享 >P7312题解

P7312题解

时间:2024-01-19 15:34:40浏览次数:22  
标签:ch int 题解 mid 矩形 P7312

P7312 [COCI2018-2019#2] Sunčanje

题目传送门

题解

分类讨论的思想有点像P4169?

要你对于每一个矩形,求是否存在编号比它大,与它有交的矩形。

直接做需要用一个比较神仙的线段树用法,所以我们可以容斥:我们求出编号比它大,与它交的矩形数量,最后与所有可能覆盖它的矩形共 \(n-i\) 个作比较。

更具体的,求出在它上下左右的矩形数量减去四个角的矩形数量即可。上下左右的矩形数量是经典二维偏序,四个角的矩形数量是经典三维偏序,直接套板子就好。

一个小技巧:只考虑一边和一个角的贡献,打包成一个函数(即下文的 solve() 函数),每次直接转坐标轴就可以快速求解。

时间复杂度 \(O(n\log^2n)\) ,可以尝试归并,但是我懒。

代码很好写:

#include<bits/stdc++.h>
using namespace std;
inline int rd() {
	int s=0,m=0;char ch=getchar();
	while(!isdigit(ch)) {if(ch=='-')m=1;ch=getchar();}
	while( isdigit(ch)) s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
	return m?-s:s;
}
const int ML=200005;
int n,ans[100005];
struct QWQ {int id,xl,xr,yl,yr;} a[100005],b[100005];
bool cmp1(QWQ a1,QWQ a2) {return a1.id>a2.id;}
bool cmp2(QWQ a1,QWQ a2) {return a1.xr<a2.xr;}
bool cmp3(QWQ a1,QWQ a2) {return a1.xl<a2.xl;}
int bx[200005],by[200005],cntx,cnty,qx,qy;
struct Binary_Indexed_Tree {
	int t[ML+5];
	inline int lb(int x) {return x&-x;}
	inline int sum(int x) {int s=0;for(int i=x;i;i-=lb(i)) s+=t[i];return s;}
	inline void add(int x,int k) {for(int i=x;i<=ML;i+=lb(i)) t[i]+=k;}
} t;
void cdq(int l,int r) {
	if(l>=r) return;
	int mid=(l+r)>>1;
	cdq(l,mid);cdq(mid+1,r);
	sort(b+l,b+mid+1,cmp2);
	sort(b+mid+1,b+r+1,cmp3);
	int i=l;
	for(int j=mid+1;j<=r;j++) {
		while(i<=mid&&b[i].xr<=b[j].xl) t.add(b[i].yr,1),i++;
		ans[b[j].id]+=t.sum(b[j].yl);
	}
	for(int j=l;j<i;j++) t.add(b[j].yr,-1);
}
void solve() {
	for(int i=1;i<=n;i++)
		ans[b[i].id=a[i].id]-=t.sum(b[i].yl),t.add(b[i].yr,1);
	for(int i=1;i<=n;i++) t.add(b[i].yr,-1);
	cdq(1,n);
}
signed main() {
	cin>>n;
	for(int i=1;i<=n;i++) {
		int xi=rd()+1,yi=rd()+1,ai=rd(),bi=rd();
		a[i].id=i,ans[i]=n-i;
		bx[++cntx]=a[i].xl=xi,bx[++cntx]=a[i].xr=xi+ai,
		by[++cnty]=a[i].yl=yi,by[++cnty]=a[i].yr=yi+bi;
	}
	sort(bx+1,bx+cntx+1);qx=unique(bx+1,bx+cntx+1)-bx-1;
	sort(by+1,by+cnty+1);qy=unique(by+1,by+cnty+1)-by-1;
	for(int i=1;i<=n;i++)
		a[i].xl=lower_bound(bx+1,bx+qx+1,a[i].xl)-bx,
		a[i].xr=lower_bound(bx+1,bx+qx+1,a[i].xr)-bx,
		a[i].yl=lower_bound(by+1,by+qy+1,a[i].yl)-by,
		a[i].yr=lower_bound(by+1,by+qy+1,a[i].yr)-by;
	sort(a+1,a+n+1,cmp1);
	for(int i=1;i<=n;i++)
		b[i].xl=a[i].xl,b[i].xr=a[i].xr,b[i].yl=a[i].yl,b[i].yr=a[i].yr;
	solve();
	for(int i=1;i<=n;i++)
		b[i].xl=a[i].yl,b[i].xr=a[i].yr,b[i].yl=ML-a[i].xr,b[i].yr=ML-a[i].xl;
	solve();
	for(int i=1;i<=n;i++)
		b[i].xl=ML-a[i].xr,b[i].xr=ML-a[i].xl,b[i].yl=ML-a[i].yr,b[i].yr=ML-a[i].yl;
	solve();
	for(int i=1;i<=n;i++)
		b[i].xl=ML-a[i].yr,b[i].xr=ML-a[i].yl,b[i].yl=a[i].xl,b[i].yr=a[i].xr;
	solve();
	for(int i=1;i<=n;i++)
		if(!ans[i]) puts("DA");
		else puts("NE");
	return 0;
}

标签:ch,int,题解,mid,矩形,P7312
From: https://www.cnblogs.com/operator-/p/17974771

相关文章

  • P6554题解
    P6554PromisesICan'tKeep题目传送门题解看题解都有些做烦了,就来发一篇。换根dp。第一遍dfs处理出\(Lef_u\)表示\(u\)子树内的叶子个数(包含自己),然后求出以\(1\)为根时的答案\(\sumLef_u*val_u\),注意特判根为叶子的情况。第二遍dfs大力换根就好了,从根\(u\)......
  • P9744题解
    P9744「KDOI-06-S」消除序列题目传送门题解记错时间错过模拟赛的sb来也。题目中的最关键信息就是\(a_i,b_i,c_i\ge0\),这意味着多做无用的操作一定不优,所以有:结论\(1\):优先进行\(1\)操作。这是因为我们不管我们在\(1\)操作前做什么操作都会被其推平覆盖,是无用操......
  • P8047题解
    P8047[COCI2015-2016#4]GALAKSIJA题目传送门题解显然是要删边变加边的,然后联通性也是显然要用并查集维护的,就是路径异或和需要一个数据结构来维护。发现:加边删边不影响两个点的路径异或和。所以我们可以处理出每个点到\(1\)号节点的路径异或和\(d\),于是\(Path_{u,v}=d_u......
  • P8034题解
    P8034[COCI2015-2016#7]Ozljeda题目传送门题解评橙差不多了。手玩一下样例,很容易发现\(x\)的循环节为\(K+1\),每一段分别为\(a_1,a_2,a_3,\dots,a_K,\bigoplus_{i=1}^Ka_i\)这几项,然后恰好循环节的异或值为\(0\),所以就可以直接维护前缀异或值,然后取模求答案。代码:#i......
  • [AGC048D] Pocky Game 题解
    题目链接点击打开链接题目解法好难的题,想不出来一点!!!首先给出一个第一个结论:最优策略下,每个人每次只会取一个石子或者取完一堆石子题解区都没有严谨证明,\(at\)的\(editorial\)也没证,所以我只能感性理解:下面以先手为例。如果最左边的石子数\(>\)其余所有堆的石子数,那么先......
  • 题解 WD与数列
    P5161WD与数列可以想到原条件是一个差分形式,所以我们对原数组差分。然后发现答案其实就是\(\sum_{i<j}\min(lcp(i+1,j+1)+1,j-i)\)。这个东西先跑SA,然后建笛卡尔树。考虑对于一个区间,其值为\(x\)。那么相当于是求\(\sum_{l\inS,r\inT}\min(|sa_{l}-sa_{r}|,x)\)。笛......
  • AT_arc115_b [ARC115B] Plus Matrix 题解
    AT_arc115_b[ARC115B]PlusMatrix题解题意给定矩阵\(C_{n\timesn}\),求两个数列\(A_n,B_n\),使得\(C_{i,j}=A_i+B_j\)。分析画出一个表格来:213243502131324可以看出来,对于任意一列\(j\),\(C_{*,j}\)都存在有\(B_j\)的贡献。那么我们......
  • ELK之Filebeat自动断开问题解决
     自动断开命令 解决自动断开命令nohup./filebeat-e-cfilebeat.yml>./filebeat.log 2>&1& disown 其他的方式(目前我没有使用) 在linux操作系统/etc/systemd/system目录下创建一个filebeat.service文件,写入如下内容需要注意替换文件的位置以及版本[Unit]D......
  • GDKOI 2024 题解
    鸽了一些题。匹配先抽出来一个完美匹配,然后尝试调整。调整相当于:找一个偶环,满足匹配的边和未匹配的边交错,且偶环的总异或和为\(0\),是不是写个暴力就好了?发现冲过去了,很牛逼,复杂度\(O(n^3)\)(?),Code。不休陀螺一个区间可以被打出的条件是:令\(\Delta_i=b_i-a_i\),则\(x=\sum......
  • P2580 于是他错误的点名开始了题解
    “普及/提高-”这个难度很有意思。说明这题可能需要用到提高组当中比较基础的内容。它的名字叫做map。map,其实相当于一个超大数组,但它真实的作用是:映射。比如a[7]=5;就是用a数组把7和5关联了起来,这个操作就叫映射。map这东西NB的地方在于,它能这么写:score["Leo201......