Codeforces Round #693 (Div. 3)

A.Cards for Friends

计算面积包含的 2 i ≥ n 2^i\ge n 2in

B.Fair Division

暴力。

C. Long Jumps

从左往右,用标记维护取最值。

D. Even-Odd Game

分奇偶两堆,从大到小排序,对于当前局势,如果自己得分更大就选自己的,否则如果对方牌顶更大就选对方,让对方不得分。

E. Correct Placement

n n n个以 h h h为第一关键字,后 n n n个以 w w w为第一关键字,然后排序,维护一个最小值第二关键字,跑双指针。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
int t,n;
int w[N],h[N],ans[N];
pair<int,PII>a[N<<1];
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		for(int i=1;i<=n;i++){
			scanf("%d%d",&h[i],&w[i]),ans[i]=-1;
			a[i]={h[i],{w[i],i}},a[n+i]={w[i],{h[i],i}};
		}
		sort(a+1,a+2*n+1);
		int mn=inf,j=1,x=-1;
		for(int  i=1;i<=2*n;i++){
			 while(a[j].fi<a[i].fi){
			 	int id=a[j].se.se;
			 	if(mn>a[j].se.fi) mn=a[j].se.fi,x=id;
			 	j++; 
			 }
			 if(mn!=inf&&mn<a[i].se.fi) ans[a[i].se.se]=x;
		}
		for(int i=1;i<=n;i++) printf("%d ",ans[i]);printf("\n");
	}
	return 0;
}

F , G F,G F,G待写,考试完整理。


总结

C C C题因为没有在循环里判断 v i s vis vis,导致 W A WA WA了好多次。 E E E题想复杂了,没有想到最小值维护第二关键字,去想怎么二分查找了。