还有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);
}
}
E
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]);
}
}