Codeforces Round #786 (Div. 3)


前言

第一次参加div3,不知道这场是不是算简单的,感觉就是暴力


一、A. Number Transformation


是否是因数,是则分解为 d * 1 * m


   #include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pr;
const int inf =0x3f3f3f3f;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define in freopen("in.txt","r",stdin)
#define out freopen("out.txt","w",stdout)
#define ms(x,a) memset(x,a,sizeof(x))
#define ll long long
#define pb push_back
#define pr pair<int,int>
#define debug printf("%d %s\n",__LINE__,__FUNCTION__)
#define rep(i, a, n) for(int i=a; i<n; i++)
#define rg register int//卡常
#define ONLINE_JUDGE
const int mod=1e9+7;
const int maxn=2e6+10;
const int maxe=1e6+5;

int n,m,a[maxn];
int tot;
void solve()
{
    scanf("%d %d",&n,&m);
    if(m%n==0){
        int tmp=m/n;
        printf("1 %d\n",tmp);
    }else{
        printf("0 0\n");
    }
}
int main()
{
    int t=1;
    scanf("%d",&t);
    while(t--){
        solve();
    }
    return 0;
}
  

二、B. Dictionary


题目要求,2位的,aa bb这种的不存在

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pr;
const int inf =0x3f3f3f3f;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define in freopen("in.txt","r",stdin)
#define out freopen("out.txt","w",stdout)
#define ms(x,a) memset(x,a,sizeof(x))
#define ll long long
#define pb push_back
#define pr pair<int,int>
#define debug printf("%d %s\n",__LINE__,__FUNCTION__)
#define rep(i, a, n) for(int i=a; i<n; i++)
#define rg register int//卡常
#define ONLINE_JUDGE
const int mod=1e9+7;
const int maxn=2e6+10;
const int maxe=1e6+5;

int n,m,a[maxn];
int tot;
void solve()
{
    vector<int> ans;
    cin>>n;
    //scanf("%d",&n);
    string s;
    for(int i=1;i<=n;i++){
        cin>>s;
        int t=0;
        for(int j=0;j<s.size();j++){
            t*=26;
            t+=(s[j]-'a');
        }
        t-=(s[0]-'a');
        if(s[1]<s[0]) t++;
        ans.pb(t);
    }
    for(int i=0;i<ans.size();i++) printf("%d\n",ans[i]);
}
int main()
{
    IOS;
    int t=1;
    //scanf("%d",&t);
    while(t--){
        solve();
    }
    return 0;
}

三、C. Infinite Replacement


t里有a可以无穷递归下去,只为一个a例外
其他的就是2的n次幂

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pr;
const int inf =0x3f3f3f3f;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define in freopen("in.txt","r",stdin)
#define out freopen("out.txt","w",stdout)
#define ms(x,a) memset(x,a,sizeof(x))
#define ll long long
#define pb push_back
#define pr pair<int,int>
#define debug printf("%d %s\n",__LINE__,__FUNCTION__)
#define rep(i, a, n) for(int i=a; i<n; i++)
#define rg register int//卡常
#define ONLINE_JUDGE
const int mod=1e9+7;
const int maxn=2e6+10;
const int maxe=1e6+5;

int n,m,a[maxn];
int tot;
char s1[55],s2[55];
void solve()
{
    scanf("%s",s1);
    scanf("%s",s2);
    if(s2[0]=='a' && strlen(s2)==1){
        printf("1\n");return;
    }
    for(int i=0;i<strlen(s2);i++){
        if(s2[i]=='a'){
            printf("-1\n");return;
        }
    }
    ll ans=pow(2,strlen(s1));
    printf("%lld\n",ans);
}
int main()
{
    int t=1;
    scanf("%d",&t);
    while(t--){
        solve();
    }
    return 0;
}

四、D. A-B-C Sort


因为从A末尾取出入B中间,从B中间取出入C尾部
简单的分析一下,发现可以想象成2个栈,两个栈的顶部相对,在栈里面的一定要比现在在栈外面的大,不然取出的时候一定是在栈顶的先到C的尾部,导致不会排序成功

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pr;
const int inf =0x3f3f3f3f;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define in freopen("in.txt","r",stdin)
#define out freopen("out.txt","w",stdout)
#define ms(x,a) memset(x,a,sizeof(x))
#define ll long long
#define pb push_back
#define pr pair<int,int>
#define debug printf("%d %s\n",__LINE__,__FUNCTION__)
#define rep(i, a, n) for(int i=a; i<n; i++)
#define rg register int//卡常
#define ONLINE_JUDGE
const int mod=1e9+7;
const int maxn=2e5+10;
const int maxe=1e6+5;

int n,m,a[maxn];
int tot;
void solve()
{
    scanf("%d",&n);
    stack<int> s1,s2;
    int tmp=0;
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    s1.push(1e9);s2.push(1e9);
    for(int i=n;i>=1;i--){
        if(tmp==0){
            tmp=a[i];
        }else{
            int t=a[i];
            if(tmp>t)swap(tmp,t);
            if(s1.top()>=tmp && s2.top()>=t && s1.top()>=t && s2.top()>=tmp){
                s1.push(tmp);s2.push(t);
            }else{
                printf("NO\n");return;
            }
            tmp=0;
        }
    }
    if(tmp!=0){
        if(tmp<=s1.top() && tmp<=s2.top()){
            printf("YES\n");return;
        }else{
            printf("NO\n");return;
        }
    }
    printf("YES\n");
}
int main()
{
    int t=1;
    scanf("%d",&t);
    while(t--){
        solve();
    }
    return 0;
}

五、E. Breaking the Wall


模拟一下,因为每次操作最多只会影响到3个单位,所以考虑2个之间不会互相影响的作为整个考虑的上界
相隔一个的考虑一下
相邻的考虑一下,代码多考虑了一次(反正复杂度没超,当时也懒得改了)
O(n)

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pr;
const int inf =0x3f3f3f3f;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define in freopen("in.txt","r",stdin)
#define out freopen("out.txt","w",stdout)
#define ms(x,a) memset(x,a,sizeof(x))
#define ll long long
#define pb push_back
#define pr pair<int,int>
#define debug printf("%d %s\n",__LINE__,__FUNCTION__)
#define rep(i, a, n) for(int i=a; i<n; i++)
#define rg register int//卡常
#define ONLINE_JUDGE
const int mod=1e9+7;
const int maxn=2e5+10;
const int maxe=1e6+5;

int n,m,a[maxn];
int tot;
void solve()
{
    scanf("%d",&n);
    int minn1=1e9,minn2=1e9;
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        if(a[i]<minn1) minn2=minn1,minn1=a[i];
        else if(a[i]<minn2) minn2=a[i];
    }
    int bottom=minn1/2+minn2/2;
    if(minn1&1)bottom++;
    if(minn2&1)bottom++;
    if(n==2){
        if(a[1]>a[2])swap(a[1],a[2]);
        int ans=0;
        if(a[1]<=(a[2]+1)/2){
            ans=(a[2]+1)/2;
        }else{
            int x=(2*a[1]-a[2]+1)/3;
            ans=(a[2]-x+1)/2;
            ans+=x;
        }
        printf("%d\n",ans);return;
    }
    for(int i=1;i<=n-2;i++){
        int ans=0;
        int x=a[i],y=a[i+1],z=a[i+2];
        ans=min(x,z)+(max(x,z)-min(x,z)+1)/2;

        if(x>y)swap(x,y);
        int ans1=0;
        if(x<=(y+1)/2){
            ans1=(y+1)/2;
        }else{
            int tmp=(2*x-y+1)/3;
            ans1=(y-tmp+1)/2;
            ans1+=tmp;
        }

        x=a[i+1];y=a[i+2];
        if(x>y)swap(x,y);
        int ans2=0;
        if(x<=(y+1)/2){
            ans2=(y+1)/2;
        }else{
            int tmp=(2*x-y+1)/3;
            ans2=(y-tmp+1)/2;
            ans2+=tmp;
        }
        bottom=min(bottom,min(ans,min(ans1,ans2)));
    }
    printf("%d\n",bottom);
}
int main()
{
    int t=1;
    //scanf("%d",&t);
    while(t--){
        solve();
    }
    return 0;
}

六、F. Desktop Rearrangement


div3的f都这么简单吗…
纯纯的模拟题
当然我这个写法是暴力写法
可以考虑树状数组或者线段树啥的区间查询
但是复杂度没超也能过…
比赛在有限的时间做最多的事情是最优的(逃)

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pr;
const int inf =0x3f3f3f3f;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define in freopen("in.txt","r",stdin)
#define out freopen("out.txt","w",stdout)
#define ms(x,a) memset(x,a,sizeof(x))
#define ll long long
#define pb push_back
#define pr pair<int,int>
#define debug printf("%d %s\n",__LINE__,__FUNCTION__)
#define rep(i, a, n) for(int i=a; i<n; i++)
#define rg register int//卡常
#define ONLINE_JUDGE
const int mod=1e9+7;
const int maxn=1e3+10;
const int maxe=1e6+5;

int n,m,q,a[maxn],mp[maxn][maxn];
int tot;
char s[maxn];
void solve()
{
    scanf("%d %d %d",&n,&m,&q);
    tot=0;
    for(int i=1;i<=n;i++){
        scanf("%s",s);
        int len=strlen(s);
        for(int j=1;j<=m;j++){
            if(s[j-1]=='.') mp[i][j]=0;
            else mp[i][j]=1,a[j]++,tot++;
        }
    }
    int x,y;
    for(int __=1;__<=q;__++){
        scanf("%d %d",&x,&y);
        if(mp[x][y]){
            mp[x][y]=0;a[y]--;tot--;
        }else{
            mp[x][y]=1;a[y]++;tot++;
        }
        int k=tot/n;
        int off=tot-k*n;
        int ans=0;
        for(int i=1;i<=k;i++){
            ans+=n-a[i];
        }
        for(int i=1;i<=off;i++){
            if(mp[i][k+1]==0){
                ans++;
            }
        }
        printf("%d\n",ans);
    }
}
int main()
{
    int t=1;
    //scanf("%d",&t);
    while(t--){
        solve();
    }
    return 0;
}

七、G. Remove Directed Edges


就是每个点都需要删一条入边和一条出边(没有就不删)
考虑枚举的话O(x2)的
那么从本质上来看就是如果这个点有两条以上的入边的话,那么每一个“父节点”都可以到达他
同样的,他有两条以上的出边的话,那么他的每一个“儿子节点”他都能到
而图又是无环图,所以dfs不会有危险
那么顺着这个考虑dp(看到了tag…(逃
考虑每个点为起点可以到达的最大集合
转移方程
if(可以转移) dp[i]=max(dp[i],dp[son]+1);

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pr;
const int inf =0x3f3f3f3f;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define in freopen("in.txt","r",stdin)
#define out freopen("out.txt","w",stdout)
#define ms(x,a) memset(x,a,sizeof(x))
#define ll long long
#define pb push_back
#define pr pair<int,int>
#define debug printf("%d %s\n",__LINE__,__FUNCTION__)
#define rep(i, a, n) for(int i=a; i<n; i++)
#define rg register int//卡常
#define ONLINE_JUDGE
const int mod=1e9+7;
const int maxn=2e5+10;
const int maxe=1e6+5;

int n,m;
vector<int> g[maxn];
int ind[maxn],outd[maxn];
int dp[maxn];
void dfs(int now)
{
    if(dp[now]!=-1) return;
    if(outd[now]>=2){
        for(int i=0;i<g[now].size();i++){
            int v=g[now][i];
            if(ind[v]>=2){
                if(dp[v]==-1){
                    dfs(v);
                }
                dp[now]=max(dp[v]+1,dp[now]);
            }
        }
    }
    dp[now]=max(dp[now],1);
    
}
void solve()
{
    scanf("%d %d",&n,&m);
    int x,y;
    for(int i=1;i<=n;i++){
        ind[i]=outd[i]=0;dp[i]=-1;
    }
    for(int i=1;i<=m;i++){
        scanf("%d %d",&x,&y);
        g[x].pb(y);
        ind[y]++;outd[x]++;
    }
    for(int i=1;i<=n;i++) dfs(i);
    int ans=0;
    for(int i=1;i<=n;i++){
        ans=max(ans,dp[i]);
    }
    printf("%d",ans);
}
int main()
{
    int t=1;
    //scanf("%d",&t);
    while(t--){
        solve();
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值