Codeforces Round 12

最近时间比较少,好久没补CF了,于是先补一发D再说

D:树状数组好题,题目大意是有N个人,每个人3个属性a,b,c,如果她发现有另外一个人三个属性都比她高,她就会自杀,求自杀人的个数

首先可以按a值降序,a相等的按b升序排,由于范围是1e9,于是将b离散化。处理c属性的大小关系。

将离散后b的名次作为树状数组的下标,维护c的大小,树状数组中存储的是比此人a属性大的人中,c属性的最大值.统计即可,上代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=500005;
struct data{
	int a,b,c;
	friend bool operator<(data p,data q){
		return (p.a!=q.a)?(p.a>q.a):p.b<q.b;
	}
}rec[N];
int n,h[N];
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i)	scanf("%d",&rec[i].a);
	for(int i=1;i<=n;++i)	scanf("%d",&rec[i].b),h[i]=rec[i].b;
	for(int i=1;i<=n;++i)	scanf("%d",&rec[i].c);
	sort(&rec[1],&rec[n+1]);
	sort(&h[1],&h[n+1]);
	for(int i=1;i<=n;++i)	rec[i].b=n-(lower_bound(&h[1],&h[n+1],rec[i].b)-&h[1]);
	memset(h,-1,sizeof(h));
	int ans=0;
	for(int i=1;i<=n;++i){
		int tmp=-100;
		for(int j=rec[i].b-1;j;j-=j&-j)	tmp=max(tmp,h[j]);
		if(tmp>rec[i].c)	ans++;
		for(int j=rec[i].b;j<=n;j+=j&-j)	h[j]=max(h[j],rec[i].c);
	}
	printf("%d\n",ans);
	return 0;
}
	

E:SB构造题,找找规律,随意YY即可,我YY了N久,发现犯了各种2B错误,然后还是比较麻烦的一种,好桑心,上代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1005;
int a[N][N];
int main(){
	int n;
	scanf("%d",&n);
	for(int j=0;j<n;++j){
		int t=(j+j)%(n-1);
		for(int i=j;i<n;++i){
			if(i==n-1 && j!=0)	a[i][j]=t;
			else if(j==i)	a[i][j]=0;
			else a[i][j]=(i+j-1)%(n-1)+1;
			a[j][i]=a[i][j];
		}
	}
	for(int i=0;i<n;++i){
		for(int j=0;j<n;++j)	printf("%d ",a[i][j]);
		printf("\n");
	}
	return 0;
}
	


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值