zoukankan      html  css  js  c++  java
  • UOJ264&&vijos2007&&bzoj4721&&noip2016 蚯蚓

    noip的题目都好长啊

    懒得搬过来了

    有需要的人自己去标题的网站上找吧

    自己想的是nlogn的算法

    对时间复杂度了解不够

    以为可以通过

    但实际上会T掉三个点

    然后就去看了题解

    推荐一篇特别好的博客http://www.cnblogs.com/ljh2000-jump/p/6189057.html

    有详细说明是如何想到正解的

    这里就不赘述了

    发现很多题目套路都是先打部分分

    打完部分分之后得到启发

    进而打出正解

    这题也是

    根据部分分q=0时的单调性推出q!=时也具有单调性

    ——————————分割线———————————————

    接下来让我哭诉一波(调这道题调了两三天啊)

    然而我在vijos上a了之后

    在bzoj上pe了无数次

    终于把格式调对了之后

    就WA了

    然后就开始各种乱改

    乱改一波long long后

    发现同样的代码同样的数据

    别人的电脑跑得跟我的不一样?

    然后就重装一波编译器?

    然后还是不一样?

    于是放弃(有这方面知识的可以发评论告诉一波博主啊)

    于是重新拿起我改之前的代码

    交了一波uoj(感谢uoj感谢uoj感谢uoj

    然后也是前20个数据(估计可能是原题数据)全过

    但它的extra data我就开始wa了

    第一个wa点是精度问题

    那一个*u/v的东西

    我脑抽在他前面加了个*1.0

    于是就变成浮点数了

    于是就有浮点误差了

    于是就wa了

    这启示我们:一定要注意精度误差啊

    第二个wa点:

    一波大数据

    这叫我怎么调!

    于是认真研究了一份网上代码

    发现唯一区别的地方可能就是取max的初值了

    于是就把我的max=-1e9改成了max=-2*1e9

    心里有点小忐忑

    不会是因为这个吧

    于是就交一波

    于是就a了a了a了

    太激动了

    终于a了

    仔细分析一波

    队列里的元素确实有可能爆-1e9

    这就提醒我们

    写代码一定要分析全面

    认真分析

    然后有时分析不到地方

    就只能靠你平时码风了

    所以平时码风一定要好

    所以记住:max一定要赋-inf max一定要赋-inf max一定要赋-inf

    然后 inf一定要尽量小

    ——————————分割线———————————————

    这是我T3个点85分的代码(堆,全局标记)

    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<iostream>
    #include<cmath>
    struct node
    {
    	int x;
    	bool operator <(const node &k)
    	const 
    	{
    		return x<k.x;
    	}
    }e;
    std::priority_queue<node>qu;
    int read()
    {
    	int ans=0;char t=getchar();
    	while(t>'9'||t<'0')	t=getchar();
    	while(t<='9'&&t>='0')	ans=ans*10+t-'0',t=getchar();
    	return ans;
    }
    int main()
    {
    	int n=read(),m=read(),q=read(),u=read(),v=read(),t=read();int k;
    	double chu=u*1.0/v;
    	for(int i=1;i<=n;i++)
    	{
    		k=read(),qu.push((node){k});
    	}
    	int jia=0;
    	for(int i=1;i<=m;i++)
    	{	
    		node a=qu.top();	qu.pop();
    		if(i%t==0)	printf("%d ",a.x+jia);
    		int rr=(a.x+jia)*1.0*chu;
    		qu.push((node){rr-q-jia});
    		qu.push((node){a.x+jia-rr-q-jia});
    		jia+=q;
    	}
    	printf("
    ");int sum=0;
    	while(!qu.empty())
    	{
    		sum++;
    		node a=qu.top();	qu.pop();
    		if(sum%t==0)printf("%d ",a.x+jia);
    	}
    	return 0;
    }
    还有ac的代码(有点丑)

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    int read()
    {
        int ans=0;char t=getchar();
        while(t>'9'||t<'0')   t=getchar();
        while(t>='0'&&t<='9') ans=ans*10+t-'0',t=getchar();
        return ans;
    }
    const int N=8*1e6;
    int q1[N],q2[N],q3[N];
    bool cmp(int a,int b)
    {
        return a>b;
    }
    int main()
    {
        int n=read(),m=read(),q=read(),u=read(),v=read(),t=read();
        for(int i=1;i<=n;i++)
        scanf("%d",&q1[i]);
        std::sort(q1+1,q1+1+n,cmp);
        int head1=1,tail1=n,head2=1,tail2=0,head3=1,tail3=0,max;
        int tag=0,maxi=0;
        for(int i=1;i<=m;i++)
        {
            max=-2*1e9;maxi=0;
            if(head1<=tail1&&q1[head1]>max)   max=q1[head1],maxi=1;
            if(head2<=tail2&&q2[head2]>max)   max=q2[head2],maxi=2;
            if(head3<=tail3&&q3[head3]>max)   max=q3[head3],maxi=3;
            int  rr=( (long long ) (max+tag) )*u/v;
            if(i%t==0)
            printf(i+t>m?"%d":"%d ",max+tag);
            if(maxi==1)         head1++,q2[++tail2]=rr-tag-q,q3[++tail3]=max-rr-q;
            else if(maxi==2)    head2++,q2[++tail2]=rr-tag-q,q3[++tail3]=max-rr-q;
            else                head3++,q2[++tail2]=rr-tag-q,q3[++tail3]=max-rr-q;
            tag+=q;
        }
        printf("
    ");
        int sum=1;
        while((head1<=tail1)||(head2<=tail2)||(head3<=tail3))
        {
            max=-2*1e9;maxi=0;
            if(head1<=tail1&&q1[head1]>max)   max=q1[head1],maxi=1;
            if(head2<=tail2&&q2[head2]>max)   max=q2[head2],maxi=2;
            if(head3<=tail3&&q3[head3]>max)   max=q3[head3],maxi=3;
            if(maxi==1)     head1++;
            else if(maxi==2)        head2++;
            else    head3++;
            if(sum%t==0)    printf(sum+t>n+m?"%d":"%d ",max+tag);
            sum++;
        }
        return 0;
    }




  • 相关阅读:
    J2SE之网络编程
    JAVA正则表达式语法大全
    JAVA小程序在线聊天系统
    简单小程序代码行数计数器
    android回调函数总结
    MetaCharacters正则表达式
    简单小程序抓取网页中的email地址。
    Oracle学习<二>
    html标签大全
    如何做页面优化
  • 原文地址:https://www.cnblogs.com/Brian551/p/7353016.html
Copyright © 2011-2022 走看看