zoukankan      html  css  js  c++  java
  • HDU校赛 | 2019 Multi-University Training Contest 3

    2019 Multi-University Training Contest 3

    http://acm.hdu.edu.cn/contests/contest_show.php?cid=850

    1004. Distribution of books

    考虑二分答案,设当前二分出来的是(x)

    (f_i)表示前(i)个能分成最多的段数,使得每一段和都(leqslant x)

    转移显然,枚举一个(j),若(s_i-s_jleqslant x)则转移,(s_i)表示前缀和。

    式子变一下就是(s_ileqslant x+s_j),那么对于每个(f_i)把值扔到(x+s_j)这个位置,随便拿个什么维护一下,每次查询就好了,复杂度(O(Tnlog ^2n))

    #include<bits/stdc++.h>
    using namespace std;
    
    #define int long long
    
    void read(int &x) {
        x=0;int f=1;char ch=getchar();
        for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
        for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
    }
    
    void print(int x) {
        if(x<0) putchar('-'),x=-x;
        if(!x) return ;print(x/10),putchar(x%10+48);
    }
    void write(int x) {if(!x) putchar('0');else print(x);putchar('
    ');}
    
    #define lf double
    
    #define pii pair<int,int >
    #define vec vector<int >
    
    #define pb push_back
    #define mp make_pair
    #define fr first
    #define sc second
    
    #define FOR(i,l,r) for(int i=l,i##_r=r;i<=i##_r;i++)
    
    const int maxn = 4e5+10;
    const int inf = 1e9;
    const lf eps = 1e-8;
    const int mod = 1e9+7;
    
    int n,a[maxn],f[maxn],s[maxn],k;
    
    #define ls p<<1
    #define rs p<<1|1
    
    struct Segment_Tree {
        int t[maxn*8];
        void modify(int p,int l,int r,int x,int v) {
            t[p]=max(t[p],v);
            if(l==r) return ;int mid=(l+r)>>1;
            if(x<=mid) modify(ls,l,mid,x,v);
            else modify(rs,mid+1,r,x,v);
        }
    
        int query(int p,int l,int r,int x,int y) {
            if(x<=l&&r<=y) return t[p];
            int mid=(l+r)>>1,ans=0;
            if(x<=mid) ans=max(ans,query(ls,l,mid,x,y));
            if(y>mid) ans=max(ans,query(rs,mid+1,r,x,y));
            return ans;
        }
    
        void build(int p,int l,int r) {
            t[p]=0;if(l==r) return ;int mid=(l+r)>>1;
            build(ls,l,mid),build(rs,mid+1,r);
        }
    }T;
    
    int r[maxn],tot;
    
    int check(int x) {
        tot=0;
        FOR(i,1,n) f[i]=0,r[++tot]=s[i],r[++tot]=s[i]+x;
        sort(r+1,r+tot+1);int m=unique(r+1,r+tot)-r-1;
        T.build(1,1,m);
        for(int i=1;i<=n;i++) {
            int pps=lower_bound(r+1,r+m+1,s[i])-r;
            int ppsw=lower_bound(r+1,r+m+1,s[i]+x)-r;
            int a=T.query(1,1,m,pps,m);
            if(!a) f[i]=s[i]<=x?1:0;
            else f[i]=a+1;
            if(f[i]>=k) return 1;
            T.modify(1,1,m,ppsw,f[i]);
        }return 0;
    }
    
    void solve() {
        read(n),read(k);
        for(int i=1;i<=n;i++) read(a[i]);
        for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];
        int l=-2e14,r=1e9,ans=r;
        while(l<=r) {
            int mid=(l+r)>>1;
            if(check(mid)) r=mid-1,ans=mid;
            else l=mid+1;
        }write(ans);
    }
    
    signed main() {
        int t;read(t);while(t--) solve();
        return 0;
    }
    

    1006. Fansblog

    挺无聊的题。。。考你会不会素数密度和威尔逊定理(这个名字也是我看了题解才知道的)。。

    反正就是说对于一个素数(p),必然满足((p-2)!equiv 1pmod p)

    那么直接暴力就好了,我随便蒯了个我以前的( m Miller\_robon)的板子。

    #include<bits/stdc++.h>
    using namespace std;
    
    #define int long long 
    
    void read(int &x) {
        x=0;int f=1;char ch=getchar();
        for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
        for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
    }
    
    void print(int x) {
        if(x<0) putchar('-'),x=-x;
        if(!x) return ;print(x/10),putchar(x%10+48);
    }
    void write(int x) {if(!x) putchar('0');else print(x);putchar('
    ');}
    
    #define lf double
    
    #define pii pair<int,int >
    #define vec vector<int >
    
    #define pb push_back
    #define mp make_pair
    #define fr first
    #define sc second
    
    #define FOR(i,l,r) for(int i=l,i##_r=r;i<=i##_r;i++)
    
    const int maxn = 1e6+10;
    const int inf = 1e9;
    const lf eps = 1e-8;
    const int mod = 1e9+7;
    
    const int pri[] = {0,2,3,5,7,11,13,23,31};
    
    int gcd(int a,int b) {return !b?a:gcd(b,a%b);}
        
    int mul(int x,int y,int p) {
        int t=(long double)x*y/p;
        int res=x*y-t*p;res%=p;if(res<0) res+=p;
        return res;
    }
        
    int qpow(int a,int x,int p) {
        int res=1;
        for(;x;x>>=1,a=mul(a,a,p)) if(x&1) res=mul(res,a,p);
        return res;
    }
        
    bool MR(int n) {
        if(n<2) return 1;
        int e=(n-1)>>__builtin_ctz(n-1);
        for(int i=1;i<=8;i++) {
            if(pri[i]>=n) break;
            for(int d=e,lst=qpow(pri[i],d,n),now;d!=n-1;d<<=1,lst=now) {
                now=mul(lst,lst,n);
                if(lst!=1&&lst!=n-1&&now==1) return 0;
            }if(qpow(pri[i],n-1,n)!=1) return 0;
        }return 1;
    }
    
    int p,q;
    
    void solve() {
        read(p);int ans=p-1;
        for(int i=p-1;;i--) {
            if(MR(i)) {break;}
            ans=mul(ans,qpow(i,p-2,p),p);
        }
        write(ans);
    }
    
    signed main() {
        int t;read(t);while(t--) solve();
        return 0;
    }
    

    1011. Squrirrel

    显然可以发现根定在直径上比较优。

    那么直接(dp),随便找一条直径出来,(f_{i,0/1})表示(i)子树有没有用过魔法的最大值,树(dp)完在链上差不多的(dp)一遍就好了,代码还挺难写的。

    复杂度(O(n))

    #include<bits/stdc++.h>
    using namespace std;
    
    void read(int &x) {
        x=0;int f=1;char ch=getchar();
        for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
        for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
    }
    
    void print(int x) {
        if(x<0) putchar('-'),x=-x;
        if(!x) return ;print(x/10),putchar(x%10+48);
    }
    void write(int x) {if(!x) putchar('0');else print(x);putchar('
    ');}
    
    #define lf double
    
    #define pii pair<int,int >
    #define vec vector<int >
    
    #define pb push_back
    #define mp make_pair
    #define fr first
    #define sc second
    
    #define FOR(i,l,r) for(int i=l,i##_r=r;i<=i##_r;i++)
    
    const int maxn = 2e5+10;
    const int inf = 1e9;
    const lf eps = 1e-8;
    const int mod = 1e9+7;
    
    int dep[maxn],head[maxn],tot,n,nxt[maxn],id[maxn],vis[maxn],f[maxn][2],g[maxn][2],h[maxn][2],val[maxn],rt;
    struct edge{int to,nxt,w;}e[maxn<<1];
    
    void add(int u,int v,int w) {e[++tot]=(edge){v,head[u],w},head[u]=tot;}
    void ins(int u,int v,int w) {add(u,v,w),add(v,u,w);}
    
    void dfs(int x,int fa) {
        if(dep[x]>dep[rt]) rt=x;nxt[x]=fa;
        for(int i=head[x];i;i=e[i].nxt)
            if(e[i].to!=fa) dep[e[i].to]=dep[x]+e[i].w,dfs(e[i].to,x);
    }
    
    void dp(int x,int fa) {
        int mx1=0,mx2=0,ww,p;
        for(int i=head[x];i;i=e[i].nxt)
            if(e[i].to!=fa&&!vis[e[i].to]) {
                dp(e[i].to,x);int t=f[e[i].to][0]+e[i].w;
                f[x][0]=max(f[e[i].to][0]+e[i].w,f[x][0]);
                if(t>=mx1) mx2=mx1,mx1=t,ww=e[i].w,p=e[i].to;
                else if(t>mx2) mx2=t;
            }
        if(mx1==mx2) f[x][1]=f[x][0];
        else f[x][1]=min(max(mx2,mx1-ww),max(mx2,f[p][1]+ww));
    }
    
    void solve() {
        read(n);
        for(int i=1,x,y,z;i<n;i++) read(x),read(y),read(z),ins(x,y,z);
        dep[1]=0;dfs(1,0);int sz=0;dep[rt]=0;dfs(rt,0);
        for(int u=rt;u;u=nxt[u]) id[++sz]=u,vis[u]=1;
        for(int i=1;i<=sz;i++) dp(id[i],0);
        g[1][0]=f[id[1]][0],g[1][1]=f[id[1]][1];
        for(int i=2;i<=sz;i++) {
            int ww;
            for(int j=head[id[i-1]];j;j=e[j].nxt) if(e[j].to==id[i]) ww=e[j].w;//,printf("ww :: %d %d %d
    ",id[i-1],id[i],ww);
            g[i][0]=max(g[i-1][0]+ww,f[id[i]][0]);
            g[i][1]=min(max(g[i-1][0],f[id[i]][0]),max(g[i-1][1]+ww,f[id[i]][0]));
            g[i][1]=min(g[i][1],max(g[i-1][0]+ww,f[id[i]][1]));
        }
        h[sz][0]=f[id[sz]][0],h[sz][1]=f[id[sz]][1];int ans=1e9,p;
        for(int i=sz-1;i;i--) {
            int ww;
            for(int j=head[id[i+1]];j;j=e[j].nxt) if(e[j].to==id[i]) ww=e[j].w;
            h[i][0]=max(h[i+1][0]+ww,f[id[i]][0]);
            h[i][1]=min(max(h[i+1][0],f[id[i]][0]),max(h[i+1][1]+ww,f[id[i]][0]));
            h[i][1]=min(h[i][1],max(h[i+1][0]+ww,f[id[i]][1]));
        }
        for(int i=1;i<=sz;i++) {
            //printf("%d ",id[i]);
            // printf("%d %d %d
    ",id[i],h[i][0],h[i][1]);
            int tmp=min(max(g[i][0],h[i][1]),max(g[i][1],h[i][0]));
            if(tmp<ans) ans=tmp,p=id[i];
        }//puts("");
        printf("%d %d
    ",p,ans);
        // write(ans);
    }
    
    void clear() {
        for(int i=0;i<=n;i++) head[i]=g[i][0]=g[i][1]=h[i][0]=h[i][1]=f[i][0]=f[i][1]=vis[i]=0;
        rt=tot=0;
    }
    
    int main() {
        int t;read(t);while(t--) solve(),clear();
        return 0;
    }
    
  • 相关阅读:
    人事面试13
    人事面试测试篇1
    人事面试16
    人事面试15
    人事面试测试篇3
    人事面试测试篇2
    人事面试14
    Oracle Compile 编译 无效对象
    Oracle 移动数据文件的操作方法
    Oracle 9i 从9.2.0.1升级到 9.2.0.6 步骤
  • 原文地址:https://www.cnblogs.com/hbyer/p/11271941.html
Copyright © 2011-2022 走看看