0
点赞
收藏
分享

微信扫一扫

Namomo Camp 2022 week 2 部分

_阿瑶 2022-03-11 阅读 56
c++

还有usaco的那题没写来着

Namomo Camp 2022 Day 2
A:https://codeforces.com/contest/1635/problem/D
B:https://codeforces.com/gym/103069/problem/A
C:https://codeforces.com/gym/103447/problem/G
D:https://codeforces.com/problemset/problem/1628/D1
E:http://www.usaco.org/index.php?page=viewproblem2&cpid=1210
F:https://www.luogu.com.cn/problem/P3188
 

A Codeforces Round #772 (Div. 2) D. Infinite Set

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int n,p;
const int mod=1e9+7;
vector<int> mp;
int a[maxn],f[maxn];
bool check(int x)
{
    while(x)
    {
        if(x&1)x>>=1;
        else if(!(x>>1&1))x>>=2;
        else return true;
        if(binary_search(mp.begin(),mp.end(),x))return false;
    }
    return true;
}
int main()
{
    scanf("%d%d",&n,&p);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++)if(check(a[i]))mp.push_back(a[i]);
    for(auto v:mp)
    {
        f[(int)log2(v)]++;
    }
    int res=0;
    for(int i=0;i<p;i++)
    {
        if(i>0)f[i]=(f[i]+f[i-1])%mod;
        if(i>1)f[i]=(f[i]+f[i-2])%mod;
        res=(res+f[i])%mod;
    }
    printf("%d\n",res);
}

B Namomo Subsequence

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=998244353;
ll dp[5][65][65];//字符集62
int get(char x)
{
    if(x>='a'&&x<='z')return x-'a';
    else if(x>='A'&&x<='Z') return 26+x-'A';
    else  return 52+x-'0';
}
ll cnt[65];
ll sum,sum2;
void get(ll &a,ll b){a=(a+b)%mod;}
void add(int x)
{
    sum++;
    cnt[x]++;
    sum2+=2*cnt[x]-1;
}
void del(int x)
{
    sum--;
    sum2-=2*cnt[x]-1;
    cnt[x]--;
}
string s;
ll query(int x,int y)
{
    return ((sum-cnt[x]-cnt[y])*(sum-cnt[x]-cnt[y])-(sum2-cnt[x]*cnt[x]-cnt[y]*cnt[y]))/2%mod;
}
int main()
{
    cin>>s;
    for(auto v:s) add(get(v));
    ll res=0;
    for(int i=0;i<62;i++)
    for(int j=0;j<62;j++)
    if(i!=j)dp[0][i][j]=1;
    for(int i=s.size()-1;~i;i--)
    {
        int t=get(s[i]);
        del(t);
        for(int j=0;j<62;j++)
        {
            if(j==t)continue;
            get(dp[1][j][t],dp[0][j][t]);
            get(dp[2][t][j],dp[1][t][j]);
            get(dp[3][j][t],dp[2][j][t]);
            res=(res+dp[3][t][j]*query(j,t))%mod;
        }
    }
    printf("%lld\n",res);
}

C G. Damaged Bicycle

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const int M=(1<<18),inf=0x3f3f3f3f;
int dist[maxn];
int d[22][22],a[22],p[22];
typedef pair<int,int> pii;
vector<pii> e[maxn];
priority_queue<pii,vector<pii>,greater<pii>> heap;
int v1,v2,n,m,k;
bool st[maxn];
double dp[M][22];
void dijkstra(int root)
{
   for(int i=1;i<=n;i++)dist[i]=inf,st[i]=false;
   dist[root]=0;
   heap.push({dist[root],root});
   while(heap.size())
   {
       auto u=heap.top();heap.pop();
       if(st[u.y])continue;
       st[u.y]=true;
       for(auto v:e[u.y])
       {
           if(dist[u.y]+v.y>=dist[v.x])continue;
           dist[v.x]=dist[u.y]+v.y;
           heap.push({dist[v.x],v.x});
       }
   }
}
int main()
{
    scanf("%d%d",&v1,&v2);
    scanf("%d%d",&n,&m); 
    int u,v,w;
    for(int i=0;i<m;i++)
    {
        scanf("%d%d%d",&u,&v,&w);
        e[u].push_back({v,w});
        e[v].push_back({u,w});
    }
    scanf("%d",&k);
    for(int i=0;i<k;i++)
    {
        scanf("%d%d",&a[i],&p[i]);
    }
    a[k]=1;a[k+1]=n;
    for(int i=0;i<=k+1;i++)
    {
        dijkstra(a[i]);
        for(int j=0;j<=k+1;j++)
        {
            d[i][j]=dist[a[j]];
        }
    }
    if(d[k][k+1]==inf)
    {
        printf("-1");return 0;
    }
    for(int S=(1<<k)-1;S>=0;S--)
    for(int i=0;i<k;i++)
    if(S&1<<i)
    {
        double pbad=0.01*p[i];
        double tgood=1.0*d[i][k+1]/v2;
        double tbad=1.0*d[i][k+1]/v1;
        for(int j=0;j<k;j++)
        if(!(S&1<<j))
        {
            tbad=min(tbad,1.0*d[i][j]/v1+dp[S|(1<<j)][j]);
        }
        dp[S][i]=pbad*tbad+(1-pbad)*tgood;
    }
    double res=1.0*d[k][k+1]/v1;
    for(int i=0;i<k;i++)
    res=min(res,1.0*d[k][i]/v1+dp[1<<i][i]);
    printf("%lf\n",res);
}

DD1. Game on Sum (Easy Version)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int p=1e9+7;
ll qmi(ll a,int k)
{
    ll res=1;while(k){if(k&1)res=res*a%p;a=a*a%p;k>>=1;}return res;
}
const int maxn=1e6+10;
ll inv[maxn],fac[maxn];
void init()
{
    inv[1]=1,inv[0]=1;
    for(int i=2;i<maxn;i++)inv[i]=((-(ll)(p/i)*inv[p%i]%p+p)%p);
    for(int i=1;i<maxn;i++)inv[i]=inv[i]*inv[i-1]%p;
    fac[0]=1;
    for(int i=1;i<maxn;i++)fac[i]=fac[i-1]*i%p;
}
ll inv2;
ll C(int a,int b)
{
    ll res=(fac[a]*inv[b])%p*inv[a-b]%p;
    return res;
}
int main()
{
    inv2=qmi(2,p-2);
    int T;
    scanf("%d",&T);
    init();
    while(T--)
    {
        int n,m,k;
        scanf("%d%d%d",&n,&m,&k);
        ll res=0;
        if(n==m)res=n;
        else if(m==0)res=0;
        else
        {
            for(int i=1;i<=m;i++)
            res=(res+C(n-i-1,m-i)*qmi(inv2,n-i)%p*i%p)%p;
        }
        printf("%lld\n",res*k%p);
    }
}

F  https://www.luogu.com.cn/problem/P3188

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int maxn=2e3+10;

int n,W;
typedef pair<int,int> pii;
typedef long long ll;const ll inf=1ll<<60;
vector<pii> it[35];
ll dp[maxn],g[maxn];
int main()
{
    while(scanf("%d%d",&n,&W)&&n!=-1)
    {
        int s=0;
        for(int i=0;i<=30;i++)it[i].clear();
        for(int i=1;i<=n;i++)
        {
            int w,v;
            scanf("%d%d",&w,&v);
            int lv=__builtin_ctz(w);
            w>>=lv;
            it[lv].push_back({w,v});
            s+=w;
        }
        for(int i=1;i<=s;i++)dp[i]=-inf;
        dp[0]=0;
        
        for(int i=30;i>=0;i--)
        {
            int d=(W>>i)&1;
            for(int j=0;j<=s;j++)g[j]=dp[j],dp[j]=-inf;
            for(int j=0;j<=s;j++)
            dp[min(j*2+d,s)]=max(dp[min(j*2+d,s)],g[j]);
            for(int j=s;j>=1;j--)
            dp[j-1]=max(dp[j],dp[j-1]);
            for(auto p:it[i])
            {
                for(int w=p.x;w<=s;w++)
                {
                    dp[w-p.x]=max(dp[w-p.x],dp[w]+p.y);
                }
                
            }
        }
        printf("%lld\n",dp[0]);
        
    }
}
举报

相关推荐

0 条评论