zoukankan      html  css  js  c++  java
  • 2018HDU多校day1

    1001(打表/不定方程)

    这个可以直接打表。。然后发现。。如果不能被3或者4整除就是-1。。
    然后被3整除一定是x=y=z=n/3(废话),否则被4整除一定是x=y=z/2=n/4。。

    然后是严格证明。。
    令u=n/x,v=n/y,w=n/z
    有1/u+1/v+1/w=1
    假设u<=v<=w,则u<=3
    当u=2,1/v+1/w=1/2,v=w=4或w=3,v=6
    当u=3,1/v+1/w=2/3,v=w=3
    就只有这3种取法。。然后u=2,w=3,v=6如果能满足一定能满足3|n了。。直接取均值,可排除。。

    /**
    *         ┏┓    ┏┓
    
                ┏┛┗━━━━━━━┛┗━━━┓
                ┃       ┃  
                ┃   ━    ┃
                ┃ >   < ┃
                ┃       ┃
                ┃... ⌒ ...  ┃
                ┃ ┃
                ┗━┓ ┏━┛
                 ┃ ┃ Code is far away from bug with the animal protecting          
                 ┃ ┃ 神兽保佑,代码无bug
                 ┃ ┃           
                 ┃ ┃       
                 ┃ ┃
                 ┃ ┃           
                 ┃ ┗━━━┓
                 ┃ ┣┓
                 ┃ ┏┛
                 ┗┓┓┏━━━━━━━━┳┓┏┛
                  ┃┫┫ ┃┫┫
    
                  ┗┻┛ ┗┻┛
        */
        include<cstdio>
        include<cstring>
        include<algorithm>
        include<iostream>
        include<queue>
        include<cmath>
        include<map>
        include<stack>
        include<set>
        define inc(i,l,r) for(int i=l;i<=r;i++)
        define dec(i,l,r) for(int i=l;i>=r;i--)
        define link(x) for(edge *j=h[x];j;j=j->next)
        define mem(a) memset(a,0,sizeof(a))
        define ll long long
        define eps 1e-12
        define succ(x) (1<<x)
        define lowbit(x) (x&(-x))
        define sqr(x) ((x)*(x))
        define mid (x+y>>1)
        define NM 1000005
        define nm 2000005
        define N 1000005
        define M(x,y) x=max(x,y)
    
        const double pi=acos(-1);
        const ll inf=998244353;
        using namespace std;
        ll read(){
        ll x=0,f=1;char ch=getchar();
        while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
        while(isdigit(ch))x=x10+ch-'0',ch=getchar();
        return fx;
        }
    
    ll n;
    int main(){
    int =read();while(--){
    n=read();
    if(n%3==0)n/=3,printf("%lld
    ",nnn);
    else if(n%4==0)n/=4,printf("%lld
    ",nnn*2);
    else printf("-1
    ");
    }
    return 0;
    }
    

    1002(6299)Balanced Sequence

    题解:可以通过类似栈的操作把序列化成')))))','((((((',')))))((((('这样的三种形式,然后对于这个pair(a,b)按照玄学规则排序就OK(G++T了C++就过了)

    #include <iostream>
    #include <algorithm>
    #include <string>
    const int MAXN=1e5+10;
    const int maxn=5e6+10;
    using namespace std;
    string s[MAXN];
    char str[maxn];
    typedef struct node{
        int h1,h2,id;
        friend bool operator<(node aa,node bb){
        if(min(aa.h1,bb.h2)==min(aa.h2,bb.h1))return aa.h1<bb.h2;
        return min(aa.h1,bb.h2)>min(aa.h2,bb.h1);
        }
    }node;
    node d[MAXN];
    /*bool cmp(node aa,node bb){
            if(min(aa.h1,bb.h2)==min(aa.h2,bb.h1))return aa.h1<bb.h2;
    	return min(aa.h1,bb.h2)>min(aa.h2,bb.h1);
    }*/
    int main(){
        //int _;cin>>_;
        ios::sync_with_stdio(false);
        int _;cin>>_;
        while(_--){
        int n;cin>>n;
        for(int i=1;i<=n;i++)cin>>s[i];
        int ans=0;
        for(int i=1;i<=n;i++){
            int _t=s[i].size();
            d[i].h1=d[i].h2=0;d[i].id=i;
            for(int j=0;j<_t;j++){
            if(s[i][j]=='(')d[i].h1++;
            else{
                if(d[i].h1>0)d[i].h1--;
                else{d[i].h2++;}
    	     }
            }
        }
        sort(d+1,d+n+1);
    //    sort(d+1,d+n+1);
        int cnt=0;
        for(int i=1;i<=n;i++){
            int _t=s[d[i].id].length();
            for(int j=0;j<_t;j++)str[++cnt]=s[d[i].id][j];
        }
        int a1=0,b1=0;
        for(int i=1;i<=cnt;i++){
            if(str[i]=='(')a1++;
            else{
            if(a1)a1--,ans++;
            else b1++;
            }
    /*	ans+=2*min(b1,d[i].h2);
    	b1-=min(b1,d[i].h2);
    	b1+=d[i].h1;*/
        }
        ans*=2;
        cout<<ans<<endl;
       // for(int i=1;i<=n;i++)s[i].clear();
        }
        return 0;
    }
    

    1003(模拟)

    模拟一下发现可以从左往右取,如果有x相同的可以取y最大或者y最小的。

    /**
    *         ┏┓    ┏┓
    
                ┏┛┗━━━━━━━┛┗━━━┓
                ┃       ┃  
                ┃   ━    ┃
                ┃ >   < ┃
                ┃       ┃
                ┃... ⌒ ...  ┃
                ┃ ┃
                ┗━┓ ┏━┛
                 ┃ ┃ Code is far away from bug with the animal protecting          
                 ┃ ┃ 神兽保佑,代码无bug
                 ┃ ┃           
                 ┃ ┃       
                 ┃ ┃
                 ┃ ┃           
                 ┃ ┗━━━┓
                 ┃ ┣┓
                 ┃ ┏┛
                 ┗┓┓┏━━━━━━━━┳┓┏┛
                  ┃┫┫ ┃┫┫
    
                  ┗┻┛ ┗┻┛
        */
        include<cstdio>
        include<cstring>
        include<algorithm>
        include<iostream>
        include<queue>
        include<cmath>
        include<map>
        include<stack>
        include<set>
        define inc(i,l,r) for(int i=l;i<=r;i++)
        define dec(i,l,r) for(int i=l;i>=r;i--)
        define link(x) for(edge *j=h[x];j;j=j->next)
        define mem(a) memset(a,0,sizeof(a))
        define ll long long
        define eps 1e-12
        define succ(x) (1<<x)
        define lowbit(x) (x&(-x))
        define sqr(x) ((x)*(x))
        define mid (x+y>>1)
        define NM 1000005
        define nm 2000005
        define N 1000005
        define M(x,y) x=max(x,y)
    
        const double pi=acos(-1);
        const ll inf=998244353;
        using namespace std;
        ll read(){
        ll x=0,f=1;char ch=getchar();
        while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
        while(isdigit(ch))x=x10+ch-'0',ch=getchar();
        return fx;
        }
    
    struct P{
    int x,y,i;
    bool operator<(const P&o){return x<o.x||(x==o.x&&y<o.y);}
    }a[NM];
    int n;
    
    int main(){
    int =read();while(--){
    n=read()*3;
    inc(i,1,n)a[i].x=read(),a[i].y=read(),a[i].i=i;
    sort(a+1,a+1+n);
    inc(i,1,n){
    if(i%3)printf("%d ",a[i].i);else printf("%d
    ",a[i].i);
    }
    }
    }
    

     1004(6301)Distinct Values

    题解:找到每个位置被限制的最左端点的位置 然后求这个区间的mex  弱鸡写了主席树做法 双制作+set的并没有想到

    #include <bits/stdc++.h>
    const int MAXN=1e5+10;
    using namespace std;
    typedef struct node{
        int l,r,vis;int len;
    }node;
    node d[MAXN*21];int rt[MAXN];
    int cnt;
    void update(int &x,int y,int l,int r,int t){
        x=++cnt;d[x]=d[y];d[x].len++;
      //  cout<<l<<"===----"<<r<<endl;
        if(l==r){
    	//if(!d[x].vis)d[x].len=1,d[x].vis=1;
    	return ;
        }
        int mid=(l+r)>>1;
        if(t<=mid)update(d[x].l,d[y].l,l,mid,t);
        else update(d[x].r,d[y].r,mid+1,r,t);
        d[x].len=d[d[x].l].len+d[d[x].r].len;
       // cout<<l<<" "<<r<<" "<<d[x].len<<endl;
    }
    int ans;
    void querty(int x,int y,int l,int r){
        if(l==r){ans=l;return ;}
        int mid=(l+r)>>1;
      //  cout<<l<<"===="<<r<<" "<<d[d[y].l].len<<" "<<d[d[x].l].len<<endl;
        if(d[d[y].l].len-d[d[x].l].len!=mid-l+1)querty(d[x].l,d[y].l,l,mid);
        else querty(d[x].r,d[y].r,mid+1,r);
    }
    typedef struct Q{
       int l,r;
       friend bool operator<(Q aa,Q bb){
           if(aa.l==bb.l)return aa.r>bb.r;
           return aa.l<bb.l;
       }
    }Q;
    Q que[MAXN];
    int ans1[MAXN],pre[MAXN];
    int main(){
        int _;scanf("%d",&_);
        while(_--){
    	int n,m;scanf("%d%d",&n,&m);
    	cnt=0;
    	for(int i=1;i<=m;i++)scanf("%d%d",&que[i].l,&que[i].r);
    	sort(que+1,que+m+1);
    	int be=1;
    	for(int i=1;i<=m;i++){
    	    while(be<que[i].l)pre[be]=0,ans1[be]=1,be++;
    	    while(be<=que[i].r)pre[be]=que[i].l,be++;
    	}
    	for(;be<=n;be++)pre[be]=0,ans1[be]=1;
    //	for(int i=1;i<=n;i++)cout<<pre[i]<<" ";
    //	cout<<endl;
    	int l=1;ans=1;int r=0;
    	for(int i=1;i<=m;i++){
    	    while(l<que[i].l)ans1[l]=1,rt[l]=rt[l-1],l++;
    	    r=0;
    	    while(l<=que[i].r){
    		querty(rt[que[i].l-1],rt[l-1],1,n);ans1[l]=ans;
    	//	cout<<l<<":::::"<<ans<<endl;
    		update(rt[l],rt[l-1],1,n,ans);
    	//	cout<<"--------"<<endl;
    		l++;
    	    }
    	}
    	for(;l<=n;l++)ans1[l]=1;
    	for(int i=1;i<=n;i++){if(i==1)printf("%d",ans1[i]);else printf(" %d",ans1[i]);}
    	printf("
    ");
        }
    }
    

    1007队友博客https://blog.csdn.net/qkoqhh/article/details/81181298

    1008(6305) RMQ Similar Sequence

    题解:http://tokitsukaze.live/2018/07/23/hdu6305/

    大佬的博客有详细题解 简单说只要证明B数组是一个排列 后面的做法就很显然...分治+st表

    /*#include <algorithm>
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <cmath>
    #pragma comment(linker, "/STACK:1024000000,1024000000")*/
    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int MAXN=1e6+10;
    const ll mod=1e9+7;
    //int n;
    /*ll read(){
        ll x=0,f=1;char ch=getchar();
        while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
        while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
        return f*x;
    }*/
    struct FastIO
    {
        static const int S=200;
        int wpos;
        char wbuf[S];
        FastIO():wpos(0){}
        inline int xchar()
        {
            static char buf[S];
            static int len=0,pos=0;
            if(pos==len) pos=0,len=fread(buf,1,S,stdin);
            if(pos==len) exit(0);
            return buf[pos++];
        }
        inline int read()
        {
            int s=1,c=xchar(),x=0;
            while(c<=32) c=xchar();
            if(c=='-') s=-1,c=xchar();
            for(;'0'<=c&&c<='9';c=xchar()) x=x*10+c-'0';
            return x*s;
        }
        ~FastIO()
        {
            if(wpos) fwrite(wbuf,1,wpos,stdout),wpos=0;
        }
    }io;
    ll ksm(ll a,ll b){
        ll ans=1ll;
        while(b){
        if(b&1)ans=ans*a%mod;
        a=a*a%mod;b>>=1;
        }
        return ans;
    }
    int a[MAXN];int pos[MAXN][22];
    int mu[22],ma[MAXN];ll fav[MAXN],sum[MAXN];
    int pmin(int aa,int bb){
        if(a[aa]==a[bb])return min(aa,bb);
        return a[aa]>a[bb]?aa:bb;
    }
    void St(int n){
        for(int i=1;i<=n;i++){pos[i][0]=i;
        for(int j=1;i+(1<<(j-1))<=n+1;j++)pos[i][j]=0;    
        }
        for(int j=1;mu[j-1]<=n;j++){
        for(int i=1;i+mu[j]<=n+1;i++){
            int t=mu[j-1];
           // if(dp[i][j-1]==dp[i+mu[j-1]][j-1])dp[i][j]=dp[i][j-1],pos[i][j]=min(dp[i][j-1],dp[i+mu[j-1]][j-1]);
           // else if(dp[i][j-1]>dp[i+mu[j-1]][j-1])dp[i][j]=dp[i][j-1],pos[i][j]=pos[i][j-1];
           // else dp[i][j]=dp[i+mu[j-1]][j-1],pos[i][j]=pos[i+mu[j-1]][j-1];
            pos[i][j]=pmin(pos[i][j-1],pos[i+t][j-1]);
        }
        }
    }
    int rmq(int l,int r){
       // int k=ma[r-l+1];
            int j=(int)(log10(r-l+1)/log10(2))+1;
        int i=r-(1<<(j-1))+1;
        return pmin(pos[l][j-1],pos[i][j-1]);
       // if(dp[l][k]==dp[r-mu[k]+1][k])return min(pos[l][k],pos[r-mu[k]+1][k]);
       // else if(dp[l][k]>dp[r-mu[k]+1][k])return pos[l][k];
       // else return pos[r-mu[k]+1][k];
      //  return pmin(pos[l][k],pos[r-mu[k]+1][k]);
    }
    ll C(int nn,int mm){
        //ll ret=1;
        if(mm<nn||nn<0) return 0;
       return  fav[nn]*fav[mm-nn]%mod*sum[mm]%mod;
        
    }
    namespace DFS
    {
        struct node{int l,r;};
        int top;
        node st[MAXN];
        ll dfs(int mn,int mx)
        {
            ll res=1;
            int l,r;
            l=mn;
            r=mx;
            top=0;
            st[top].l=l;
            st[top++].r=r;
            while(top)
            {
                l=st[top-1].l;
                r=st[--top].r;
                if(l>=r) continue;
                int pos=rmq(l,r);
            //    res*=fav[p-l];res%=mod;res*=fav[r-p];res%=mod;res*=sum[r-l];res%=mod;
                res=res*C(pos-l,r-l)%mod;
                st[top].l=l;
                st[top++].r=pos-1;
                st[top].l=pos+1;
                st[top++].r=r;
            }
            return res;
        }
    }
    
    /*ll C(ll n,ll m){
        if(n>m) return 0;
        ll a=1,b=1;
        for(int i=m;i>=m-n+1;i--) a=a*i%mod;
        for(int i=1;i<=n;i++) b=b*i%mod;
        return (a*(ksm(b,mod-2)%mod)%mod);
    }
    ll Lucas(ll n,ll m){
        if(n==0) return 1;
        return (1ll*C(n%mod,m%mod)*Lucas(n/mod,m/mod))%mod;
    }*/
    int p;
    ll dfs(int l,int r){
        //cout<<l<<" "<<r<<endl;
        if(l>=r)return 1LL;
      //  cout<<l<<" "<<r<<" "<<p<<endl;
        p=rmq(l,r);
       // cout<<l<<" "<<r<<" "<<p<<" "<<fav[p-l]<<" "<<res<<endl;
       // cout<<res<<endl;
      return dfs(l,p-1)*dfs(p+1,r)%mod*C(p-l,r-l)%mod;
        //dfs(rmq(l,r)+1,r);
    }
    int main(){
        int _;int n;
        _=io.read();
        mu[0]=1;//ma[0]=-1;
       // scanf("%d",&_);
        //cout<<_<<endl;
        for(int i=1;i<=21;i++)mu[i]=mu[i-1]*2;
       // for(int i=1;i<MAXN;i++)if(!(i&(i-1)))ma[i]=ma[i-1]+1;else ma[i]=ma[i-1];
        sum[0]=1;fav[0]=1;
        for(int i=1;i<MAXN;i++)sum[i]=i*sum[i-1]%mod,fav[i]=ksm(sum[i],mod-2);
        //cout<<Lucas(2,3)<<endl;
        while(_--){
        n=io.read();
    //    scanf("%d",&n);
    //    memset(dp,0,sizeof(dp));memset(pos,0,sizeof(dp));
        for(int i=1;i<=n;i++)a[i]=io.read();
        St(n);ll ans=DFS::dfs(1,n);
    //    cout<<res<<endl;
        ans*=ksm((sum[n])%mod,mod-2);ans%=mod;
        ans*=n;ans%=mod;ans*=ksm(2ll,mod-2);ans%=mod;
        printf("%lld
    ",ans);
        }
        return 0;
    }
    

    1011(6308)Time Zone

    题解:模拟

    #include <bits/stdc++.h>
    using namespace std;
    int main(){
        int n;scanf("%d",&n);double t;int x,y;
        while(n--){
    	char ch='1';
    	scanf("%d%d",&x,&y);
    	while((ch!='+'&&ch!='-'))ch=getchar();
    	scanf("%lf",&t);
    	if(ch=='-')t*=-1;
    	t-=8;bool flag=0;
    	if(t<0)flag=1,t*=-1;
    	t*=100;
    //	cout<<t<<endl;
    	int t3=round(t);
    //	cout<<t3<<endl;
    	int t1=t3/100;int t2=(t3/10-t1*10)*6;
    //	cout<<t1<<" "<<t2<<endl;
    	if(flag)t*=-1;
    	if(t<0)x-=t1,y-=t2;
    	else x+=t1,y+=t2;
    	if(y<0)x--,y+=60;
    	if(y>=60)x++,y-=60;
    	if(x<0)x+=24;
    	if(x>=24)x-=24;
    	if(x<=9)printf("0%d:",x);
    	else printf("%d:",x);
    	if(y<=9)printf("0%d
    ",y);
    	else printf("%d
    ",y);
        }
        return 0;
    }
    
  • 相关阅读:
    《C/C++实现Console下的加载进度条模拟[美观版]》
    VSCode六大通用插件真香合集
    视频+图文 String类干货向总结
    视频+图文+动画 详解插入排序(轻松易理解系列)
    【视频+图文】Java经典基础练习题(六):猴子吃桃子问题
    【视频+图文+动画】详解选择排序(轻松易理解系列)
    【视频+图文】Java经典基础练习题(五):键盘输入一个五位数,判断这个数是否为回文数
    【视频+图文+动画】详解冒泡排序(万字长文,超级详细~~)
    详解时间、空间复杂度(内含彩蛋~~)
    【视频+图文】Java经典基础练习题(四):键盘输入一个正整数,获取这个正整数的每一位并将其输出
  • 原文地址:https://www.cnblogs.com/wang9897/p/9357503.html
Copyright © 2011-2022 走看看