会按一般难度和过题顺序写
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 交互题 题解可以说写的很好了 取模还是要宏观列式啊!!
本文探讨了几种算法在解决实际问题中的应用,包括直角三角形的存在性检查、进制转换与数的因子分析、图形几何判断、最短路径计算以及二分查找和枚举策略。同时,介绍了使用图论和拓扑排序优化复杂问题的解决方案,并涉及了交互式题目中模运算和取模策略的重要性。

被折叠的 条评论
为什么被折叠?



