Codeforces Round #627 (Div. 3)题解全集

又是一次欢乐斗地主场(不计rating 随便搞
A题 水题直接秒吧 就统计下基偶然后巴拉巴拉

//
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define mod 1000000007
#define PI acos(-1)
#define fi first
#define se second
#define lowbit(x) (x&(-x))
#define mp make_pair
#define pb push_back
#define si size()
#define E exp(1.0)
#define fixed cout.setf(ios::fixed)
#define fixeds(x) setprecision(x)
#define IOS ios::sync_with_stdio(false);cin.tie(0)
 using namespace std;
inline ll read(){
    char c=getchar();
    ll f=1,x=0;
    while(c<'0'||c>'9'){
        if(c=='-')
            f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=(x<<1)+(x<<3)+(c^'0');
        c=getchar();
    }
    return x*f;
}
const int manx=2e5+5;
ll a[manx];
int main(){
    ll p=read();
    while(p--){
        ll n=read(),res=0,cnt=0;
        for(int i=1;i<=n;i++){
            a[i]=read();
            if(a[i]&1) res++;
            else cnt++;
        }
        if(cnt&&res) printf("NO\n");
        else printf("YES\n");
    }
    return 0;
}
 

B题 题意 寻找至少长度为3的回文子序列
题解 开两个map 左到右 右到左 扫一遍 能找到3就标记以下 直接输出就好

//代码又贴不上去了
https://paste.ubuntu.com/p/MSCDmv4tKt/

C题挺有意思的 题目读完了不知道咋写 照着样例思维一番 云AC了样例 写一发就AC了
题解:寻找最长连续L的长度 输出+1 完事 思维水题

int main(){
ll t=read();
while(t--){
scanf("%s",s);
ll n=strlen(s);
ll i;
ll add=0;
for(i=0;i<n;i++){
  if(s[i]=='L'){
  ll k=0;
  while(s[i]=='L'){
   k++;
   i++;
  }
  add=max(k,add);
  }
}
    printf("%lld\n",add+1);
}
return 0;
}
 

D题 题意 输入a b数组的元素 (个数相同)
只要满足 ai+aj>bi+bj 就算good 问你有多少个good
题解:n方能用于数据小范围 pass
先对上述式子变形 (ai-bi) +(aj-bj)>0
令ci=ai-bi c数组存储好了后 sort一下 那么
开始区间操作就ok l=0 r=n-1
因为都排好序了 所以满足的c[l]+c[r]>0 那么该l r区间good个数就是r-l+1 因为l满足 l+1肯定满足 以此类推 主要是我们sort过

//
int main(){
ll n=read();
ll i;
for(i=0;i<n;i++){
    a[i]=read();
}
for(i=0;i<n;i++){
    b[i]=read();
    c[i]=a[i]-b[i];
}
sort(c,c+n);
ll l=0,r=n-1,add=0;
while(1){
if(c[l]+c[r]>0){
    add+=r-l;
    r--;
}
else{
    l++;
}
  if(l==r){
    break;
  }
}
printf("%lld\n",add);
return 0;
}

E 其实也就是个水dp (读错题瞎搞了
题意 一个人就叫他波比吧 (无所谓的ID) 一天要睡n次 输入ai就是每次睡觉的时长
一天有h小时 输入l r 叫他good区间吧 每次波比可以睡ai 或ai-1小时
问你 他最多能有多少次睡觉的时候 覆盖了l r区间
题解 dp 两种状态 ai ai-1 巴拉巴拉 注意从t=0开始的

//
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define mod 1000000007
#define PI acos(-1)
#define fi first
#define se second
#define lowbit(x) (x&(-x))
#define mp make_pair
#define pb push_back
#define si size()
#define E exp(1.0)
#define fixed cout.setf(ios::fixed)
#define fixeds(x) setprecision(x)
#define IOS ios::sync_with_stdio(false);cin.tie(0)
 using namespace std;
inline ll read(){
    char c=getchar();
    ll f=1,x=0;
    while(c<'0'||c>'9'){
        if(c=='-')
            f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=(x<<1)+(x<<3)+(c^'0');
        c=getchar();
    }
    return x*f;
}
ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b);}//最大公因数
/*最小公倍数lcm(a,b)=a*b/gcd(a,b);
gcd(ka,kb)=k*gcd(a,b);
gcd(s/a,s/b)=s/gcd(a,b);
gcd(x^a-1,x^b-1)=x^gcd(a,b)-1;
gcd(f[a],f[b])=f[gcd(a,b)];
lcm(ka,kb)=k*lcm(a,b);
lcm(f[a],f[b])=f[lcm(a.b)];*/
int n,h,l,r,a[2005],dp[2005][3005];
signed main()
{
 cin>>n>>h>>l>>r;
 for (int i=1;i<=n;i++)
  cin>>a[i];
 memset(dp,-1,sizeof(dp));
 dp[0][0]=0;
 for (int i=1;i<=n;i++)
 {
  for (int j=0;j<h;j++)
  {
   if (dp[i-1][j]==-1) continue;
   int tmp=(j+a[i]-1)%h;
   if (tmp>=l&&tmp<=r) dp[i][tmp]=max(dp[i][tmp],dp[i-1][j]+1);
   else dp[i][tmp]=max(dp[i][tmp],dp[i-1][j]);
   tmp++;
   tmp%=h;
   if (tmp>=l&&tmp<=r) dp[i][tmp]=max(dp[i][tmp],dp[i-1][j]+1);
   else dp[i][tmp]=max(dp[i][tmp],dp[i-1][j]);
  }
 }
 int ans=0;
 for (int i=1;i<=n;i++)
 {
  for (int j=0;j<h;j++)
  {
   ans=max(ans,dp[i][j]);
  }
 }
 cout<<ans;
 return 0;
}

F 换根变形 基本上是板子 - -

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define mod 1000000007
#define PI acos(-1)
#define fi first
#define se second
#define lowbit(x) (x&(-x))
#define mp make_pair
#define pb push_back
#define si size()
#define E exp(1.0)
#define fixed cout.setf(ios::fixed)
#define fixeds(x) setprecision(x)
#define IOS ios::sync_with_stdio(false);cin.tie(0)
 using namespace std;
inline ll read(){
    char c=getchar();
    ll f=1,x=0;
    while(c<'0'||c>'9'){
        if(c=='-')
            f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=(x<<1)+(x<<3)+(c^'0');
        c=getchar();
    }
    return x*f;
}
ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b);}//最大公因数
/*最小公倍数lcm(a,b)=a*b/gcd(a,b);
gcd(ka,kb)=k*gcd(a,b);
gcd(s/a,s/b)=s/gcd(a,b);
gcd(x^a-1,x^b-1)=x^gcd(a,b)-1;
gcd(f[a],f[b])=f[gcd(a,b)];
lcm(ka,kb)=k*lcm(a,b);
lcm(f[a],f[b])=f[lcm(a.b)];*/
const int MAXN=200005;
vector<int>G[MAXN];
int sz[MAXN],dp[MAXN],val[MAXN],n,u,v,ans[MAXN];
///----------------------------
void dp_link(int root1,int root2)
{
    dp[root1]+=max(dp[root2],0);
}
void dp_cut(int root1,int root2)
{
    dp[root1]-=max(dp[root2],0);
}
void get_leaf(int root)
{
     dp[root]=val[root]?1:-1;
}
///-----------------------------
void change_root(int root1,int root2)
{
    dp_cut(root1,root2);
    dp_link(root2,root1);
}
void dp_dfs(int x,int fa)
{
    get_leaf(x);
    for(auto &i:G[x])
    {
        if(i!=fa)
        {
            dp_dfs(i,x);
            dp_link(x,i);
        }
    }
    return;
}
void dfs(int x,int fa)
{
    ans[x]=dp[x];
    for(auto &i:G[x])
    {
        if(i!=fa)
        {
            change_root(x,i);
            dfs(i,x);
            change_root(i,x);
        }
    }
    return;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
    {
        scanf("%d",&val[i]);
    }
    for(int i=1;i<n;++i)
    {
        scanf("%d %d",&u,&v);
        G[u].push_back(v);
        G[v].push_back(u);
    }
    dp_dfs(1,-1);
    dfs(1,-1);
    for(int i=1;i<=n;++i)
    {
        printf("%d%c",ans[i],i==n?'\n':' ');
    }
    return 0;
}

总结 已经是打星参赛div3 我对自己的要求是至少出5题 - - 实力有待提高
ABCD挺水的 E也是 F类型做的少

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值