2019牛客暑期多校赛(第八场)

G题:https://ac.nowcoder.com/acm/contest/888/G

签到题目。

题意:给一串字符串如果有三个连续相同的字母就消掉,然后右边字符串补齐,求最简的字符串需要操作几次。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int dir[8][2]={{1,0},{0,1},{1,1},{1,-1},{-1,1},{-1,-1},{0,-1},{-1,0}};
#define pi acos(-1)
#define ls rt<<1
#define rs rt<<1|1
#define me0(s) memset(s,0,sizeof(s))
#define me1(s) memset(s,1,sizeof(s))
#define mef(s) memset(s,-1,sizeof(s))
#define meinf(s) memset(s,inf,sizeof(s))
#define inf 1e18
const int N=1e6+6;
inline int read() {
    char c=getchar(); int x=0, f=1;
    while(c<'0'|c>'9') {if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
    return x*f;
}
ll exgcd(ll a,ll b){
    if(b==0) return a;
    exgcd(b,a%b);
}
ll q_pow(ll a,ll b,ll mod){
    ll anss=1;
    while(b){
        if(b&1) anss=anss*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return anss;
}
ll q_mul(ll a,ll b,ll mod){
    ll anss=0;
    while(b){
        if(b&1) anss=(anss+a)%mod;
        a=(a+a)%mod;
        b>>=1;
    }
    return anss;
}
stack<char> ss;
int main(int argc, char * argv[]) 
{
    ios::sync_with_stdio(false);
    string s;
    int ans=0;
    cin>>s;
    ss.push(s[0]),ss.push(s[1]);
    for(int i=2;i<s.size();i++){
        if(!ss.empty()&&s[i]==ss.top()){
            ss.pop();
            if(!ss.empty()&&s[i]==ss.top()){
                ans++;
                ss.pop();
            }
            else{
                ss.push(s[i]);
                ss.push(s[i]);
            }
        }
        else ss.push(s[i]);
    }
    cout<<ans<<endl;
    return 0;
}

 

B题:https://ac.nowcoder.com/acm/contest/888/B

题意:给定一个长度为n的数组,问所有区间中出现数字种类的和是多少。

题解:期望线性

把每种数字对答案的贡献分开计算,枚举每个数字,求原序列有多少个子区间包含至少一个该数字,累加答案。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int dir[8][2]={{1,0},{0,1},{1,1},{1,-1},{-1,1},{-1,-1},{0,-1},{-1,0}};
#define pi acos(-1)
#define ls rt<<1
#define rs rt<<1|1
#define me0(s) memset(s,0,sizeof(s))
#define me1(s) memset(s,1,sizeof(s))
#define mef(s) memset(s,-1,sizeof(s))
#define meinf(s) memset(s,inf,sizeof(s))
#define inf 1e18
const int N=1e6+6;
inline int read() {
    char c=getchar(); int x=0, f=1;
    while(c<'0'|c>'9') {if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
    return x*f;
}
ll exgcd(ll a,ll b){
    if(b==0) return a;
    exgcd(b,a%b);
}
ll q_pow(ll a,ll b,ll mod){
    ll anss=1;
    while(b){
        if(b&1) anss=anss*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return anss;
}
ll q_mul(ll a,ll b,ll mod){
    ll anss=0;
    while(b){
        if(b&1) anss=(anss+a)%mod;
        a=(a+a)%mod;
        b>>=1;
    }
    return anss;
}
ll a[N],v[N];
int main(int argc, char * argv[]) 
{
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
    for(ll i=1;i<=n;i++){
        cin>>a[i];
    }
    me0(v);
    ll ans=0;
    for(ll i=1;i<=n;i++){
        if(v[a[i]]==0){
            ans=ans+n+(i-1)*(n-i);
        }
        else{
            ans=ans+(i-v[a[i]])*(n-i)+(i-v[a[i]]-1)+1;
        }
        v[a[i]]=i;
    }
    cout<<ans<<endl;
    return 0;
}

 对于核心代码的解释:

c题:https://ac.nowcoder.com/acm/contest/888/C

题意:构造矩阵,可以在上一个矩阵的基础上继续构造,构造出的1,-1矩阵为和为0。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int dir[8][2]={{1,0},{0,1},{1,1},{1,-1},{-1,1},{-1,-1},{0,-1},{-1,0}};
#define pi acos(-1)
#define ls rt<<1
#define rs rt<<1|1
#define me0(s) memset(s,0,sizeof(s))
#define me1(s) memset(s,1,sizeof(s))
#define mef(s) memset(s,-1,sizeof(s))
#define meinf(s) memset(s,inf,sizeof(s))
#define inf 1e18
const int N=1e6+6;
inline int read() {
    char c=getchar(); int x=0, f=1;
    while(c<'0'|c>'9') {if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
    return x*f;
}
ll exgcd(ll a,ll b){
    if(b==0) return a;
    exgcd(b,a%b);
}
ll q_pow(ll a,ll b){
    ll anss=1;
    while(b){
        if(b&1) anss=anss*a;
        a=a*a;
        b>>=1;
    }
    return anss;
}
ll q_mul(ll a,ll b,ll mod){
    ll anss=0;
    while(b){
        if(b&1) anss=(anss+a)%mod;
        a=(a+a)%mod;
        b>>=1;
    }
    return anss;
}
int ans[10000][10000];
int main(int argc, char * argv[]) 
{
    ios::sync_with_stdio(false);
    int k;
    cin>>k;
    int n=1;
    while(n<=k){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(i==1&&j==1){
                    ans[i][j]=1;
                }
                else if(i>=1&&i<=n/2&&j>n/2&&j<=n){
                    ans[i][j]=ans[i][j%(n/2)==0?n/2:j%(n/2)];
                }
                else if(i>n/2&&j>n/2&&i<=n&&j<=n){
                    ans[i][j]=-ans[i][j%(n/2)==0?n/2:j%(n/2)];
                }
                else if(i>n/2&&i<=n&&j>=1&&j<=n/2){
                    ans[i][j]=ans[i%(n/2)==0?n/2:i%(n/2)][j];
                }
            }
        }
        n*=2;
    }
    for(int i=1;i<=k;i++){
        for(int j=1;j<=k;j++){
            j==1?cout<<ans[i][j]:cout<<' '<<ans[i][j];
        }
        cout<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/wushengyang/p/11332240.html