zoukankan      html  css  js  c++  java
  • 0515比赛感慨

    据说难度不大的四道题,结果暴力都被打崩了.....

    第一题就是大水题了,预处理一波满足条件的花的数,再一遍循环求一个前缀和,然后输入什么O(1)做个减法就成了;

    总时间复杂度O(t)

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int t,l,r;
     4 int flow[100100];
     5 int sumf[100100];
     6 char buf[1<<15],*fs,*ft;
     7 inline char getc(){return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;}
     8 inline int read()
     9 {
    10     int x=0,f=1;  char ch=getc();
    11     while(!isdigit(ch))  {if(ch=='-')  f=-1;  ch=getc();}
    12     while(isdigit(ch))  {x=x*10+ch-'0';  ch=getc();}
    13     return x*f;
    14 }
    15 void put(int x)
    16 {
    17     if(x==0){putchar('0'); putchar('
    '); return;}
    18     if(x<0){putchar('-'); x=-x;}
    19     int num=0;
    20     char ch[16];
    21     while(x) ch[++num]=x%10+'0',x/=10;
    22     while(num) putchar(ch[num--]);
    23     putchar('
    ');
    24 }
    25 inline int abss(int a,int b){return a-b>0?a-b:b-a;}
    26 void work()
    27 {
    28     int xx,yy,k;
    29     for(int i=1;i<=100001;i++)
    30     {
    31         xx=yy=0;
    32         k=i;
    33         while(k)
    34         {
    35             if(k%6==1) xx++;
    36             k/=6;
    37         }
    38         k=i;
    39         while(k)
    40         {
    41             if(k%9==1) yy++;
    42             k/=9;
    43         }
    44         if(abss(xx,yy)<2) flow[i]=1;
    45     }
    46     for(int i=1;i<=100001;i++)
    47     {
    48         sumf[i]=sumf[i-1]+flow[i];
    49     }
    50     return;
    51 }
    52 int main()
    53 {
    54     work();
    55     t=read();
    56     for(int i=1;i<=t;i++)
    57     {
    58         l=read();
    59         r=read();
    60         put(sumf[r]-sumf[l-1]);
    61     }
    62     return 0;
    63 }

    第二题就是暴力错的第一题,原思路是每次比赛都sort,结果最后一行打成for(int i=1;i<=n;){if(a[i].xx==1)printf("%d %d",i,a[i].v);break;}我选择撞墙...........

    事实上不用sort这种O(nlogn)肯定会超时的排序,因为每次的增量只有一半的人增,且最多是1,所以只会涉及到最多o(n)次左右交换,但第一次排序还是要sort一下 

    目测复杂度是O(nr)的

    #include<bits/stdc++.h>
    using namespace std;
    int n;
    struct gamer
    {
    	int v,p,xx;
    }a[1000010];
    int r;
    char buf[1<<15],*fs,*ft;
    inline char getc(){return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;}
    inline int read()
    {
    	int x=0,f=1;  char ch=getc();
    	while(!isdigit(ch))  {if(ch=='-')  f=-1;  ch=getc();}
    	while(isdigit(ch))  {x=x*10+ch-'0';  ch=getc();}
    	return x*f;
    }
    bool mycmp(gamer a,gamer b){return a.v==b.v?a.xx<b.xx:a.v>b.v;}
    int main()
    {
    	n=read();
    	n=n*2;
    	for(register int i=1;i<=n;++i)
    	{
    		a[i].v=read();
    		a[++i].v=read();
    	}
    	for(register int i=1;i<=n;++i)
    	{
    		a[i].p=read();
    		a[i].xx=i;
    		a[++i].p=read();
    		a[i].xx=i;
    	}
    	r=read();
    	sort(a+1,a+1+n,mycmp);
    	for(register int i=1;i<=r;++i)
    	{
    		for(register int j=1;j<=n;j+=2){a[j].p>a[j+1].p?a[j].v++:a[j+1].v++;}
    		for(register int j=1;j<n;j++)
        {
        register int k=j;while(k&&(a[k].v<a[k+1].v||a[k].v==a[k+1].v&&a[k].xx>a[k+1].xx)) {
    swap(a[k].v,a[k+1].v);swap(a[k].p,a[k+1].p);swap(a[k].xx,a[k+1].xx);--k;}//核心就是这几句了
        }
    	}
    	sort(a+1,a+1+n,mycmp);
    	for(register int i=1;i<=n;++i){if(a[i].xx==1){ printf("%d %d",i,a[i].v);break;}}
    	return 0;
    }
    

      

    凑合看吧...........

    第三题先跳过(因为还没改完(逃))

    第四题,树状数组打的暴力竟然全炸了......一个数据都不过.......

    好吧不说暴力,只需扫一遍,对于每个数,找一下左边连续比他大的,右边连续比他大的,小的也一样,然后左长度*右长度*这个数就是它对答案的贡献,大就是正小就是负

    复杂度的话....100000的随机数据是可以的,精心设计过的就可能会炸......

    这玩意过不了300000的数据,300000的话就只能上单调栈了......

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int n;
     4 int a[100100];
     5 inline int read()
     6 {
     7     int num=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
     8     while(isdigit(ch)){num=num*10+ch-'0';ch=getchar();}
     9     return num*f;
    10 }
    11 int main()
    12 {
    13     n=read();
    14     register int i=1;
    15     for(;i<=n;++i){a[i]=read();}
    16     long long ans=0;
    17     for(i=1;i<=n;++i)
    18     {
    19         register int k=i-1;
    20         long long l=1,r=1;
    21         while(a[k]>a[i]&&k>0) {--k;++l;}
    22         k=i+1;
    23         while(a[k]>=a[i]&&k<=n) {++k;++r;}
    24         ans-=l*r*a[i];
    25         k=i-1;
    26         l=1,r=1;
    27         while(a[k]<a[i]&&k>0){--k;++l;}
    28         k=i+1;
    29         while(a[k]<=a[i]&&k<=n){++k;++r;}
    30         ans+=l*r*a[i];
    31     }
    32     cout<<ans;
    33     return 0;
    34 }

     

  • 相关阅读:
    做程序员,我骄傲了吗?
    乐字节Java面向对象三大特性以及Java多态
    Java为什么有前途?什么人适合学Java?
    Java新手从入门到精通的学习建议
    Java变量与数据类型之二:Java常量与变量
    模块化、结构化的代码,程序员正讲述着人生
    乐字节Java变量与数据类型之一:Java编程规范,关键字与标识符
    乐字节Java学习课程-path环境变量的作用与配置
    我英语不好,能学会编程吗?
    为什么欧拉图要用栈存然后逆着输出
  • 原文地址:https://www.cnblogs.com/y981204839/p/9052740.html
Copyright © 2011-2022 走看看