首页 > 其他分享 >Atcoder ABC 309 F

Atcoder ABC 309 F

时间:2023-07-11 21:35:32浏览次数:42  
标签:node Atcoder ABC 309 int 关键字 swap

Atcoder ABC 309 F

题意

n个盒子,长宽高为\(x,y,z,\)(长宽高是相对的,可以任意调换),问是否有一个盒子可以完全容纳另一个盒子,即存在一个\(A_i={x_i,y_i,z_i},A_j={x_j,y_j,z_j}\) ,使得\(x_i<x_j,y_i<y_j,z_i<z_j\)

思路

思考一个简单的问题:对于二元组\((x,y)\),我们怎么确定存在两个二元组\(x_i<x_j,y_i<y_j\),答案自然是树状数组,以第一关键字\(x\)为下标,用树状数组维护第一关键字在\([0,x]\)的最小的\(y\)值.
这题就是多了一个关键字而已,以多出的一个关键字排序,之后放在外层枚举,注意外层关键字不能相同。

代码


struct node
{
	int a,b,c;
	//因为可以任意调换,就按从小到大排序
	void init() 
	{
		if(a>b) swap(a,b);
		if(b>c) swap(b,c);
		if(a>b) swap(a,b);
	}
}d[N];

bool cmp(node a,node b) 
{
	return a.a<b.a;
}

int p[N],f[N*3];

int get(int x) 
{
	int ans=inf;
	while(x) ans=min(ans,f[x]),x-=(x&-x);
	return ans;
}

void modify(int x,int y) 
{
	while(x<=n) f[x]=min(f[x],y),x+=(x&-x);
}

void  solve()
{
	cin>>n;
	for(int i=0;i<=n*2;i++) f[i]=inf;//树状数组维护最小值,要
	for(int i=1;i<=n;i++) cin>>d[i].a>>d[i].b>>d[i].c,d[i].init();
	sort(d+1,d+1+n,cmp);//以第一关键字排序
	
	//第二关键字 离散化
	for(int i=1;i<=n;i++) p[i]=d[i].b;
	sort(p+1,p+1+n);
 	for(int i=1;i<=n;i++) 
 	{
 		d[i].b = lower_bound(p+1,p+1+n,d[i].b)-p;
 	}

 	for(int i=1;i<=n;i++)  
 	{
 		if(d[i].a!=d[i+1].a)
 		{	
	 	//已经保证第一关键字一定大于前面的,当前的还未加入树状数组
 			for(int j=i;j>=1;j--) 
 			{
 				if(d[j].a!=d[i].a) break;
 				if(get(d[j].b-1)<d[j].c)
 				{
 					cout<<"Yes\n";
 					return;
 				}
 			}
 			for(int j=i;j>=1;j--) 
 			{
 				if(d[j].a!=d[i].a) break;
 				modify(d[j].b,d[j].c);
 			}
 		}
 	}
 	cout<<"No\n";
}

标签:node,Atcoder,ABC,309,int,关键字,swap
From: https://www.cnblogs.com/LIang2003/p/17545978.html

相关文章

  • AtCoder Beginner Contest 309 G Ban Permutation
    洛谷传送门AtCoder传送门前置知识:[ARC132C]AlmostSorted看\(\geX\)不顺眼,怎么办呢!直接容斥!钦定\(j\)个位置满足\(|P_i-i|<X\),其余任意,就转化成了[ARC132C]AlmostSorted。具体一点就是,你设\(f_{i,j,S}\)表示前\(i\)位有\(j\)个位置满足\(|P_i-i|<......
  • atcoder绿题选做
    ABC305:E  https://atcoder.jp/contests/abc305/tasks/abc305_e题意:给定一个无向图,给定k个守卫,每个守卫有h[i]的耐力值,如果是一个在图中是被保护的要满足和守卫的距离至少为h[i],让你升序打印所有被守卫的点解题思路:可以从守卫出发,看守卫在可以走的情况下最远走到哪,最后统计......
  • abc078d <博弈>
    D-ABS//https://atcoder.jp/contests/abc078/tasks/arc085_b//<博弈>//思路://首先注意到两点://1.a[n]一定会是游戏结束时某个人的数字//2.对于先手,他可以直接导致两种确定的游戏结果//1.a[n],w(先手选择a[n],游戏结束)//2.a[n-1],a[......
  • AT_abc306_h 题解
    AT_abc306_hBalanceScale题解Links洛谷AtCoderDescription有\(N\)个编号为\(1,2,\dots,N\)的砝码。有\(M\)次比较操作,每次比较砝码\(A_{i}\)和\(B_{i}\),\(A_{i}\)在左侧。分为三种情况:左边的砝码更重。右边的砝码更重。两边的砝码重量相同。将每次比较的......
  • ABC_DQ:基于MATLAB/Simulink的三相静止坐标系到两相静止坐标系(Clark变换)到两相旋转坐标
    ABC_DQ:基于MATLAB/Simulink的三相静止坐标系到两相静止坐标系(Clark变换)到两相旋转坐标系变换(Park变换)的仿真模型。仿真条件:MATLAB/SimulinkR2015bID:2720651503371560......
  • abc074d <Floyed 消除传递边>
    D-RestoringRoadNetwork//https://atcoder.jp/contests/abc074/tasks/arc083_b//<Floyed>//1.跑一边floyed检查是否有边被更新,从而判断是否A中所有都为最短路//2.在Floyed过程中,记录被更新的边a[i][j],这些边是传递产生的边,没有必要//(想到了离散数学中......
  • Atcoder ABC308H Make Q
    考虑枚举唯一一个度数为\(3\)的点\(u\),即既在环上又与非环上一点相连的那个点。接下来考虑先处理环,那可以先把\(u\)从图上删掉,环的最短距离便是与\(u\)有连边的\(2\)个点在图上最短路长度加上\(2\)个点与\(u\)连边的长度,即\(\min\{w_{u,i}+w_{u,j}+\operator......
  • AT-abc214-g题解
    题目描述给定两个排列\(p,q\),要求统计满足\(\foralli,r_i\not=p_i,r_i\not=q_i\)的排列\(r\)的数量。对\(1000000007\)取模数据范围\(n\le3000\)。solution本题要求统计数量,反正我想了半天没想到怎么正向统计(bushi),因此我们考虑容斥。设\(h_i\)为只看其中......
  • abc073d <Floyed + 枚举排列>
    D-joisino'stravel//https://atcoder.jp/contests/abc073/tasks/abc073_d//Floyed+枚举排列#include<iostream>#include<algorithm>#include<vector>#include<cstring>usingnamespacestd;usingLL=longlong;constintN=......
  • abc070d <简单树上dfs>
    D-TransitTreePath//https://atcoder.jp/contests/abc070/tasks/abc070_d//<简单树上dfs>#include<iostream>#include<algorithm>#include<vector>usingnamespacestd;usingLL=longlong;constintN=1e5+10;structNode{......