还没补完,先补一部分..
d题:
主要思路:并查集,用一个f1数组用来记录可以认识的所有人,然后用guanxi数组记录下不用再被介绍认识的人。感觉不是很难,但是连开始写的勇气都没...
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
typedef long long ll;
using namespace std;
int f[100005];
int f1[100005];
int guanxi[100005];
int find(int x){
if(f[x]!=x) f[x]=find(f[x]);
return f[x];
}
int main(){
int n,m,k;
cin>>n>>m>>k;
for(int i=0;i<=n;i++)
{
f[i]=i;
f1[i]=1;
}
while(m--){
int x,y;
cin>>x>>y;
guanxi[x]++;
guanxi[y]++;
int a=find(x),b=find(y);
if(a!=b){
f[a]=b;
f1[b]+=f1[a];
}
}
while(k--){
int x,y;
cin>>x>>y;
if(find(x)==find(y)){
guanxi[x]++;
guanxi[y]++;
}
}
for(int i=1;i<=n;i++)
{
cout<<f1[find(i)]-guanxi[i]-1<<" ";
}
}
I题:
主要思路:就多%几次,然后注意点就是可能%完会是负数,所以还要处理一下..
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
typedef long long ll;
using namespace std;
int main(){
ll a,b,c,d,e,f;
cin>>a>>b>>c>>d>>e>>f;
a%=998244353;
b%=998244353;
c%=998244353;
d%=998244353;
e%=998244353;
f%=998244353;
ll ans=(((a*b)%998244353*c)%998244353-((d*e)%998244353*f)%998244353)%998244353;
while(ans<0){
ans+=998244353;
}
cout<<ans;
}
J题:
主要思路:二分答案...一个点就是范围要注意..比赛的时候一直再wa范围,一直以为太小了,实际上是太大了,在check函数里面可能会爆ll。当时没做出来真的太痛苦了...
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
typedef long long ll;
using namespace std;
ll x[100005];
ll n,a,b,cha;
int check(ll m){
ll cnt=0;
ll d=m*b;
for(int i=0;i<n;i++){
if(x[i]-d>0){
ll tmp=x[i]-d;
cnt+=(tmp-1)/cha+1;
}
}
if(cnt>m) return 0;
else return 1;
}
int main(){
cin>>n>>a>>b;
cha=a-b;
ll r=0;
for(int i=0;i<n;i++){cin>>x[i];
if(x[i]>r)r=x[i];
}
ll l=1;
r=r/a*n+1;
while(l<=r){
ll mid=(l+r)/2;
if(check(mid)==0)l=mid+1;
else r=mid-1;
}
cout<<l<<endl;
}
总结:感觉不是很难,但是每个题目都要有点注意的点,然后还是要敢于去做,有些题目看到太复杂连尝试都不敢尝试,比如d题,其实认真思考一下是可以想到的。但是我连开始写都没有...主要原因也是对新掌握的东西不是很自信....所以还是得多做题...