2018浙江省赛题解

A 签到

#include<bits/stdc++.h>
using namespace std;
int a[123456];
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n;
        scanf("%d",&n);
        int f=0;
        int t=-1;
        int z=0;
        int maxn=-1;
        for(int i=0;i<=n-1;i++){
            scanf("%d",&a[i]);
            if(a[i]>maxn){
                maxn=a[i];
                z=i;
            }
        }int i;
        if(z==0||z==n-1){puts("No");continue;}
        for(i=0;i<z;i++)if(a[i+1]<=a[i])f=1;
        for(i=z;i<n-1;i++)if(a[i]<=a[i+1])f=1;
        if(!f)puts("Yes");
        else puts("No");
    }
}
View Code

B签到

#include<bits/stdc++.h>
using namespace std;
int a[123456];
int b[123456];
int c[2000000];
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        memset(c,0,sizeof c);
       int n;scanf("%d",&n);
       for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
       }
        for(int i=0;i<n;i++){
        scanf("%d",&b[i]);
       }
       for(int i=0;i<n;i++){
        int k=b[i]-a[i];
        c[k+200000]++;
       }
       int maxn=-1;
       for(int i=0;i<400001;i++){
        if(c[i]>maxn)maxn=c[i];
       }
       printf("%d\n",maxn);
    }
}
View Code

C 组合数

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
ll c[100][10];
ll gcd(ll a,ll b){
    return b?gcd(b,a%b):a;
}
int num[N];
void init(){
    for(int i=0;i<=50;i++){
        c[i][0]=1;
        for(int j=1;j<=i&&j<=4;j++)
            c[i][j]=c[i-1][j]+c[i-1][j-1];
    }
}
int get(string s){
    if(s.size()==2){
        return 10;
    }
    if(s[0]=='A')
        return 1;
    if(s[0]=='J')
        return 11;
    if(s[0]=='Q')
        return 12;
    return (s[0]-'0');
}
int main(){
    int t;
    cin>>t;
    int m=48;
    init();
    while(t--){
        int n;
        cin>>n;
        int i;
        m=48;
        for(i=1;i<=12;i++){
            num[i]=0;
        }
        for(i=1;i<=n;i++){
            string s;
            cin>>s;
            int x=get(s);
            num[x]++;
        }
        for(i=1;i<=12;i++){
            m-=num[i];
        }
        int n1=4-num[1];
        for(i=1;i<=12;i++){
            int x=4-num[i];
            if(i==1){
                cout<<1<<" ";
                continue;
            }
            else if(n1==0){
                if(i==12){
                    if(x==0){
                        cout<<1<<endl;
                    }
                    else{
                        cout<<0<<endl;
                    }
                    continue;
                }
                else{
                    if(x==0){
                        cout<<1<<" ";
                    }
                    else{
                        cout<<0<<" ";
                    }
                    continue;
                }
            }
            ll a=c[m][n1]*c[m-n1][x];
            ll tmp=0;
            for(ll j=x+n1;j<=m;j++){
                tmp+=c[j-1][n1-1]*c[j-n1][x];
            }
            ld=gcd(a,tmp);
            a/=d;
            tmp/=d;
            if(i==12){
                if(a==tmp)
                cout<<1<<endl;
                else
                cout<<tmp<<"/"<<a<<endl;
            }
            else{
                if(tmp==a)
                cout<<1<<" ";
                else
                cout<<tmp<<"/"<<a<<" ";
            }
        }
    }
    return 0;
}
View Code

D dp设计状态为第i个移到第j个以后,这样可以降维

#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define LL long long
using namespace std;
char s[1005];
int a[1005];
LL dp[1005][1005];
LL k[1005];
LL res[1005][1005];

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n;
        scanf("%d",&n);
        getchar();
        for(int i=1;i<=n;i++)
            scanf("%c",&s[i]);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        memset(dp,0,sizeof(dp));
        memset(k,0,sizeof(k));
        for(int i=1;i<=n;i++)
        {
            if(s[i]==')')
                continue;
            for(int j=i+1;j<=n;j++)
            {
                if(s[j]==')')
                    dp[i][j]=dp[i][j-1]+(a[i]*a[j]);
                else
                    dp[i][j]=dp[i][j-1];
            }
        }
        LL ans=0;
        for(int i=1;i<=n;i++)
        {
            LL maxx=0;
            for(int j=1;j<=n;j++)
            {
                maxx=max(dp[i-1][j],maxx);
                dp[i][j]+=maxx;
            }
        }
        for(int i=1;i<=n;i++)
        {
            ans=max(dp[n][i],ans);
        }
        printf("%lld\n",ans);
    }
    return 0;
}
View Code

E 差分约束系统,找到所有不等关系后跑一遍最短路就是答案

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int N=1e6+10;
const int inf=0x3f3f3f3f;
int h[N],ne[N],e[N],w[N],idx;
int n,f[N],l[N],r[N];
int last[N];
int st[N];
ll dis[N];
void add(int a,int b,int c){
    e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}
void spfa(){
    queue<int> q;
    q.push(n+1);
    dis[n+1]=0;
    for(int i=1;i<=n+1;i++)
        st[i]=0;
    st[n+1]=1;
    while(q.size()){
        auto t=q.front();
        q.pop();
        st[t]=0;
        for(int i=h[t];i!=-1;i=ne[i]){
            int j=e[i];
            if(dis[j]>dis[t]+w[i]){
                dis[j]=dis[t]+w[i];
                if(!st[j]){
                    q.push(j);
                    st[j]=1;
                }
            }
        }
    }
    for(int i=1;i<n;i++)
        cout<<dis[i]<<" ";
    cout<<dis[n]<<endl;
}
int main(){
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--){
        cin>>n;
        int i;
        idx=0;
        for(i=0;i<=n+1;i++){
            h[i]=-1;
            last[i]=0;
            dis[i]=1e18;
        }
        for(i=1;i<=n;i++){
            cin>>f[i];
        }
        for(i=1;i<=n;i++){
            cin>>l[i]>>r[i];
        }
        for(i=1;i<=n;i++){
            add(i,n+1,-l[i]);
            add(n+1,i,r[i]);
            if(last[f[i]]){
                add(last[f[i]],i,0);
            }
            if(f[i]){
                add(i,last[f[i]-1],-1);
            }
            last[f[i]]=i;
        }
        spfa();
    }
    return 0;
}
View Code

F dp

#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
#include<algorithm>
#include<queue>
#define ull unsigned long long
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int N=5e5+10;
const int mod=1e9;
int sum[N];
int f[31][N];
int a[N];
int p[N];
int cnt[N];
int n,m;
void init(){
    int i,j;
    for(i=1;i<=30;i++){
        f[i][0]=0;
        for(j=1;j<=n;j++){
            f[i][j]=(f[i][j-1]+a[j]/i)%mod;
        }
    }
}
int main(){
    int t;
    cin>>t;
    while(t--){
        cin>>n>>m;
        int i;
        for(i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        for(i=1;i<=m;i++){
            scanf("%d",&p[i]);
        }
        sort(a+1,a+1+n);
        init();
        ll sum=0;
        for(i=1;i<=m;i++){
            ll tmp=1;
            int idx=0;
            ll ans=0;
            while(tmp*p[i]<=a[n]){
                tmp*=p[i];
                int l=0,r=n;
                while(l<r){
                    int mid=l+r+1>>1;
                    if(a[mid]<=tmp)
                        l=mid;
                    else
                        r=mid-1;
                }
                cnt[++idx]=r;
            }
            if(cnt[idx]<n){
                cnt[++idx]=n;
            }
            for(int j=1;j<=idx;j++){
                ans=(ans+f[j][cnt[j]]-f[j][cnt[j-1]]+mod)%mod;
            }
            sum=(sum+ans*i)%mod;
        }
        cout<<(sum+mod)%mod<<endl;
    }
}
View Code

G 哈希+最小循环节

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
char s[N],t[N];
const int mod1=1e9+7;
const int mod2=1e9+9;
const int base=131;
map<ll,int> m1;
int n,m,q;
int nxt[N];
ll p1[N],p2[N];
struct node{
    ll l,r;
}h[N];
int pos[N];
void Hash(){
    p1[0]=1,p2[0]=1;
    for(int i=1;i<=n;i++){
        p1[i]=p1[i-1]*base%mod1;
        p2[i]=p2[i-1]*base%mod2;
        h[i].l=(h[i-1].l*base%mod1+(s[i]-'0'))%mod1;
        h[i].r=(h[i-1].r*base%mod2+(s[i]-'0'))%mod2;
    }
}
ll get(int l,int r){
    ll h1=(h[r].l-(h[l-1].l*p1[r-l+1]%mod1)+mod1)%mod1;
    ll h2=(h[r].r-(h[l-1].r*p2[r-l+1]%mod2)+mod2)%mod2;
    return h1+h2;
}
int main(){
    int T;
    cin>>T;
    while(T--){
        int i;
        scanf("%d%d%d",&n,&m,&q);
        scanf("%s",s+1);
        scanf("%s",t+1);
        m1.clear();
        nxt[0]=-1;
        int cnt=0;
        for(int i=1;i<=m;i++){
            int p=nxt[i-1];
            while(p>=0&&t[p+1]!=t[i]) p=nxt[p];
            nxt[i]=p+1;
        }
        int len=m-nxt[m];
        if(nxt[m]*2<m) len=m;
        Hash();
        node x={0,0};
        for(i=1;i<=m;i++){
            ll h1=(x.l*base%mod1+(t[i]-'0')+mod1)%mod1;
            ll h2=(x.r*base%mod2+(t[i]-'0')+mod2)%mod2;
            x={h1,h2};
        }
        for(i=1;i<=m;i++){
            ll h1=(x.l*base%mod1+(t[i]-'0')-(ll)(t[i]-'0')*p1[m]%mod1+mod1)%mod1;
            ll h2=(x.r*base%mod2+(t[i]-'0')-(ll)(t[i]-'0')*p2[m]%mod2+mod2)%mod2;
            x={h1,h2};
            if(!m1[h1+h2]){
                m1[h1+h2]=++cnt;
                pos[cnt]=i;
            }
        }
        while(q--){
            ll x,y;
            scanf("%lld%lld",&x,&y);
            auto tmp=get(x,x+m-1);
            if(!m1[tmp]){
                printf("0\n");
            }
            else{
                int d=m1[tmp];
                printf("%lld\n",(ll)(y-pos[d])/len+1);
            }
        }
    }
    return 0;
}
View Code

I 赵文泽牛逼

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod =1e9;
ll a[512345];
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n;
        scanf("%d",&n);
        if(n==2){
            printf("0 2 1 3\n");
            continue;
        }
        if(n==3)
        {
            printf("1 4 2 5 3 6\n");
            continue;
        }
        for(int i=0;i<n-1;i++)
            printf("%d %d ",i,i+n);
        printf("%d %d\n",3*n-4,4*n-5);
    }
}
View Code

J 贪心

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int vis[123456];
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
            memset(vis,0,sizeof vis);
       ll n;
       scanf("%lld",&n);
       string s;
       cin>>s;
       if(((1ll+n)*n/2)%2!=0){
        puts("-1");
        continue;
       }
       ll t=(1ll+n)*n/2/2;
       for(int i=n;i>=1;i--){
        if(i<=t){vis[i]=1;t-=i;}
       }
       for(int i=0;i<(int)s.size();i++){
        if(s[i]=='0'){
            if(vis[i+1]){
                printf("1");
            }else{
                printf("2");
            }
        }else{
            if(vis[i+1]){
                printf("3");
            }else printf("4");
        }
       }
    printf("\n");
    }
}
View Code

K 简单模拟

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int N=4e5+10;
int g[N];
int main(){
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--){

        int n,m;
    cin>>n>>m;
    int i;
    int flag=0;
    for(i=1;i<=n;i++){
        char c;
        int x;
        cin>>c;
        if(c=='W'){
            g[i]=3*m+1;
            flag=i;
        }
        else{
            cin>>x;
            if(c=='C'){
                g[i]=x;
            }
            else if(c=='B'){
                g[i]=m+x;
            }
            else{
                g[i]=2*m+x;
            }
        }
    }
    g[n+1]=3*m+1;
    if(!flag){
            if(g[1]>g[2])cout<<1<<endl;
    else 
        cout<<3*m-n+1<<endl;
    }
    else{
        if(flag==1){
            cout<<g[2]-1<<endl;
        }
        else if(flag==2){
            cout<<g[3]-g[1]<<endl;
        }
        else{
            if(g[1]>g[2])cout<<1<<endl;
            else cout<<g[flag+1]-g[flag-1]-1<<endl;
        }
    }
    }

}
View Code

L 签到

#include<iostream>
#include<string>
#include<algorithm>
#define LL long long
using namespace std;

struct word
{
    string s;
    LL f;
}w[105];

bool cmp(word a,word b)
{
    if(a.f==b.f)
        return a.s<b.s;
    return a.f>b.f;
}

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n,m;
        cin>>n>>m;
        for(int i=1;i<=n;i++)
            cin>>w[i].s>>w[i].f;
        sort(w+1,w+n+1,cmp);
        LL ans=0;
        for(int i=1;i<=m;i++)
        {
            ans+=((m-i+1)*w[i].f);
        }
        cout<<ans;
        for(int i=1;i<=m;i++)
            cout<<" "<<w[i].s;
        cout<<endl;
    }
    return 0;
}
View Code

M 签到

#include<bits/stdc++.h>
using namespace std;
int a[123456];
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n;int x;
        scanf("%d%d",&n,&x);
        int f=0;
        for(int i=0;i<n;i++){
            int y;scanf("%d",&y);
            if((x+y) % 7==0)f=1;
        }
        if(f)puts("Yes");
        else puts("No");
    }
}
View Code

 

posted @ 2020-10-01 17:04  朝暮不思  阅读(200)  评论(0编辑  收藏  举报