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

    2019 Multi-University Training Contest 5

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

    1004. Equation

    把所有绝对值的零点排个序,然后解方程就好了。

    #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 long 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-10;
    const int mod = 1e9+7;
    
    struct data {int a,b;lf x;}a[maxn],sta[maxn];
    int n,top;
    
    int cmp(data a,data b) {return a.x<b.x;}
    
    data make(int a,int b) {return (data){a,b,(lf)b/(lf)a};}
    
    void solve() {
        int c;
        read(n),read(c);int suma=0,sumb=c;
        for(int i=1;i<=n;i++) read(a[i].a),read(a[i].b),a[i].x=-(lf)a[i].b/a[i].a,suma-=a[i].a,sumb+=a[i].b;
        sort(a+1,a+n+1,cmp);top=0;
        if((lf)sumb/suma<a[1].x-eps) sta[++top]=make(suma,sumb);
        a[n+1].x=2e9;
        for(int i=1;i<=n;i++) {
            suma+=a[i].a*2,sumb-=a[i].b*2;lf x;
            if(suma==0) {
                if(sumb==0) return puts("-1"),void();
                continue;
            }else x=(lf)sumb/suma;
            if(a[i].x<=x&&x<=a[i+1].x) sta[++top]=make(suma,sumb);
        }sort(sta+1,sta+top+1,cmp);
        int ans=0;
        for(int i=1;i<=top;i++) {
            int &a=sta[i].a,&b=sta[i].b,f=1;
            if(a<0) f=-f,a=-a;if(b<0) f=-f,b=-b;
            if(b==0) {a=1;if(!(a==sta[i-1].a&&b==sta[i-1].b)) ans++;continue;}
            int t=__gcd(a,b);a/=t,b/=t;
            if(f==-1) b=-b;if(!(a==sta[i-1].a&&b==sta[i-1].b)) ans++;
        }printf("%d%c",ans,ans?' ':'
    ');
        for(int i=1;i<=top;i++)
            if(!(sta[i].a==sta[i-1].a&&sta[i].b==sta[i-1].b)) {
                int a=sta[i].a,b=sta[i].b;
                if(b==0) {printf("0/1%c",(--ans)?' ':'
    ');continue;}
                printf("%d/%d%c",b,a,(--ans)?' ':'
    ');
            }
    }
    
    signed main() {
        int t;read(t);while(t--) solve();
        return 0;
    }
    

    1007. Permutation 2

    先考虑(p_1=1,p_n=n)怎么做,设(f_n)表示长度为(n)的方案数。

    枚举最后几个数的放法,可以发现只有这么两种:

    (cdots,n-1,n)或者(cdots,n-3,n-1,n-2,n),其他的要么不合法要么就可以归纳到这两种里面。

    所以可以得到转移:(f_n=f_{n-1}+f_{n-3})

    再考虑(p_1=a,p_n=b)怎么做,注意到(1sim a-1)必然要遍历到,那么必然要先遍历这些,一开始的序列一定是形如:(a,a-2,a-4cdots 1,3 cdots a-1,a+1),后面同理。

    所以可以看作是(a+1sim b-1)随便填,其他的唯一确定。

    中间的部分就是刚刚算出来的(f)

    #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 = 1e6+10;
    const int inf = 1e9;
    const lf eps = 1e-8;
    const int mod = 998244353;
    
    int f[maxn];
    
    void solve() {
        int x,y,n,a,b;
        read(n),read(x),read(y);
        if(y-x==1&&x!=1&&y!=n) return puts("0"),void();
        if(y-x<=2) return puts("1"),void();
        if(x==1) a=1;else a=x+1;
        if(y==n) b=n;else b=y-1;
        write(f[b-a+1]);
    }
    
    int main() {
        f[1]=1,f[2]=1,f[3]=1;
        for(int i=4;i<maxn;i++) f[i]=(f[i-1]+f[i-3])%mod;
        // for(int i=1;i<=20;i++) printf("%d %d
    ",i,f[i]);;
        int t;read(t);while(t--) solve();
        return 0;
    }
    
  • 相关阅读:
    Revit二次开发 C#程序员的佳好选择
    查询性能调优和索引优化那些事
    步步为营 .NET 设计模式学习笔记 十七、Flyweight(享元模式)
    初窥Ruby Metaprogramming
    线程间操作无效: 从不是创建控件“”的线程访问它
    全文搜索的,Lucene.net
    认识Lucene
    一些ObjectiveC学习资源
    步步为营 .NET 设计模式学习笔记 十五、Composite(组合模式)
    步步为营 .NET 设计模式学习笔记 十六、Facade(外观模式)
  • 原文地址:https://www.cnblogs.com/hbyer/p/11313379.html
Copyright © 2011-2022 走看看