2014-2015 ACM-ICPC, NEERC, Moscow Subregional 小结

本文探讨了几种算法在解决实际问题中的应用,包括直角三角形的存在性检查、进制转换与数的因子分析、图形几何判断、最短路径计算以及二分查找和枚举策略。同时,介绍了使用图论和拓扑排序优化复杂问题的解决方案,并涉及了交互式题目中模运算和取模策略的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

会按一般难度和过题顺序写

D 给正整数a,b,问能不能找出正整数c构成直角三角形。

E给出n 和 d , 要求得到用k 进制得到n,最后一个数要求为d,求出从后数d 的数量,要求数量最多是k 尽可能小。 N<1E15

方法:要使n - d 用k 进制表示出,所以求出n-d 的因子,暴力枚举得到最大答案。

特殊情况是:n== d 和n< d

F 暴力 模拟,三个人分别算一下,比较一下就行了,C点是否在A,B之间的判断用斜率相等,即(y3-y1)/(x3-x1)==(y2-y1)/(x2-x1)整理得(y3-y1)*(x2-x1)==(y2-y1)*(x3-x1)

C  直接推式子就行,二分答案会好写一些

A大暴力 分类讨论

G基环树+map运用(代码是队长的) 可以用拓扑写

#include <bits/stdc++.h>
using namespace std;
#define M 100005
typedef long long LL;
LL get(char *S){
	LL ret=0,n=strlen(S+1);
	for(int i=1;i<=n;i++){
		if(S[i]>='A'&&S[i]<='Z')S[i]+='a'-'A';
		ret=ret*26+S[i]-'a';
	}
	return ret;
}
struct Node{
	LL a,b,c;
}A[M];
map<pair<LL,LL>,int>pos;
map<LL,int>Pos;
set<LL>T[M];
int n,m,K;
vector<int>edge[M];
char S[25];
int get(LL x,LL y){
	pair<LL,LL> res=make_pair(x,y);
	if(!pos[res])pos[res]=++m;
	return pos[res];
}
void insert(LL a,LL b){
	if(!Pos[a])Pos[a]=++K;
	T[Pos[a]].insert(b);	
}
int f[M],deg[M],mark[M],To[M];
int solve(){
	queue<int>Q;
	for(int i=1;i<=m;i++)if(!deg[i])Q.push(i);
	for(int i=1;i<=m;i++)f[i]=1;
	int ret=1;
	while(!Q.empty()){
		int now=Q.front();
		Q.pop();mark[now]=1;
		ret=max(ret,f[now]);
		for(int i=0;i<edge[now].size();i++){
			int to=edge[now][i];
			deg[to]--;
			f[to]=max(f[to],f[now]+1);
			if(deg[to]==0)Q.push(to);
		}
	}
	for(int i=1;i<=n;i++)if(!mark[i]){
		int mx=0,lp=0;
		for(int j=i;!mark[j];j=To[j]){
			mx=max(mx,f[j]),lp++;
			mark[j]=1;
		}
		ret=max(ret,lp-1+mx);
	}
	return ret;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		LL x,y,z;
		scanf("%s",S+1),x=get(S);
		scanf("%s",S+1),y=get(S);
		scanf("%s",S+1);
		scanf("%s",S+1);
		scanf("%s",S+1),z=get(S);
		A[i]=(Node){x,y,z};
		insert(x,y);
	}
	for(int i=1;i<=n;i++){
		LL x=A[i].a,y=A[i].b,z=A[i].c;
		if(T[Pos[x]].count(z)){
			edge[get(x,y)].push_back(get(x,z));
			To[get(x,y)]=get(x,z);
			deg[get(x,z)]++;
		}
	}
	cout<<solve()<<endl;
	return 0;
}

H 二分答案+枚举覆盖中心点的点即可(这个点覆盖后剩余都是链了)

I 交互题 题解可以说写的很好了  取模还是要宏观列式啊!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值