2022-7-6 个人排位赛3 比赛心得

每场比赛一个基础知识点

7-4 第一场KMP和哈希字符串

7-5 第二场搜索BFS

7-6 第三场也就是这次以线段树和树状数组为主

【这三场过题最多的一次qwq,很爽】

算法总结:

A:线段树的模板题

B:思维题+STL维护

E:括号匹配,简单的栈维护(一开始思路错了)

F:小数据下手+桶+滑动窗口

G:简单模拟

H:二分

I:map巧存字符串+数组放map+暴力(map操作基本都是logn)

J:树状数组模板题

K:(可以暴力)线段树变种

L:模拟


有点意思的题目:

F:MALCOLM

自从Herkabe老师开始对他的学生进行排名以来,他班上的朋友对数急剧下降。排名靠后的学生已经开始嫉妒排名靠前的学生,而排名靠前的学生则开始看不起那些排名靠后的学生。题目描述根据Malcolm的观察,班上一共有n名学生。如果两个学生的排名最多相差k,那么他们就是朋友。如果有两个学生是朋友并且它们的名字长度相等,那么他们就是好朋友。现在给定这个班上n名学生的名字及排名,求这个班上一共有多少对好朋友。

输入格式输入共n+1行。第一行,两个整数n,k,分别表示班上的学生人数和朋友的排名之间最多相差的名次。随后n行,第i+1行一个字符串,表示在班上排第i名的学生的名字。

输出格式输出仅一行一个整数,表示班上好朋友的对数。

Sample Input

4 2 IVA IVO ANA TOM 6 3 CYNTHIA LLOYD STEVIE KEVIN MALCOLM DABNEY

Sample Output

5 2

#include <bits/stdc++.h>
#define int long long
#define CIO std::ios::sync_with_stdio(false)
#define rep(i, l, r) for (int i = l; i <= r; i++)
#define nep(i, r, l) for (int i = r; i >= l; i--)
using namespace std;
const int N=2e6+5;
const int MAX=1e18;
struct student{
	int idx;
	int len;
}stu[N];
int t[N];
int n,k;
char s[N];
void work(){
	cin>>n>>k;
	rep(i,1,n){
		cin>>s;
		stu[i].idx=i;
		stu[i].len=strlen(s);
	}
	rep(i,1,k+1){
		t[stu[i].len]++;
	}
	int sum=0;
	rep(i,2,20){
		sum+=t[i]*(t[i]-1)/2;
	}
	rep(i,k+2,n){
		t[stu[i-(k+1)].len]--;
		sum+=t[stu[i].len];
		t[stu[i].len]++;
	}
	cout<<sum;
}
signed main(){
	CIO;
	work();
	return 0;
}

I:POREDAK

Sample Input

3 alpha beta gamma alpha gamma beta 5 naboo geonosis yavin hoth endor geonosis yavin hoth endor naboo

Sample Output

2/3 6/10

#include <bits/stdc++.h>
#define int long long
#define CIO std::ios::sync_with_stdio(false)
#define rep(i, l, r) for (int i = l; i <= r; i++)
#define nep(i, r, l) for (int i = r; i >= l; i--)
using namespace std;
const int N=2e5+5;
map<string,int> m1,m2;
int a[N],b[N];
string s[N];
void work(){
	int n;cin>>n;
	rep(i,1,n){
		cin>>s[i];
		m1[s[i]]=i;
	}
	rep(i,1,n){
		a[i]=i;
	}
	rep(i,1,n){
		cin>>s[i];
		m2[s[i]]=i;
		b[i]=m1[s[i]];
	}
	int cnt=0;
	rep(i,1,n){
		rep(j,i+1,n){
			if ((a[i]-a[j])*(b[i]-b[j])>0){
				cnt++;
			}
		}
	}
	cout<<cnt<<"/"<<n*(n-1)/2<<endl;
}
signed main(){
	CIO;
	work();
	return 0;
}

K:OREHNJACA

Sample Input

10 3 2 4 7 8 6 9 10 3 1 3 5 7 8 9 10 5 1 1 1 2 1 3 1 4 7 8

Sample Output

3 1 1 1 4 5

线段树维护

#include <bits/stdc++.h>
#define int long long
#define CIO std::ios::sync_with_stdio(false)
#define rep(i, l, r) for (int i = l; i <= r; i++)
#define nep(i, r, l) for (int i = r; i >= l; i--)
using namespace std;
const int N=2e3+5;
struct people{
	int p,k;
}ren[N];
int tr[4*N],num[N],laz[4*N];
void build(int p,int l,int r){
    if (l==r){
        tr[p]=num[l];
        return;
    }
    int mid=l+r>>1;
    build(2*p,l,mid);
    build(2*p+1,mid+1,r);
    tr[p]=tr[2*p]+tr[2*p+1];
}
//build(1,1,n);
void pushdown(int p,int l,int r){
	if (tr[p]==0){
    	tr[2*p]=0;
    	tr[2*p+1]=0;
	}
}
int query(int p,int l,int r,int x,int y){
	if (x<=l&&r<=y){
		return tr[p];
	}
    pushdown(p,l,r);
	int mid=l+r>>1,ans=0;
	if (x<=mid)ans+=query(2*p,l,mid,x,y);
	if (mid<y)ans+=query(2*p+1,mid+1,r,x,y);
	return ans;
}
void update(int p,int l,int r,int x,int y){
    if (x<=l&&r<=y){
        tr[p]=0;
        return;
    }
    pushdown(p,l,r);
    int mid=l+r>>1;
    if (x<=mid)update(2*p,l,mid,x,y);
    if (mid<y)update(2*p+1,mid+1,r,x,y);
    tr[p]=tr[2*p]+tr[2*p+1];
}
void work(){
	int l,n,ma=-1,mi=-1,mai=1,mii=1,qu;
	cin>>l>>n;
	rep(i,1,l){
		num[i]=1;
	}
	build(1,1,l);
	rep(i,1,n){
		cin>>ren[i].p>>ren[i].k;
		qu=query(1,1,l,ren[i].p,ren[i].k);
		update(1,1,l,ren[i].p,ren[i].k);
		if (mi<qu){
			mi=qu;
			mii=i;
		}
		if (ma<ren[i].k-ren[i].p){
			ma=ren[i].k-ren[i].p;
			mai=i;
		}
	}	
	cout<<mai<<endl;
	cout<<mii<<endl;
}
signed main(){
	CIO;
	work();
	return 0;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

繁水682

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值