首页 > 其他分享 >ARC149

ARC149

时间:2023-08-04 23:12:49浏览次数:34  
标签:dep int fa MAXN freopen ARC149 Pi

ARC149

A

直接记录\(1111..\)然后\(check\)一下即可

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
int n;
int m;
int Mtl[MAXN];
signed main()
{
    // freopen("date.in","r",stdin);
    // freopen("date.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        Mtl[i]=((long long)Mtl[i-1]*10+1)%m;
    }
    for(int len=n;len>=1;len--)
    {
        for(int x=9;x>=1;x--)
        {
            
            if(((long long)Mtl[len]*x)%m==0)
            {
                for(int i=1;i<=len;i++)
                {
                    printf("%d",x);
                }
                return 0;
            }
        }
    }
    
    printf("-1");
}

B

捆绑着任意排序

我猜最大值是\(A\)排序\(B\)乱序/\(B\)排序\(A\)乱序

证明的话考虑调整法,如果\(A\)有一个数不在\(LIS\)里就把它插进去,这样一定不劣

#include<bits/stdc++.h>
using namespace std;
const int MAXN=3e5+5;
struct node{
    int A,B;
}a[MAXN];
bool cmp(node x,node y)
{
    return x.A<y.A;
}
bool kmp(node x,node y)
{
    return x.B<y.B;
}
int n;
int Bit[MAXN];
int lowbit(int x)
{
    return x&(-x);
}
void update(int k,int x)
{
    for(int i=k;i<=n;i+=lowbit(i))
    {
        Bit[i]=max(Bit[i],x);
    }
}
int Q(int k)
{
    int res=0;
    for(int i=k;i>=1;i-=lowbit(i))
    {
        res=max(res,Bit[i]);
    }
    return res;
}
signed main()
{
    // freopen("date.in","r",stdin);
    // freopen("date.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i].A);
    }
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i].B);
    }

    sort(a+1,a+1+n,cmp);
    int Res=0;
    for(int i=1;i<=n;i++)
    {
        int kp=Q(a[i].B)+1;
        Res=max(Res,kp+n);
        update(a[i].B,kp);
    }
    memset(Bit,0,sizeof(Bit));
    sort(a+1,a+1+n,kmp);
    for(int i=1;i<=n;i++)
    {
        int kp=Q(a[i].A)+1;
        Res=max(Res,kp+n);
        update(a[i].A,kp);
    }
    printf("%d\n",Res);
}

C

偶数前半部分一起,奇数放后半部分

交接处偶数满足\(\bmod 3=2\),奇数满足\(\bmod 3=1\)

这样\(n\ge 6\)可以满足

剩下的特判即可

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+5;
int n;
int vis[MAXN];
bool Ck(int x)
{
    for(int i=2;i*i<=x;i++)
    {
        if(x%i==0)
        {
            return 1;
        }
    }
    return 0;
}
signed main()
{
    // freopen("date.in","r",stdin);
    // freopen("date.out","w",stdout);
    scanf("%d",&n);
    if(n==3)
    {
        printf("5 3 1\n"); 
        printf("9 7 8\n");
        printf("6 2 4\n");
        return 0;
    }
    vector<int>Odd;
    vector<int>Even;
    vector<int>odd;
    vector<int>even;
    for(int i=1;i<=n*n;i++)
    {
        if(i&1)
        {
            if(i%3==1)
            {
                Odd.push_back(i);
            }
        }
        else
        {
            if(i%3==2)
            {
                Even.push_back(i);
            }
        }
    }
    int Mt=min(Even.size(),Odd.size());
    Mt=min(Mt,n);
    for(int i=0;i<Mt;i++)
    {
        vis[Odd[i]]=1;
    }
    for(int i=0;i<Mt;i++)
    {
        vis[Even[i]]=1;
    }
    while(Even.size()>Mt)
    {
        Even.pop_back();
    }
    while(Odd.size()>Mt)
    {
        Odd.pop_back();
    }
    reverse(Odd.begin(),Odd.end());
    if(Mt!=n)
    {
        //cerr<<"fuck"<<endl;
        for(int i=1;i<=n*n;i+=2)
        {
            for(int j=2;j<=n*n;j+=2)
            {
                if(Odd.size()==n)
                {
                    break;
                }
                if(vis[i])
                {
                    continue;
                }
                if(vis[j])
                {
                    continue;
                }
                if(Ck(i+j))
                {
                    Odd.push_back(i);
                    vis[i]=1;
                    Even.push_back(j);
                    vis[j]=1;
                }
            }
        }
        //cerr<<"fuck"<<endl;
    }
    for(int i=1;i<=n*n;i++)
    {
        if(i&1)
        {
            if(vis[i])
            {
                continue;
            }
            odd.push_back(i);
        }
        else
        {
            if(vis[i])
            {
                continue;
            }
            even.push_back(i);
        }
    }
    
    
    if(n&1)
    {
        for(int i=1;i<=n/2;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(even.empty())
                {
                    break;
                }
                printf("%d ",even.back());
                even.pop_back();

            }
            if(even.empty())
            {
                for(int j=n/2+1;j<=n;j++)
                {
                    printf("%d ",Even[j-n/2-1]);
                }
            }
            printf("\n");
        }
        for(int i=1;i<=n/2;i++)
        {
            printf("%d ",Even[i+n/2]);
        }

        for(int i=n/2+1;i<=n;i++)
        {
            printf("%d ",Odd[i-n/2-1]);
        }
        printf("\n");
        for(int i=1;i<=n/2;i++)
        {
            
            for(int j=1;j<=n;j++)
            {
                if(i==1&&j<=(n/2))
                {
                    printf("%d ",Odd[j+n/2]);
                }
                else
                {
                    printf("%d ",odd.back());
                    odd.pop_back();
                }
                
            }
            printf("\n");
        }
    }
    
    else
    {
            //cerr<<Odd.size()<<' '<<Even.size()<<endl;
        for(int i=1;i<n/2;i++)
        {
            for(int j=1;j<=n;j++)
            {
                printf("%d ",even.back());
                even.pop_back();
            }
            printf("\n");
        }
        for(int i=0;i<n;i++)
        {
            printf("%d ",Even[i]);
        }
        printf("\n");
        for(int i=0;i<n;i++)
        {
            printf("%d ",Odd[i]);
        }
        printf("\n");
        for(int i=1;i<n/2;i++)
        {
            for(int j=1;j<=n;j++)
            {
                printf("%d ",odd.back());
                odd.pop_back();
            }
            printf("\n");
        }
    }
}

D

DJNB!!

考虑这个过程\([-D_i,D_i]\)这个区间的数相当于是直接交换

\([-\infin,-D_i],[D_i,\infin]\)平移一下

这样处理很麻烦

考虑\([-D_i,0),(0,D_i]\)是对称的,值也是相反数关系,我们可以直接删除\([-D_i,0)\)用带权并查集维护

这样我们就可以直接平移原点了,删除原点左边/右边的数并合并即可

// LUOGU_RID: 119069522
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e6+5;
const int MAXM=2e6+5;
int m;
int n;
int X[MAXN];
int D[MAXN];
int L[MAXM];
int fa[MAXM];
int dep[MAXM];
int find(int x)
{
    if(fa[x]==x)
    {
        return fa[x];
    }
    int s=fa[x];
    fa[x]=find(fa[x]);
    dep[x]=dep[s]^dep[x];
    return fa[x];
}
void unionn(int i,int j)
{
    int ex=find(i);
    int ey=find(j);
    fa[ex]=ey;
    dep[ex]=(dep[j]^dep[i]^1);
}
pair<int,int>Ans[MAXM];
signed main()
{
    // freopen("date.in","r",stdin);
    // freopen("date.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&X[i]);
        L[X[i]]=i;
        Ans[i].first=0;
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&D[i]);
    }
    int Pi=0;
    int l=1;
    int r=1e6;
    for(int i=l;i<=r;i++)
    {
        fa[i]=i;
        dep[i]=0;
    }
    for(int i=1;i<=m;i++)
    {
        if(Pi>r)
        {
            Pi-=D[i];
            if(Pi<=1e6&&Pi>0&&(!Ans[Pi].first))
            {
                Ans[Pi].first=1;
                Ans[Pi].second=i;
            }  
            if(Pi>=l&&Pi<=r)
            {
                if(Pi-l>r-Pi)
                {
                    for(int i=Pi+1;i<=r;i++)
                    {
                        int To=2*Pi-i;
                        unionn(i,To);
                    }
                    r=Pi-1;
                }
                else
                {
                    for(int i=l;i<=Pi-1;i++)
                    {
                        int To=2*Pi-i;
                        unionn(i,To);
                    }
                    l=Pi+1;
                }
            }
        }
        else if(Pi<l)
        {
            Pi+=D[i];
            if(Pi<=1e6&&Pi>0&&(!Ans[Pi].first))
            {
                Ans[Pi].first=1;
                Ans[Pi].second=i;
            }  
            if(Pi>=l&&Pi<=r)
            {
                if(Pi-l>r-Pi)
                {
                    for(int i=Pi+1;i<=r;i++)
                    {
                        int To=2*Pi-i;
                        unionn(i,To);
                    }
                    r=Pi-1;
                }
                else
                {
                    for(int i=l;i<=Pi-1;i++)
                    {
                        int To=2*Pi-i;
                        unionn(i,To);
                    }
                    l=Pi+1;
                }
            }

        }
        //printf("%d %d??\n",)
    }
    for(int i=1;i<=n;i++)
    {
        //printf("%d %d\n",X[i],find(X[i]));
        if(Ans[find(X[i])].first)
        {
            printf("Yes %d\n",Ans[find(X[i])].second);
        }////
        else
        {
            int Gk=find(X[i])-Pi;
            // if(i==n)
            // {
            //     printf("%d????\n",dep[X[i]]);
            // }
            if(dep[X[i]])
            {
                Gk*=-1;
            }
            printf("No %d\n",Gk);
        }
    }
}

标签:dep,int,fa,MAXN,freopen,ARC149,Pi
From: https://www.cnblogs.com/kid-magic/p/17607263.html

相关文章

  • AT_arc149_a 题解
    洛谷链接&Atcoder链接本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读。题目简述求满足以下条件的小于\(10^n\)数最大是多少?每一位数字均相同;是\(m\)的倍数。数据范围:\(1\len\le10^5\),\(1\lem\le10^9\)。思路首先每位数字都相同很好满足,仅需......
  • ARC149(A~E)
    Tasks-AtCoderRegularContest149又是114514年前做的题,现在来写屯了好多,清一下库存A-RepdigitNumber(atcoder.jp)直接暴力枚举所有每一位都为\(x\)的数,然后数位从\(1\)到\(n\),若当前枚举到了\(i\),设\(i-1\%M\)为\(now\),则\(now=(now*10+x)\%M\),若\(now\)为\(0\),则\(......
  • ARC149E Sliding Window Sort(组合)
    ARC149ESlidingWindowSort给定\(M,K\)和\(N\)排列\(B\)。问对\(i=0\toK-1\)依次执行对\(j=0\toM-1,A_{(i+j)\bmodN}\)这段循环区间排序,最......
  • ARC149D Simultaneous Sugoroku(并查集)
    ARC149DSimultaneousSugoroku有\(N\)个数\(X_i\)和\(M\)个数\(D_i\),对每个\(X_i\)询问依次对\(j=1\ton\)执行:如果\(X_i>0\)就\(-D_j\),如果\(X_i<......
  • solution-arc149(ABC)
    A就是枚举,先枚举是哪个数再枚举位数。把这种题放arcA感觉挺没意思。#include<cstdio>usingnamespacestd;intansx,ansy;voidcheckmax(inti,intj){if(......