2022牛客多校训练第一场
A 区间覆盖,问最后有多少个段没有被覆盖到 n2e5坐标-1e9->1e9
法1:离散化后加差分
法2:将区间左端点排序,然后每次去维护右端点能够够到的最远距离。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+5;
int n;
int X[maxn],R[maxn];
int xs,rs;
int lsh[maxn*3],ls;
int CF[maxn*3];
int gid(int x) {
return lower_bound(lsh+1,lsh+1+ls,x)-lsh;
}
int main() {
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%d%d",&X[i],&R[i]);
lsh[++ls] = X[i]-R[i];
lsh[++ls] = X[i]+R[i];
}
sort(lsh+1,lsh+1+ls);
ls = unique(lsh+1,lsh+1+ls)-lsh-1;
for(int i=1;i<=n;i++) {
CF[gid(X[i]-R[i])]+=1;
CF[gid(X[i]+R[i])]-=1;
}
int ans = 0;
for(int i=1;i<=ls;i++) {
CF[i] += CF[i-1];
if(!CF[i]&&i!=ls) {
ans += lsh[i+1]-lsh[i];
}
}
printf("%d",ans);
}
B:4e5的数字字符串,问多少个子串对A,B,满足itoa(即直接串转数字之后)后B=A+1且AB长度相同
D:旋转一个在圆内固定转点的线段,使得一个圆单向投影到线段的弧长最大,求这个弧长
由于弦长越长 弧长越长,并且我们画画图发现在线段连向中心的时候梯形斜边 也就是弦长是最长的,然后算算角度求弧长即可。
G:给定N长度1e5,问从1-N字典序最大那个
明显答案除了最后一位都是9,若给定N除了最后一位都是9那么就是N,否则为|N-1|个9
#include<bits/stdc++.h>
using namespace std;
char ss[1000005];
int main(){
scanf("%s",&ss[1]);
int n = strlen(ss+1);
bool jj = 1;
if(n==1) {
printf("%s",ss+1);
return 0;
}
for(int i=1;i<n;i++) {
if(ss[i]!='9') {
jj = 0;
}
}
if(jj) printf("%s",ss+1);
else {
for(int i=1;i<n;i++) {
putchar('9');
}
}
return 0;
}
I Chiitoitsu 初始13张手牌相同牌开始最多出现两种,之后摸牌出现7个对子即胡牌,否则按照麻将 最佳策略 摸牌弃牌,问 最优策略下轮数,T1e5
最优策略:如果摸到的牌能成对子 则丢弃单牌 否则弃掉摸到的牌
这样决策之后 手中剩余的单牌 一定是剩下的三张牌都在牌堆里
F[s][r]表示手中剩余s张单牌,牌堆剩余R张牌时,的期望轮数:
if s == 1,F[s][r] = 1 + (r-3)/r * F[1][r-1] , else F[s][r] = 1 + 3*s/r * F[s+1][r-2] + (r-3*s)/r*F[s][r-1]
最终答案就是F[初始S][136-13]
#include<bits/stdc++.h>
using namespace std;
const int mod = 1e9+7;
int ad(int x,int y) { x+=y; return x>=mod?x-mod:x; }
int mu(int x,int y) { return 1ll*x*y%mod; }
int ksm(int a,int b) {
int ans = 1;
for(;b;b>>=1,a=mu(a,a))
if(b&1) ans = mu(ans,a);
return ans;
}
int f[20][140]; // f[s][136]
int fac[150],finv[150],inv[150];
void init() {
fac[0] = 1;
for(int i=1;i<=140;i++) fac[i] = mu(fac[i-1],i);
finv[140] = ksm(fac[140],mod-2);
for(int i=139;i>=0;i--) {
finv[i] = mu(finv[i+1],i+1);
}
for(int i=1;i<=140;i++) {
inv[i] = mu(finv[i],fac[i-1]);
}
memset(f,0x3f,sizeof f);
for(int i=136-14;i>=0;i--) {
f[0][i] = 0;
}
for(int r=3;r<=136-13;r++) {
f[0][r] = 0;
for(int s=1;s<=13&&r>=3*s;s++) {
if(s==1) {
f[s][r] = ad(1,mu(mu(r-3,inv[r]),f[s][r-1]));
} else {
f[s][r] = ad(1,ad( mu(mu(3*s,inv[r]),f[s-2][r-1] ) , mu( mu(r-3*s,inv[r]),f[s][r-1] ) ));
}
}
}
}
char ss[150];
map<int,int>ma;
int fy(int x,int y) {
int yo = 0;
if(ss[y]=='m') yo = 0;
else if(ss[y]=='p') yo = 1;
else if(ss[y]=='s') yo = 2;
else yo = 3;
return ss[x]-'0' + yo * 9;
}
int main(){
init();
int t;
scanf("%d",&t);
for(int i=1;i<=t;i++) {
scanf("%s",&ss[1]);
for(int o=1;o<=13;o++) {
ma[fy(o*2-1,o*2)]++;
}
int dp = 0;
for(auto x:ma) {
if (x.second==1) dp++;
}
ma.clear();
printf("Case #%d: %d\n",i,f[dp][136-13]);
}
return 0;
}

浙公网安备 33010602011771号