CF514

CF514A

简单题。当 \(9-t\le t\) 时交换一下即可。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline
#define endl '\n'
#define gc getchar
#define pc putchar
const int N=2e5+5;
const int M=1e7+5;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
inl int read(){
    int x=0,f=1;char c=gc();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
    while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=gc();}
    return x*f;
}
inl void write(int x){
    if(x<0){pc('-');x=-x;}
    if(x>9)write(x/10);
    pc(x%10+'0');
}
inl void writei(int x){write(x);pc(' ');}
inl void writel(int x){write(x);pc('\n');}
int n,m;
char c;
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>c;int x=c-'0';
    cout<<(char)(x^9&&9-x<x?9-x+'0':x+'0');
    while(cin>>c){
        int x=c-'0';
        cout<<(char)(9-x<x?9-x+'0':x+'0');
    }
    return 0;
}

CF514B

对于斜率相同的点即在一条直线上,能一次干掉。特判 \(x=0\) 情况即可。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline
#define endl '\n'
#define gc getchar
#define pc putchar
const int N=2e5+5;
const int M=1e7+5;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
inl int read(){
    int x=0,f=1;char c=gc();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
    while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=gc();}
    return x*f;
}
inl void write(int x){
    if(x<0){pc('-');x=-x;}
    if(x>9)write(x/10);
    pc(x%10+'0');
}
inl void writei(int x){write(x);pc(' ');}
inl void writel(int x){write(x);pc('\n');}
int n,m,x0,y0;
inl int gcd(int a,int b){return !b?a:gcd(b,a%b);}
map<double,int>mp;
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    n=read();x0=read();y0=read();
    for(int i=1;i<=n;i++){
        int x=read()-x0,y=read()-y0;
        if(x)mp[1.0*y/x]=1;
        else mp[inf]=1;
    }
    cout<<mp.size()<<endl;
    return 0;
}

CF514C

\(n\) 个字符串塞到trie里,查询暴力dfs。
然而这复杂度真的是对的吗...可能是我太菜了
当然也可以hash 不过CF题就不写hash了吧

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline
#define endl '\n'
#define gc getchar
#define pc putchar
const int N=2e6+5;
const int M=1e7+5;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
inl int read(){
    int x=0,f=1;char c=gc();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
    while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=gc();}
    return x*f;
}
inl void write(int x){
    if(x<0){pc('-');x=-x;}
    if(x>9)write(x/10);
    pc(x%10+'0');
}
inl void writei(int x){write(x);pc(' ');}
inl void writel(int x){write(x);pc('\n');}
int n,m,t[N][4],cnt,num[N],len;
char s[N];
inl void insert(){
    int len=strlen(s+1),p=0;
    for(int i=1;i<=len;i++){
        int x=s[i]-'a'+1;
        p=t[p][x]?t[p][x]:t[p][x]=++cnt;
    }
    num[p]=1;
}
inl bool dfs(int k,int p,int ok){
    if(k>len)return ok&num[p];
    int x=s[k]-'a'+1,ans=0;
    if(t[p][x])ans|=dfs(k+1,t[p][x],ok);
    if(ans)return 1;
    if(!ok){
        for(int i=1;i<=3;i++){
            if(x==i)continue;
            if(t[p][i])ans|=dfs(k+1,t[p][i],1);
            if(ans)return 1;
        }
    }
    return 0;
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>m;
    while(n--){
        cin>>s+1;
        insert();
    }
    while(m--){
        cin>>s+1;
        len=strlen(s+1);
        cout<<(dfs(1,0,0)?"YES":"NO")<<endl;
    }
    return 0;
}

CF514D

枚举区间起始点,结尾可以二分找。
check就是 \(m\) 个区间分别找最大值 判加起来是否小于k
rmq可以用st表 复杂度 \(O(nm\log n)\)

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline
#define endl '\n'
#define int ll
#define gc getchar
#define pc putchar
const int N=1e5+5;
const int M=1e7+5;
const int inf=0x3f3f3f3f3f3f3f3f;
const int mod=1e9+7;
inl int read(){
    int x=0,f=1;char c=gc();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
    while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=gc();}
    return x*f;
}
inl void write(int x){
    if(x<0){pc('-');x=-x;}
    if(x>9)write(x/10);
    pc(x%10+'0');
}
inl void writei(int x){write(x);pc(' ');}
inl void writel(int x){write(x);pc('\n');}
int n,m,kk,st[6][22][N],ans,res[N];
inl bool check(int l,int r){
    int ans=0;
    for(int i=1;i<=m;i++){
        int k=__lg(r-l+1);
        ans+=max(st[i][k][l],st[i][k][r-(1<<k)+1]);
    }
    return ans<=kk;
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    n=read();m=read();kk=read();
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            st[j][0][i]=read();
    for(int i=1;i<=m;i++)
        for(int k=1;k<=20;k++)
            for(int j=1;j+(1<<k)-1<=n;j++)
                st[i][k][j]=max(st[i][k-1][j],st[i][k-1][j+(1<<k-1)]);
    for(int i=1;i<=n;i++){
        int l=i,r=n,ret=i-1;
        while(l<=r){
            int mid=l+r>>1;
            if(check(i,mid))l=mid+1,ret=mid;
            else r=mid-1;
        }
        if(ret-i+1>ans){
            ans=ret-i+1;int k=__lg(ret-i+1);
            for(int j=1;j<=m;j++)
                res[j]=max(st[j][k][i],st[j][k][ret-(1<<k)+1]);
        }
    }
    for(int i=1;i<=m;i++)cout<<res[i]<<' ';
    return 0;
}

CF514D

显然的dp式子:\(f_i\) 表示到根距离为 \(i\) 的点的数量
\(f_i=\sum\limits_{j=0}^n f_{i-d_j}\)
发现 \(d\) 很小 那么可以开桶统计 \(d_j\)
\(f_i=\sum\limits_{j=0}^{100} f_{i-j}\times t_j\)(\(t_j\) 表示 \(d_k=j\) 的数量)
可以用矩阵快快速幂加速

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline
#define endl '\n'
#define int ll
#define gc getchar
#define pc putchar
const int N=1e5+5;
const int M=1e7+5;
const int inf=0x3f3f3f3f3f3f3f3f;
const int mod=1e9+7;
inl int read(){
    int x=0,f=1;char c=gc();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
    while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=gc();}
    return x*f;
}
inl void write(int x){
    if(x<0){pc('-');x=-x;}
    if(x>9)write(x/10);
    pc(x%10+'0');
}
inl void writei(int x){write(x);pc(' ');}
inl void writel(int x){write(x);pc('\n');}
int n,x,f[105],d[N],t[N],sum;
struct matrix{
    int a[105][105];
}a;
inl void init_matrix(matrix &x){
    for(int i=1;i<=101;i++)
        for(int j=1;j<=101;j++)
            x.a[i][j]=i==j;
}
inl void empty_matrix(matrix &x){
    for(int i=1;i<=101;i++)
        for(int j=1;j<=101;j++)
            x.a[i][j]=0;
}
matrix operator*(matrix a,matrix b){
    matrix ans;empty_matrix(ans);
    for(int i=1;i<=101;i++)
        for(int j=1;j<=101;j++)
            for(int k=1;k<=101;k++)
                ans.a[i][j]=(ans.a[i][j]+a.a[i][k]*b.a[k][j]%mod)%mod;
    return ans;
}
inl void qpow(matrix &a,int b){
    matrix ans;init_matrix(ans);
    while(b){
        if(b&1)ans=ans*a;
        a=a*a;
        b>>=1;
    }
    a=ans;
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    n=read();x=read();f[0]=1;
    if(x<=100){
        for(int i=1;i<=n;i++)d[i]=read();
        for(int i=1;i<=x;i++)
            for(int j=1;j<=n;j++)
                if(i-d[j]>=0)f[i]=(f[i]+f[i-d[j]])%mod;
        for(int i=0;i<=x;i++)sum=(sum+f[i])%mod;
        cout<<sum<<endl;
        return 0;
    }
    for(int i=1;i<=n;i++)d[i]=read();
    for(int i=1;i<=n;i++)t[d[i]]++;
    for(int i=1;i<=100;i++)
        for(int j=1;j<=n;j++)
            if(i-d[j]>=0)f[i]=(f[i]+f[i-d[j]])%mod;
    for(int i=0;i<=100;i++)sum=(sum+f[i])%mod;
    a.a[1][1]=1;
    for(int i=1;i<=100;i++)
        a.a[i+1][1]=a.a[i+1][2]=t[i];
    for(int i=3;i<=101;i++)
        a.a[i-1][i]=1;
    qpow(a,x-100);
    int ans=sum*a.a[1][1]%mod;
    for(int i=1;i<=100;i++)
        ans=(ans+f[101-i]*a.a[i+1][1]%mod)%mod;
    cout<<ans<<endl;
    return 0;
}
posted @ 2023-11-30 15:12  xiang_xiang  阅读(82)  评论(0)    收藏  举报