• 【2019.10.31】nowcoder提高组赛前训练2


    服务器需求

    我觉得我考场上也想不到

    (ans=max(a_i,ceil(sum/m)))

    模拟的话 每加一台服务器就是选择最大需求消1 总的就需要(ceil(sum/m))

    考虑有一天需求量贼大 其他所有的天数都做完了他还有剩的(因为一次操作只能消掉一天)

    好叭还是感性理解一下

    我们假定已知答案 (x),即需要的最少的服务器个数。
    显然对于任意 (i),有 (xge a_i)。接下来考虑如何安排这些服务器。
    对所有的服务器编号,从 (1)(n)。不妨将前 (a_1) 台服务器安排给第一天,将接下来 (a_2) 台服务器安排给第二天,以此类推。如果第某一天安排时,安排完了所有的服务器,则再从第一台服务器开始安排。
    通过这种安排方案,可以保证在 (x ge a_i) 的情况下不会让同一台服务器在同一天内工作两次。而让每一台服务器运行不超过 (m) 天,就需要服务器需求的总天次(即 (sum{a_i}))小于等于所有服务器可以工作的总天次(即 (x cdot m))。也即(sum{ a_i } le x cdot m)
    考虑到 (x) 必须是个整数,即(lceilfrac{sum {a_i}}{m} ceil le x)
    反推可以获得 (x) 的答案,取最小值即为右式(xge max left(a_i,lceil frac{sum {a_i}}{m} ceil ight))考虑暴力修改计算,时间复杂度 (mathcal{O}(nq))

    int n,m,q,a[N];
    ll sum;
    multiset<ll>s;
    multiset<ll>::iterator its;
    int main(){
    #ifndef ONLINE_JUDGE
        freopen("T1.txt","r",stdin);
    #endif
    	rd(n),rd(m),rd(q);
    	for(int i=1;i<=n;++i) rd(a[i]),sum+=(ll)a[i],s.insert(-a[i]);
    	printf("%lld
    ",max(-*s.begin(),(ll)(ceil((double)sum/m))));
    	for(int i=1,x,y;i<=q;++i){
    		rd(x),rd(y);
    		its=s.find(-a[x]),s.erase(its);
    		s.insert(-y),sum+=y-a[x],a[x]=y;
    		printf("%lld
    ",max(-*s.begin(),((ll)ceil((double)sum/m))));
    	}
    	return 0;
    }
    

    沙漠点列

    只得了(K=0)和为(0)的情况的分

    其实考场上想到的就是正解 但是我思维特别混乱 就gg了

    其实我也并没有掌握搞环的那顿操作 算是查到了以前的惊天大洞

    先删掉途中所有割边 每删一个割边就会多一个连通块 删完割边之后就得自己创造割边 贪心每次拆开一个当前最长的环

    我居然才真正理解到(tarjan),它无向图按有向图跑缩点最后的(Bcnt)减去连通块数得到割边数

    不搞了QAQ搞不动了 90昏够了

    int head[N],tot=0;
    struct edge{int v,nxt;}e[M<<1];
    void add(int u,int v){e[++tot]=(edge){v,head[u]},head[u]=tot;}
    
    int Bcnt=0,idx=0,dfn[N],low[N],s[N];bool inst[N];
    void tarjan(int u,int ff){
    	dfn[u]=low[u]=++idx,s[++s[0]]=u,inst[u]=1;
    	for(int i=head[u],v;i;i=e[i].nxt)
    	if((v=e[i].v)!=ff){
    		if(!dfn[v]) tarjan(v,u),low[u]=min(low[u],low[v]);
    		else if(inst[v]&&dfn[v]<low[u]) low[u]=dfn[v];
    	}
    	if(low[u]==dfn[u]){
    		int v;++Bcnt;
    		do{v=s[s[0]--],inst[v]=0;}while(u!=v);
    	}
    }
    
    int dis[N],cir[N];
    void dfs(int u,int ff){
    	for(int i=head[u],v;i;i=e[i].nxt)
    	if((v=e[i].v)!=ff){
    		if(!dis[v]) dis[v]=dis[u]+1,dfs(v,u);
    		else if(dis[v]<dis[u]+1) cir[++cir[0]]=dis[u]-dis[v]+1;
    	}
    }
    
    int main(){
    #ifndef ONLINE_JUDGE
        freopen("T2.txt","r",stdin);
    #endif
        rd(n),rd(m),rd(K);
        for(int i=1,u,v;i<=m;++i) rd(u),rd(v),add(u,v),add(v,u);
        for(int i=1;i<=n;++i) if(!dfn[i]) ++bcnt,tarjan(i,0);
        if(Bcnt-bcnt>=K) return printf("%d",K+bcnt),0;
        ans=Bcnt,K-=Bcnt-bcnt,cir[0]=0;
        for(int i=1;i<=n;++i) if(!dis[i]) dfs(i,0);
        sort(cir+1,cir+cir[0]+1);
        for(int i=cir[0];i&&K>=0;--i){
        	--K;
        	ans+=min(K,cir[i]-1),K-=cir[i]-1;
    	}
    	printf("%d",ans);
    	return 0;
    }
    

    维护序列

    考试的时候写成了if(a[i]==x).... else if(a[i]==y)(x=y)时这样就错了....

    然后这个代码50昏

    void upd(int l,int r,int k){for(int i=l;i<=r;++i) a[i]=k;}
    void query(int x,int y,int &las){
        int pa=0,pb=0;las=inf;
        for(int i=1;i<=n;++i){
            if(a[i]==x) las=Min(las,pb?abs(i-pb):inf),pa=i;
            if(a[i]==y) las=Min(las,pa?abs(i-pa):inf),pb=i;}
        if(!pa||!pb){puts("-1");las=0;return;}
        printf("%d
    ",las);
    }
    void work(){
        for(int i=1,opt,x,y,k,lasans=0;i<=m;++i){
            rd(opt),rd(x),rd(y);
            if(zx) x^=lasans,y^=lasans;
            if(opt==1) rd(k),k^=(zx?lasans:0),upd(x,y,k);
            else query(x,y,lasans);
        }
    }
    
    int main(){
    #ifndef ONLINE_JUDGE
        freopen("T3.txt","r",stdin);
    #endif
        rd(n),rd(m),rd(zx);
        for(int i=1;i<=n;++i) rd(a[i]);
        work();
        return 0;
    }
    
  • 相关阅读:
    批量更新sql |批量update sql
    智力测试题3
    【管理心得之二十一】管得少就是管得好
    查看sqlserver被锁的表以及如何解锁
    AD域相关的属性和C#操作AD域
    毕业5年小结一下
    WPF版公司的自动签到程序
    用友畅捷通高级前端笔试题(一)凭借回忆写出
    .NET中制做对象的副本(三)通过序列化和反序列化为复杂对象制作副本
    .NET中制做对象的副本(二)继承对象之间的数据拷贝
  • 原文地址:https://www.cnblogs.com/lxyyyy/p/11776840.html
Copyright © 2020-2023  润新知