专栏文章
8.14总结
个人记录参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mioc0u6v
- 此快照首次捕获于
- 2025/12/02 16:44 3 个月前
- 此快照最后确认于
- 2025/12/02 16:44 3 个月前
| 题目号 | 思路 |
|---|---|
| A | DP |
| B | 前缀和+二分 |
| C | 建返图再DFS |
| D | 大模拟 |
| E | 分治 |
| F | 算边权再求最小生成树 |
A.
CPP#include<bits/stdc++.h>
using namespace std;
string s[100005],pre[2005][85];
long long n,dp[100005];
long long g(long long x,long long y)
{
return (pre[x][s[y].size()-1]==s[y]);
}
signed main()
{
cin>>n;
for(long long i=1;i<=n;i++)
{
cin>>s[i];
string y="";
for(long long j=0;j<s[i].size();j++)
{
y+=s[i][j];
pre[i][j]=y;
}
}
long long maxi=0;
for(long long i=1;i<=n;i++)
{
dp[i]=1;
for(long long j=1;j<i;j++)
{
if(g(i,j))
{
dp[i]=max(dp[i],dp[j]+1);
}
}
maxi=max(maxi,dp[i]);
}
cout<<maxi;
return 0;
}
B.
CPP#include<bits/stdc++.h>
using namespace std;
int n,q,t,sum[50005],b[50005],x;
map<int,int>c;
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>q;
for(long long i=1;i<=n;i++)
{
cin>>b[i];
sum[i]=sum[i-1]+b[i];
}
while(q--)
{
cin>>t;
long long l=0,r=n+1;
while(l+1<r)
{
long long M=(l+r)/2;
if(sum[M]<=t)
l=M;
else
r=M;
}
cout<<r<<endl;
}
return 0;
}
C.
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
vector<int>l[100005];
int n,m,vis[100005],a[100005];
void dfs(int x,int y)
{
if(vis[x])
return ;
a[x]=y;
vis[x]=1;
for(int i=0;i<l[x].size();i++)
dfs(l[x][i],y);
}
signed main()
{
cin>>n>>m;
while(m--)
{
int x,y;
cin>>x>>y;
l[y].push_back(x);
}
for(int i=n;i>=1;i--)
dfs(i,i);
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
return 0;
}
D.
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
char c[25][25],a[25][25],bai[25][25],b[25][25],s[25][25];
int n,k;
void f()
{
for(int i=1;i<=k;i++)
for(int j=1;j<=k;j++)
{
c[j][k-i+1]=b[i][j];
}
for(int i=1;i<=k;i++)
for(int j=1;j<=k;j++)
{
b[i][j]=c[i][j];
}
return ;
}
int ck(int x,int y)
{
for(int i=x;i<=x+k-1;i++)
{
for(int j=y;j<=y+k-1;j++)
{
if(b[i-x+1][j-y+1]=='*' and a[i][j]=='.')
return 0;
}
}
return 1;
}
void zhi(int x,int y)
{
for(int i=x;i<=x+k-1;i++)
{
for(int j=y;j<=y+k-1;j++)
{
if(b[i-x+1][j-y+1]=='*')
bai[i][j]=b[i-x+1][j-y+1];
}
}
}
signed main()
{
int t;
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
bai[i][j]='.';
}
}
cin>>k;
for(int i=1;i<=k;i++)
{
for(int j=1;j<=k;j++)
{
cin>>b[i][j];
}
}
for(int i=1;i<=n-k+1;i++)
{
for(int j=1;j<=n-k+1;j++)
{
for(int l=1;l<=4;l++)
{
if(ck(i,j))
{
zhi(i,j);
}
f();
}
}
}
int sum=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
sum+=(a[i][j]==bai[i][j]);
// cout<<bai[i][j];
}
// cout<<endl;
}
if(sum==n*n)
cout<<"YES\n";
else
cout<<"NO\n";
}
return 0;
}
E.
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k,a[100005];
int sum[100005];
int dfs(int l,int r)
{
if(l==r)
return a[l]>=0;
int m=(l+r)/2;
int ans=dfs(l,m)+dfs(m+1,r);
sum[m]=a[m];
sum[m+1]=a[m+1];
for(int i=m-1;i>=l;i--)
sum[i]=sum[i+1]+a[i];
for(int i=m+2;i<=r;i++)
sum[i]=sum[i-1]+a[i];
sort(sum+l,sum+m+1);
sort(sum+m+1,sum+r+1);
for(int i=l,j=r;i<=m;i++)
{
while(j>m&&sum[i]+sum[j]>=0)
j--;
ans+=r-j;
}
return ans;
}
signed main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>a[i],a[i]-=k;
cout<<dfs(1,n);
return 0;
}
F.
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
struct N{
int x,y,w;
}e[200005];
int n,m,cnt,a[200005],sum,fa[200005];
int find(int x)
{
if(fa[x]==x)
return x;
return fa[x] = find(fa[x]);
}
void un(int x,int y)
{
x=find(x);
y=find(y);
if(x!=y)
fa[x]=y;
return ;
}
int cmp(N x,N y)
{
return x.w<y.w;
}
void k()
{
for(int i=1;i<=n;i++)
fa[i]=i;
sort(e+1,e+m+1,cmp);
for(int i=1;i<=m;i++)
{
int x=find(e[i].x),y=find(e[i].y);
if(x==y)
continue;
sum+=e[i].w;
un(x,y);
cnt++;
if(cnt==n-1)
return ;
}
}
signed main()
{
cin>>n>>m;
int mini=1e18;
for(int i=1;i<=n;i++)
{
cin>>a[i];
mini=min(mini,a[i]);
}
for(int i=1;i<=m;i++)
{
cin>>e[i].x>>e[i].y>>e[i].w;
e[i].w*=2;
e[i].w+=a[e[i].x]+a[e[i].y];
}
k();
cout<<sum+mini;
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...