• noip2016代码


    ----------------------------------------------------------------------------------

    以下均为AC代码

    -----------------------------------------------------------------------------------

    Day1 T1

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    using namespace std;
    inline int read(){
        register int x=0;bool f=1;
        register char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
        return f?x:-x;
    }
    const int N=1e5+10;
    struct node{
        int f;
        char s[260];
        node(){
            f=0;
            memset(s,0,sizeof s);
        }
    }e[N<<1];
    int n,m;
    int main(){
        n=read();m=read();
        for(int i=1;i<=n;i++){
            e[i].f=read();
            scanf("%s",&e[i].s);
        }
        int zj=1;
        for(int i=1,opt,p;i<=m;i++){
            opt=read();p=read();p%=n;
            if(!e[zj].f){
                if(opt){
                    if(zj+p<=n) zj+=p;
                    else zj=zj+p-n;
                }
                else{
                    if(zj<=p) zj=n-p+zj;
                    else zj-=p;
                }
            }
            else{
                if(!opt){
                    if(zj+p<=n) zj+=p;
                    else zj=zj+p-n;
                }
                else{
                    if(zj<=p) zj=n-p+zj;
                    else zj-=p;
                }
            }
        }
        printf("%s",e[zj].s);
        return 0;
    }

    Day1 T2

    /*
    题解:by shenben 
    如果观察点x可以观察到u->v路径上的点:
    1、u->fa:t[x]+de[x]=de[u]
    2、fa->v: t[x]-de[x]=dis[u,v]-de[v]
    对于每条路径:用差分去维护每个点的信息
    对于答案统计:可以做dfs序,然后用主席树解决“区间有多少个某数”的问题
    */
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #define me(a) memset(a,0,sizeof a)
    using namespace std;
    inline int read(){
        register int x=0;bool f=1;
        register char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
        return f?x:-x;
    }
    const int N=3e5+10;
    const int M=N*25;
    int le[N],ri[N],dep[N],f[N][20],ans[N],t[N],tt[N],st[N],en[N],lca[N];
    int sum[M],ls[M],rs[M],root[N*3];
    struct node{
        int v,next;
    }e[N<<1];
    int n,m,now,num,tot,cnt,head[N];
    void add(int x,int y){
        e[++tot].v=y;e[tot].next=head[x];head[x]=tot;
    }
    void dfs(int x,int fa){
        le[x]=++cnt;
        for(int i=head[x],v;i;i=e[i].next){
            if((v=e[i].v)!=fa){
                dep[v]=dep[x]+1;
                f[v][0]=x;
                dfs(v,x);
            }
        }
        ri[x]=cnt;
    }
    int calc_lca(int a,int b){
        if(dep[a]<dep[b]) swap(a,b);
        int t=dep[a]-dep[b];
        for(int i=0;i<=18;i++){
            if(1<<i&t){
                a=f[a][i];
            }
        }
        if(a==b) return a;
        for(int i=18;i>=0;i--){
            if(f[a][i]!=f[b][i]){
                a=f[a][i];
                b=f[b][i];
            }
        }
        return f[a][0];
    }
    void change(int &rt,int l,int r,int pos,int val){
        if(!pos) return ;
        if(!rt) rt=++num;
        sum[rt]+=val;
        if(l==r) return ;
        int mid=l+r>>1;
        if(pos<=mid) change(ls[rt],l,mid,pos,val);
        else change(rs[rt],mid+1,r,pos,val);
    }
    int query(int rt,int l,int r,int x,int y){
        if(!rt) return 0;
        if(l==x&&r==y) return sum[rt];
        int mid=l+r>>1;
        if(y<=mid) return query(ls[rt],l,mid,x,y);
        else if(x>mid) return query(rs[rt],mid+1,r,x,y);
        else return query(ls[rt],l,mid,x,mid)+query(rs[rt],mid+1,r,mid+1,y);
    }
    void Cl(){
        num=0;me(ls);me(rs);me(sum);me(root);
    }
    int main(){
        n=read();m=read();
        for(int i=1,x,y;i<n;i++){
            x=read();y=read();
            add(x,y);add(y,x);
        }
        dep[1]=1;
        dfs(1,0);
        for(int j=1;j<=18;j++){
            for(int i=1;i<=n;i++){
                f[i][j]=f[f[i][j-1]][j-1];
            }
        }
        for(int i=1;i<=n;i++) t[i]=read();
        for(int i=1;i<=m;i++) st[i]=read(),en[i]=read(),lca[i]=calc_lca(st[i],en[i]);
        for(int i=1;i<=n;i++) tt[i]=t[i]+dep[i];
        for(int i=1;i<=m;i++){
            now=dep[st[i]];
            change(root[now],1,n,le[st[i]],1);
            change(root[now],1,n,le[f[lca[i]][0]],-1);
        }
        for(int i=1;i<=n;i++) ans[i]+=query(root[tt[i]],1,n,le[i],ri[i]);
        Cl();
        for(int i=1;i<=n;i++) tt[i]=t[i]-dep[i]+n+1;
        for(int i=1;i<=m;i++){
            now=dep[st[i]]-(dep[lca[i]]<<1)+n+1;
            change(root[now],1,n,le[en[i]],1);
            change(root[now],1,n,le[lca[i]],-1);
        }
        for(int i=1;i<=n;i++) ans[i]+=query(root[tt[i]],1,n,le[i],ri[i]);
        for(int i=1;i<=n;i++) printf("%d ",ans[i]);
        return 0;
    }

    Day1 T3

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #define DB double
    #define inf 0x3f3f3f3f
    using namespace std;
    inline int read(){
        register int x=0;bool f=1;
        register char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
        return f?x:-x;
    }
    const int N=310;
    const int M=2010;
    int n,m,V,E,f[N][N];
    int c[M],d[M];
    DB K[M],dp[2][M][2];
    void init(){
        memset(f,inf,sizeof f);
        n=read();m=read();V=read();E=read();
        for(int i=1;i<=n;i++) c[i]=read();
        for(int i=1;i<=n;i++) d[i]=read();
        for(int i=1;i<=n;i++) scanf("%lf",&K[i]);
        for(int i=1,x,y,z;i<=E;i++){
            x=read();y=read();z=read();
            f[x][y]=min(f[x][y],z);
            f[y][x]=min(f[y][x],z);
        }
    }
    void floyed(){
        for(int i=1;i<=V;i++) f[i][i]=0;
        for(int k=1;k<=V;k++){
            for(int i=1;i<=V;i++){
                for(int j=1;j<=V;j++){
                    if(i!=j&&i!=k&&j!=k){
                        f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
                    }
                }
            }
        }
    }
    void work(){
        //memset(dp,0x7fffffff,sizeof dp);对double类型慎用 
        for(int i=0;i<=1;i++){
            for(int j=0;j<=m;j++){
                dp[i][j][0]=dp[i][j][1]=inf;
            }
        }
        int now=1;
        dp[1][0][0]=0;dp[1][1][1]=0;
        for(int i=2;i<=n;i++){
            now^=1;
            dp[now][0][0]=dp[now^1][0][0]+f[c[i-1]][c[i]];
            for(int j=1;j<=min(i,m);j++){
                dp[now][j][0]=min(dp[now^1][j][0]+f[c[i-1]][c[i]],dp[now^1][j][1]+K[i-1]*f[d[i-1]][c[i]]+(1-K[i-1])*f[c[i-1]][c[i]]);
                dp[now][j][1]=min(dp[now^1][j-1][0]+K[i]*f[c[i-1]][d[i]]+(1-K[i])*f[c[i-1]][c[i]],dp[now^1][j-1][1]+K[i-1]*K[i]*f[d[i-1]][d[i]]+(1-K[i-1])*K[i]*f[c[i-1]][d[i]]+K[i-1]*(1-K[i])*f[d[i-1]][c[i]]+(1-K[i-1])*(1-K[i])*f[c[i-1]][c[i]]);
            }
        }
        DB ans=inf;
        for(int i=0;i<=m;i++) ans=min(ans,min(dp[now][i][0],dp[now][i][1]));
        printf("%.2lf",ans);
    }
    int main(){
        init();
        floyed();
        work();
        return 0;
    }

    Day2 T1

    #include<cstdio>
    #include<ios>
    using namespace std;
    inline int read(){
        register int x=0;bool f=1;
        register char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
        return f?x:-x;
    }
    const int N=2010;
    int n,m,k,T;
    int C[N][N],S[N][N];
    void prepare(){
        for(int i=0;i<=2000;i++){
            C[i][0]=1%k;
            for(int j=1;j<=i;j++){
                C[i][j]=(C[i-1][j]+C[i-1][j-1])%k;
            }
        }
        S[0][0]=(C[0][0]==0);
        for(int i=1;i<=2000;i++){
            for(int j=1;j<=i;j++){
                if(!j){
                    S[i][j]=S[i-1][j]+(C[i][j]==0);
                }
                else if(i==j){
                    S[i][j]=S[i][j-1]+(C[i][j]==0);
                }
                else{
                    S[i][j]=S[i-1][j]+S[i][j-1]-S[i-1][j-1]+(C[i][j]==0);
                }
            }
        }
    }
    int main(){
        T=read(),k=read();
        prepare();
        for(;T--;){
            n=read();m=read();
            printf("%d
    ",S[n][min(n,m)]);
        }
        return 0;
    }

    Day2 T2

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define DB double
    using namespace std;
    inline int read(){
        register int x=0;bool f=1;
        register char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
        return f?x:-x;
    }
    const int N=1e5+5,M=7e6+5;
    int n,m,q,u,v,t;
    int mark,q0[N],q1[M],q2[M];
    int main(){
        n=read();m=read();q=read();u=read();v=read();t=read();
        memset(q0,-0x3f,sizeof q0);
        memset(q1,-0x3f,sizeof q1);
        memset(q2,-0x3f,sizeof q2);
        int h0=0,t0=n,h1=0,t1=0,h2=0,t2=0;
        for(int i=0;i<n;i++) q0[i]=read();
        sort(q0,q0+n,greater<int>());
        DB p=(DB)u/(DB)v;
        for(int i=1,x,x1;i<=m;i++){
            x=max(q0[h0],max(q1[h1],q2[h2]));
            if(x==q0[h0]) h0++;
            else if(x==q1[h1]) h1++;
            else h2++;
            x1=(x+=mark)*p;mark+=q;
            q1[t1++]=x1-mark;
            q2[t2++]=x-x1-mark;
            if(i%t) continue;
            printf("%d ",x);
        }
        putchar('
    ');
        for(int i=1,x;i<=n+m;i++){
            x=max(q0[h0],max(q1[h1],q2[h2]));
            if(x==q0[h0]) h0++;
            else if(x==q1[h1]) h1++;
            else h2++;
            if(i%t) continue;
            printf("%d ",x+mark);
        }
        return 0;
    }

    Day2 T3

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<iostream>
    #define DB double
    using namespace std;
    const int N=20;
    const DB eps=1e-7;
    int T,n,s[N][N],dp[1<<N-1];
    DB fm,a,b,x[N],y[N];
    int main(){
        ios::sync_with_stdio(false);
        for(cin>>T;T--;){
            memset(dp,0x3f,sizeof dp);
            int i,j,k,sta;
            cin>>n>>i;
            for(i=1;i<=n;i++) cin>>x[i]>>y[i];
            for(i=1;i<=n;i++){
                for(j=i+1;j<=n;j++){
                    fm=x[i]*x[j]*(x[i]-x[j]);
                    a=x[j]*y[i]-x[i]*y[j];
                    b=x[i]*x[i]*y[j]-x[j]*x[j]*y[i];
                    s[i][j]=0;
                    if(a*fm<0){
                        for(k=1;k<=n;k++){
                            if(fabs(a*x[k]*x[k]+b*x[k]-y[k]*fm)<eps){
                                s[i][j]|=(1<<k-1);
                            }
                        }
                    }
                }
            }
            dp[0]=0;
            for(sta=0;sta<(1<<n);sta++){
                if(sta<0x3f3f3f3f){
                    for(i=0;1<<i&sta;i++);i++;
                    dp[1<<i-1|sta]=min(dp[1<<i-1|sta],dp[sta]+1);
                    for(j=i+1;j<=n;j++){
                        dp[sta|s[i][j]]=min(dp[sta|s[i][j]],dp[sta]+1);
                    }
                }
            }
            printf("%d
    ",dp[sta-1]);
        }
        return 0;
    }

    ----------------------------------------------------------------------------------

    以下为暴力代码

    -----------------------------------------------------------------------------------

    Day1 T2

    //本代码为25分,加特判链、起点、终点可以拿60分 
    #pragma comment(linker,"/STACK:102400,102400")
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    inline int read(){
        register int x=0;bool f=1;
        register char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
        return f?x:-x;
    }
    const int N=3e5+10;
    struct node{
        int v,next;
    }e[N<<1];
    struct ss{
        int a,b,anc;
    }lca[N];
    int n,m,tot,head[N],dep[N],f[N][21];
    int W[N],ans[N];
    int tmp[N];
    void add(int x,int y){
        e[++tot].v=y;
        e[tot].next=head[x];
        head[x]=tot;
    }
    void dfs(int x,int fa,int de){
        dep[x]=de;
        f[x][0]=fa;
        for(int i=head[x];i;i=e[i].next){
            int v=e[i].v;
            if(v!=fa){
                dfs(v,x,de+1);
            }
        }
    }
    int calc_lca(int a,int b){
        if(dep[a]<dep[b]) swap(a,b);
        int t=dep[a]-dep[b];
        for(int i=0;i<=20;i++){
            if((1<<i)&t){
                a=f[a][i];
            }
        }
        if(a==b) return a;
        for(int i=20;i>=0;i--){
            if(f[a][i]!=f[b][i]){
                a=f[a][i];
                b=f[b][i];
            }
        }
        return f[a][0];
    }
    #define name "running"
    int main(){
        n=read();m=read();
        for(int i=1,x,y;i<n;i++){
            x=read();y=read();
            add(x,y);add(y,x);
        }
        dfs(1,1,0);
        for(int j=1;j<=20;j++){
            for(int i=1;i<=n;i++){
                f[i][j]=f[f[i][j-1]][j-1];
            }
        }
        for(int i=1;i<=n;i++) W[i]=read();
        for(int i=1,x,y;i<=m;i++){
            lca[i].a=read();
            lca[i].b=read();
            lca[i].anc=calc_lca(lca[i].a,lca[i].b);
        }
        for(int j,k,i=1;i<=m;i++){
            int x=lca[i].a,y=lca[i].b;
            for(j=0;x!=lca[i].anc;j++){
                if(j==W[x]) ans[x]++;
                x=f[x][0];
            }
            if(j==W[lca[i].anc]) ans[lca[i].anc]++;
            tmp[0]=0;
            for(;y!=lca[i].anc;){
                tmp[++tmp[0]]=y;
                y=f[y][0];
            }
            reverse(tmp+1,tmp+tmp[0]+1);
            for(k=1;k<=tmp[0];k++){
                if(j+k==W[tmp[k]]) ans[tmp[k]]++;
            }
        }
        for(int i=1;i<n;i++) printf("%d ",ans[i]);printf("%d",ans[n]);
        return 0;
    }

    Day1 T3

    //本代码76分,貌似暴力最多80分 
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #define DB double
    using namespace std;
    inline int read(){
        register int x=0;bool f=1;
        register char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
        return f?x:-x;
    }
    const int N=310;
    const int M=2010;
    int n,m,V,E,f[N][N];
    int c[M],d[M];
    DB miss,ans=1e9;
    DB K[M];
    bool ok1[M],ok2[M];
    void init(){
        memset(f,0x3f3f3f3f,sizeof f);
        n=read();m=read();V=read();E=read();
        for(int i=1;i<=n;i++) c[i]=read();
        for(int i=1;i<=n;i++) d[i]=read();
        for(int i=1;i<=n;i++) scanf("%lf",&K[i]);
        for(int i=1,x,y,z;i<=E;i++){
            x=read();y=read();z=read();
            if(x==y) continue;
            f[x][y]=min(f[x][y],z);
            f[y][x]=min(f[y][x],z);
        }
    }
    void floyed(){
        for(int i=1;i<=V;i++) f[i][i]=0;
        for(int k=1;k<=V;k++){
            for(int i=1;i<=V;i++){
                for(int j=1;j<=V;j++){
                    if(i!=j&&i!=k&&j!=k){
                        f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
                    }
                }
            }
        }
    }
    DB check2(DB lv){
        int now,tot=0;
        now=ok2[1]?d[1]:c[1];
        for(int i=2;i<=n;i++){
            if(ok2[i]){
                if(now!=d[i]) tot+=f[now][d[i]];
                now=d[i];
            }
            else{
                if(now!=c[i]) tot+=f[now][c[i]];
                now=c[i];
            }
        }
        return lv*(DB)tot;
    }
    void dfs2(int x,DB lv){
        if(x==n+1){
            miss+=check2(lv);return ;
        }
        if(!ok1[x]){
            dfs2(x+1,lv);
        }
        else{
            dfs2(x+1,lv*(1.0-K[x]));
            ok2[x]=1;
            dfs2(x+1,lv*K[x]);
            ok2[x]=0;
        }
    }
    void merge(){
        miss=0;
        dfs2(1,1.0);
        ans=min(ans,miss);
    }
    void dfs1(int x,int t){
        if(t>m) return ;
        if(x==n+1){
            merge();return ;
        }
        dfs1(x+1,t);
        ok1[x]=1;
        dfs1(x+1,t+1);
        ok1[x]=0;
    }
    int main(){
        init();
        floyed();
        if(!m){
            printf("%.2lf",check2(1.0));
        }
        else{
            dfs1(1,0);
            printf("%.2lf",ans);
        }
        return 0;
    } 

    Day2 T1

    //本代码80分,加前缀和可以AC 
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #define ll long long
    using namespace std;
    inline int read(){
        register int x=0;bool f=1;
        register char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
        return f?x:-x;
    }
    const int N=2010;
    const int M=3010;
    int n,m,k,T;
    int tot,c[M],prime[M/3];
    bool check[M];
    short C[N][N];
    void prepare(){
        n=3000;
        for(int i=2;i<=n;i++){
            if(!check[i]) prime[++tot]=i;
            for(int j=1;j<=tot&&prime[j]*i<=n;j++){
                check[prime[j]*i]=1;
                if(i%prime[j]==0) break;
            }
        }
    }
    void Add(ll x){
        if(x<2) return ;
        for(int i=1;i<=tot;i++){
            ll r=x,p=prime[i];
            if(r<p) break;
            while(r) c[i]+=(r/=p);
        }
    }
    void Del(ll x){
        if(x<2) return ;
        for(int i=1;i<=tot;i++){
            ll r=x,p=prime[i];
            if(r<p) break;
            while(r) c[i]-=(r/=p);
        }
    }
    ll fpow(ll a,ll p,ll mod){
        ll res=1;
        for(;p;p>>=1,a=a*a%mod) if(p&1) res=res*a%mod;
        return res;
    }
    int calc(ll n,ll m){
        memset(c,0,sizeof c);
        Add(n);
        Del(m);
        Del(n-m);
        ll res=1;
        for(int i=1;i<=tot;i++){
            if(c[i]>0) res=res*fpow(prime[i],c[i],k)%k;
            if(!res) return 1;
            if(prime[i]>n) break;
        }
        return 0;
    }
    int ans;
    int main(){
        memset(C,-1,sizeof C);
        prepare();
        for(T=read(),k=read();T--;){
            ans=0;
            n=read();m=read();
            for(int i=0;i<=n;i++){
                for(int j=0;j<=min(i,m);j++){
                    if(C[i][j]==1) {ans++;continue;}
                    else if(C[i][j]==0) continue;
                    C[i][j]=calc(i,j);
                    if(C[i][j]) ans++;
                }
            }
            printf("%d
    ",ans);
        }
        return 0;
    }

    Day2 T2

    //本代码45分,貌似暴力的极限就是50分 
    #include<cstdio>
    #include<queue>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    inline int read(){
        register int x=0;bool f=1;
        register char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
        return f?x:-x;
    }
    #define DB double
    const int N=7e6+10;
    const int M=1e5+10;
    int num,n,m,q,u,v,t;
    int s[N+M];
    int cnt,ans[N];
    bool cmp(const int &a,const int &b){
        return a>b;
    }
    priority_queue<int>que;
    int main(){
        n=read();m=read();q=read();u=read();v=read();t=read();
        DB p=(DB)u/(DB)v;
        for(int i=1;i<=n;i++) s[i]=read();
        if(!q){
            for(int i=1;i<=n;i++) que.push(s[i]);
            for(int i=1,x;i<=m;i++){
                x=que.top();que.pop();
                ans[++ans[0]]=x;
                int x1=floor((DB)x*p);
                int x2=x-x1;
                que.push(x1);
                que.push(x2);
            }
            for(int i=t;i<=ans[0];i+=t) printf("%d ",ans[i]);
            putchar('
    ');
            while(!que.empty()) s[++cnt]=que.top(),que.pop();
            for(int i=1+t-1;i<=cnt;i+=t) printf("%d ",s[i]);
            return 0;
        }
        int top=n;
        for(int i=1;i<=m;i++){
            int maxn=0,pj=0;
            for(int j=1;j<=top;j++){
                if(s[j]>maxn){
                    maxn=s[j];
                    pj=j;
                }
            }
            ans[++ans[0]]=maxn;
            int x1=floor((DB)maxn*p);
            int x2=maxn-x1;
            for(int j=1;j<=top;j++) s[j]+=q;
            s[pj]=x1;
            s[++top]=x2;
        }
        sort(s+1,s+top+1,cmp);
        for(int i=t;i<=ans[0];i+=t) printf("%d ",ans[i]);
        putchar('
    ');
        for(int i=1+t-1;i<=top;i+=t) printf("%d ",s[i]);
        return 0;
    }

    Day2 T3

    //本代码50分,貌似暴力最多可以拿65分 
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cmath>
    #define N 21
    using namespace std;
    int n,m,limit,ok[N],ans;
    double x[N],y[N],a,b;
    void check(int i,int j){
        double x1=x[i],x2=x[j],y1=y[i],y2=y[j];
        double P=x1/x2;
        a=(y2*P-y1)/(x2*x1-x1*x1);
        b=(y1-a*x1*x1)/x1;
    }
    void dfs(int t){
        if(t>limit) return;
        if(t>=ans) return;
        int flag=0;
        for(int i=1;i<=n;i++){
            if(ok[i]) continue;
            ok[i]=1;flag=1;int fl2=0;
            for(int j=i+1;j<=n;j++){
                if(ok[j]) continue;
                check(i,j);
                if(a>=0) continue;
                ok[j]=1;fl2=1;
                int num=0;
                for(int k=j+1;k<=n;k++){
                    double yy=a*x[k]*x[k]+b*x[k]-y[k];
                    if(fabs(yy)<=0.001){
                        ok[k]=1;
                    }
                }
                dfs(t+1),ok[i]=ok[j]=0;
            }
            if(!fl2)dfs(t+1),ok[i]=0;
        }
        if(!flag){
            ans=min(ans,t);
            return;
        }
    }
    void work(){
        scanf("%d%d",&n,&m);
        if(m==0)limit=n;
        else if(m==1)limit=min(n/3+1,n);
        else limit=min(n,n-n/3);
        for(int i=1;i<=n;i++) scanf("%lf%lf",&x[i],&y[i]);
        dfs(0);
        printf("%d
    ",ans);
    }
    int main(){
        int T;scanf("%d",&T);
        while(T--){
            memset(ok,0,sizeof(ok));
            ans=N;
            work();
        }
        return 0;
    }
  • 相关阅读:
    一本通 1261:【例9.5】城市交通路网
    一本通 1263:【例9.7】友好城市(数据较弱)
    洛谷 P2983 [USACO10FEB]购买巧克力Chocolate Buying
    一本通 1266:【例9.10】机器分配
    【BZOJ5417】你的名字(NOI2018)-后缀自动机+主席树
    【BZOJ1396】识别子串-后缀自动机+线段树
    【HDU4787】GRE Words Revenge-AC自动机+分块
    【51Nod1766】树上的最远点对-线段树+树的直径
    【BZOJ3648】寝室管理-环套树+点分治+树状数组
    【BZOJ1367】Sequence(Baltic2004)-贪心+左偏树
  • 原文地址:https://www.cnblogs.com/shenben/p/6132085.html
Copyright © 2020-2023  润新知