zoukankan      html  css  js  c++  java
  • 洛谷 P2827 蚯蚓

    题目链接

    首先我们有堆的朴素做法

    维护蚯蚓长度的堆,每次取出最大,然后按照题意切割,再放回堆内.

    长度增加有点麻烦,我们考虑维护一个全局的add懒标记,使得堆内的数+add等于蚯蚓长度,因此每次分割所得的数要减去q.

    这样写复杂度为(O(mlog_2 n)) 不能AC,仅85pts,但是写起来真的快

    [code]

    #include <bits/stdc++.h>
    using namespace std;
    
    int read(){
    	int x=0; char c; int flag=1;
    	for(c=getchar();!isdigit(c);c=getchar()) if(c=='-') flag=-1;
    	for(;isdigit(c);c=getchar()) x=((x+(x<<2))<<1)+(c^48);
    	return x*flag;
    }
    
    int add;
    priority_queue<int> Q;
    int n,m,q,u,v,t;
    
    signed main() {
        n=read(),m=read(),q=read(),u=read(),v=read(),t=read();
        double p=(double)u/v;
    	for(int i=1;i<=n;i++) Q.push(read());
        add=0;
        for(int i=1;i<=m;i++){
    	    int val=Q.top()+add; Q.pop();
    	    if(i%t==0) printf("%d ",val);
    	    int v1=floor(val*p),v2=val-v1;
    	    Q.push(v1-q-add); Q.push(v2-q-add);
    	    add+=q;
    	}
    	puts("");
    	for(int i=1;i<=n+m;i++){
    	    int val=Q.top()+add; Q.pop();
    	    if(i%t==0) printf("%d ",val);
    	}
    	puts("");
    	return 0;
    }
    
    

    100pts

    我们维护3个队列,队列1表示一开始的蚯蚓,队列2表示切出来较大的蚯蚓,队列3表示切出来较小的蚯蚓

    对于原序列,从大到小排序,易得到先被切的蚯蚓的两部分比后切的蚯蚓的两部分分别较大,我们因此发现队列的元素单调递减

    每次从三个队列里查找最大值即可,同样维护一个全局add

    最后合并三个队列,随便实现.

    [code]

    #include <bits/stdc++.h>
    using namespace std;
    #define int long long
    
    int read(){
    	int x=0; char c; int flag=1;
    	for(c=getchar();!isdigit(c);c=getchar()) if(c=='-') flag=-1;
    	for(;isdigit(c);c=getchar()) x=((x+(x<<2))<<1)+(c^48);
    	return x*flag;
    }
    
    int add;
    int n,m,q,u,v,t;
    double p;
    int a[100010];
    queue<int> q1,q2,q3;
    
    int get(){
        int val=-(1<<30);
        if(!q1.empty()) val=max(val,q1.front()+add);
        if(!q2.empty()) val=max(val,q2.front()+add);
        if(!q3.empty()) val=max(val,q3.front()+add);
        if(!q1.empty()&&val==q1.front()+add) q1.pop();
        else
        if(!q2.empty()&&val==q2.front()+add) q2.pop();
        else
        if(!q3.empty()&&val==q3.front()+add) q3.pop();
        return val;
    }
    
    signed main() {
        n=read(),m=read(),q=read(),u=read(),v=read(),t=read();
        p=(double)u/v;
        
    	for(int i=1;i<=n;i++) a[i]=read();
    	sort(a+1,a+n+1);
    	
    	for(int i=n;i>=1;i--) q1.push(a[i]);
    	
    	add=0;
    	
    	for(int i=1;i<=m;i++){
    	    int val=get();
    	    if(i%t==0) printf("%lld ",val);
    	    int v1=floor(val*p),v2=val-v1;
    	    if(v1<v2) swap(v1,v2);
    	    add+=q;
    	    q2.push(v1-add); q3.push(v2-add);
    	}
    	puts("");
    	
    	for(int i=1;i<=n+m;i++){
    	    int val=get();
    	    if(i%t==0) printf("%lld ",val);
    	}
    	puts("");
    	return 0;
    }
    
    
  • 相关阅读:
    Golang (Go语言) Mac OS X下环境搭建 环境变量配置 开发工具配置 Sublime Text 2
    网站状态保存方法
    学习MVC第一课:初识MVC
    ASP.NET MVC 中动态从路由中获取URL
    ASP.NET MVC2程序开发入门到精通系列课程01
    OpenCV 里的sigma 是多少
    日期大小比较
    安装完ODAC,出现ORA12560:TNS:协议适配器错误
    Spring+IBATIS+Struts2开发流程
    【转】SSH标准配置
  • 原文地址:https://www.cnblogs.com/zzhzzh123/p/12076978.html
Copyright © 2011-2022 走看看