补题报告!

复赛集训第五场补题报告

比赛过程:先用模拟写了B题,但是思路不对,只得30分,又偷了偷C题,再拿20分,最后研究了下A题,100分,共得150分。

题解报告

(1)重复判断
题目描述:判断一个字符串a,是否由另一个字符串b生成出来的,所谓的生成,其实就是把字符串b重复若干次,即:判断字符串a是否是字符串b重复若干次得到的。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int t;
string s1,s2;
int main(){
	cin>>t;
	while(t--){
		cin>>s1>>s2;
		int len1=s1.size();
		int len2=s2.size();
		if(len1%len2!=0){
			cout<<"NO"<<"\n";
			continue;
		}
		s1="0"+s1;
		s2="0"+s2;
		int flag=1;
		for(int i=1;i<=len1;++i){
			int ll=i%len2;
			if(ll==0){
				ll=len2;
			}
			if(s1[i]!=s2[ll]){
				cout<<"NO";
				flag=0;
				break;
			}
		}
		if(flag==1){
			cout<<"YES";
		}
		cout<<"\n";
	}
	return 0;
} 
(2)外国人学乘法
题目描述:对于a × b:1.将a,b的每一位上的数码画成线,不同位之间分隔开。2.a 和 b 的方向垂直画出。3.数出每个方向上交点的个数,即是 c 对应位置上的数码。给出两个数字 a, b,求它们的乘积时交点的总个数是多少。

AC代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    int a,b;
    cin>>a>>b;
    cout<<(a%10)*(b%10)+(a%10)*(b/10)+(a/10)*(b%10)+(a/10)*(b/10);
    return 0;
}
(3)去重求和
题目描述:小可有一个长度为 n 的序列 ,他定义sum(l,r),为a[l]~a[r],这些数去重之后的和。请求出对于所有合法的l和r,sum(l,r)的总和是多少。
题解:
此类题怎么入手:找特殊情况,总结了用每个数字对结果的贡献次数 * 这个数本身即可得到最终结果的规律,找出适当的做法。
AC代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,a[500005];
map<ll,ll> f;
const ll mod=1e9+7;
int main(){
    ll sum=0;
    cin>>n;
    for(int i=1;i<=n;++i){
        cin>>a[i];
        ll k=i-f[a[i]];
        ll kk=n-i+1;
        ll kkk=(k*kk)%mod;
        sum=sum+kkk*a[i];
        sum%=mod;
        f[a[i]]=i;
    }
    cout<<sum%mod;
    return 0;
}
(4)点集操作
题目描述小可在学习图论,他有一个有向无环图,他想知道对这个图做任意次modify(i,j)操作之后的图中剩余的最小点数。
AC代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+5;
int n,m,x[MAXN<<1],y[MAXN<<1],in[MAXN];
int head[MAXN],num,ans;
bool b[MAXN],vis[MAXN];
vector<int> v;
queue<int> q;
struct node{
    int to,next;
}e[MAXN<<1];
void add(int u,int v){
    e[++num].to=v;
    e[num].next=head[u];
    head[u]=num;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=m;++i){
        cin>>x[i]>>y[i];
        add(x[i],y[i]);
        in[y[i]]++;
    }
    for(int i=1;i<=n;++i){
        if(!in[i]){
            v.push_back(i);
            ans++;
        }
    }
    for(int i=1;i<=m;++i){
        if(in[x[i]]){
            b[y[i]]=1;
        }
    }
    for(int i=0;i<v.size();++i){
        for(int j=head[v[i]];j;j=e[j].next){
            if(!b[e[j].to]){
                b[e[j].to]=1;
                ans++;
            }
        }
    }
    cout<<ans;
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值