zoukankan      html  css  js  c++  java
  • 【2019.1.27】

    T1 最大子序列的和

    据芸哥的评价:“这是暴得不能更暴的暴力了,你不超时谁超时” 

    我是真的菜QAQ单调队列写了一半被标签上的线段树骗到 我的心路历程:“咦线段树!我不会诶,可以写树状数组嘛!呀超时怎么办 不怕不怕,怎么样都能过一个点的”,然后,呵呵,你一个点都不给我QAQ!!

     1 /*
     2 id:gww
     3 language:
     4 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 
     5 */
     6 #include<bits/stdc++.h>
     7 #define ll long long
     8 using namespace std;
     9 const int N=500000+10;
    10 const int inf=0x3f3f3f3f;
    11 int n,a,b,k[N],c[N],ans=-inf;
    12 int rd()
    13 {
    14     int x=0,w=0;char ch=0;
    15     while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
    16     while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    17     return w?-x:x;
    18 }
    19  
    20 int lowbit(int x)
    21 {
    22     return x&(-x);
    23 }
    24  
    25 void update(int x,int y)
    26 {
    27     while(x<=n)
    28     {
    29         c[x]+=y;
    30         x+=lowbit(x);
    31     }
    32 }
    33  
    34 int query(int x)
    35 {
    36     int ans=0;
    37     while(x>0)
    38     {
    39         ans+=c[x];
    40         x-=lowbit(x);
    41     }
    42     return ans;
    43 }
    44  
    45 int main()
    46 {
    47     n=rd(),a=rd(),b=rd();
    48     for(int i=1;i<=n;i++)
    49     {update(i,rd());}
    50     for(int i=b;i<=n;i++)
    51     for(int j=i;j>=i-a;j--)
    52     {
    53         ans=max(ans,query(i)-query(j-1));
    54     }
    55     printf("%d",ans);
    56     return 0;
    57 }
    0昏 时间超限

    单调队列写出来都长一个样子QAQ

     1 /*
     2 id:gww
     3 language:
     4 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 
     5 */
     6 #include<bits/stdc++.h>
     7 #define ll long long
     8 using namespace std;
     9 const int N=500000+10;
    10 const int inf=0x3f3f3f3f;
    11 int n,a,b,k[N],q[N],ans=-inf;
    12 int rd()
    13 {
    14     int x=0,w=0;char ch=0;
    15     while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
    16     while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    17     return w?-x:x;
    18 }
    19  
    20 int main()
    21 {
    22     n=rd(),a=rd(),b=rd();
    23     for(int i=1;i<=n;i++)
    24     {k[i]=rd();k[i]+=k[i-1];}
    25     int tail=1,head=0;
    26     for(int i=a;i<=n;i++)
    27     {
    28         while(head<=tail&&q[head]<i-b) head++;//不超过b
    29         while(head<=tail&&k[q[tail]]>=k[i-a]) tail--;//不小于a 且判断sei更优秀
    30         q[++tail]=i-a;
    31         ans=max(ans,k[i]-k[q[head]]); 
    32     }
    33     printf("%d",ans);
    34     return 0;
    35 }
    100昏 单调队列

    线段树 我为什么总是有一些玄学错误!!!!

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=500000+5;
     4 #define lson l,m,rt<<1
     5 #define rson m+1,r,rt<<1|1
     6  
     7 typedef long long ll;
     8  
     9 ll s[maxn];
    10 int n,a,b;
    11 ll mi[maxn<<2];
    12  
    13 void pushup(int rt)
    14 {
    15     mi[rt]=min(mi[rt<<1],mi[rt<<1|1]);
    16 }
    17  
    18 void buildtree(int l,int r,int rt)
    19 {
    20     if(l==r)
    21     {
    22         mi[rt]=s[l];
    23         return;
    24     }
    25     int m=(l+r)>>1;
    26     buildtree(lson);
    27     buildtree(rson);
    28     pushup(rt);
    29 }
    30  
    31 ll query(int L,int R,int l,int r,int rt)
    32 {
    33     //printf("%d %d,%d %d %d
    ",L,R,l,r,rt);
    34     if(R<=0)return 0;
    35     if(R<l||L>r) return 1e15;
    36     if (L<=l&& R>=r)
    37     {
    38         return mi[rt];
    39     }
    40     int m=(l+r)>>1;
    41     ll ans=1e15;
    42     if(L<=m)ans=min(ans,query(L,R,lson));
    43     if(R>m)ans=min(ans,query(L,R,rson));
    44     return ans;
    45 }
    46  
    47 ll read()
    48 {
    49     ll x=0,f=1;char s=getchar();
    50     while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    51     while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
    52     return x*f;
    53 }
    54  
    55 void init()
    56 {
    57     freopen("input.txt","r",stdin);
    58     //freopen("output.txt","w",stdout);
    59 }
    60  
    61 void readdata()
    62 {
    63     n=read();a=read();b=read();
    64     s[0]=0;
    65     for(int i=1;i<=n;i++)
    66     {
    67         s[i]=read()+s[i-1];
    68     }
    69     buildtree(0,n,1);
    70 }
    71  
    72 void work()
    73 {
    74     ll ans=-1e15;
    75     for (int i=a;i<=n;i++)
    76     {
    77         ans=max(ans,s[i]-query(max(0,i-b),max(0,i-a),0,n,1));
    78     }
    79     printf("%lld",ans);
    80 }
    81  
    82 int main()
    83 {
    84     //init();
    85     readdata();
    86     work();
    87     return 0;
    88 }
    欧阳's线段树

    T3 数的划分

    让各个大佬来说就是,这个数据太水了

     1 /*id:gwwlanguage:啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 */
     2 #include<bits/stdc++.h>
     3 #define ll long long
     4 using namespace std;
     5 const int N=1000000+10;
     6 int n,m,c[N],a[20],ans=9999999,sum,cnt;
     7 int rd()
     8 {
     9     int x=0,w=0;char ch=0;    
    10     while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}    
    11     while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();    
    12     return w?-x:x;
    13 } 
    14 int main()
    15 {
    16     n=rd(),m=rd();
    17     for(int i=1;i<=n;i++)
    18     a[i]=rd();
    19     for(int i=1;i<=1000000;i++)
    20     {
    21         random_shuffle(a+1,a+n+1);
    22         sum=0,cnt=0;
    23         for(int i=1;i<=n;i++)
    24         {
    25             sum+=a[i];
    26             if(sum>m)
    27             {
    28                 cnt++;
    29                 sum=a[i];
    30             }
    31         }
    32         if(sum) cnt++;
    33         ans=min(ans,cnt);
    34     }
    35     printf("%d",ans);
    36     return 0;
    37 }
    随机化
     1 /*id:gwwlanguage:啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 */
     2 #include<bits/stdc++.h>
     3 #define ll long long
     4 using namespace std;
     5 const int N=20;
     6 const int M=1000000000+10;
     7 int n,m,a[N],ans=0,sum[N];
     8 bool vis[N];
     9 int rd()
    10 {
    11     int x=0,w=0;char ch=0;    
    12     while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}    
    13     while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();    
    14     return w?-x:x;
    15 } 
    16 int main()
    17 {
    18     memset(vis,0,sizeof(vis));
    19     n=rd(),m=rd();
    20     for(int i=1;i<=n;i++)
    21     a[i]=rd();
    22     sort(a+1,a+1+n);
    23     for(int i=n;i>=1;i--)//从小到大排序 故需要倒序枚举
    24     {
    25         if(!vis[i])
    26         {
    27             sum[i]=a[i];
    28             for(int j=i-1;j>=1;j--)//枚举比i小的
    29             if(!vis[j]&&sum[i]+a[j]<=m)
    30             {vis[j]=1;sum[i]+=a[j];}
    31         }
    32     }
    33     for(int i=1;i<=n;i++)
    34     if(sum[i]) ans++;
    35     printf("%d",ans);
    36     return 0;
    37 }
    初中大佬的贪心

    我拒绝模拟退火

    我可不可以也把正解拒绝了

  • 相关阅读:
    c++STL容器之deque容器
    c++STL容器之vector容器
    c++STL容器之string容器
    c++之STL基本认识
    c++之类模板案例
    c++之类模板和友元
    c++之类模板分文件编写
    c++之类模板成员函数的类外实现
    c++类模板与继承
    c++之类模板对象作函数参数
  • 原文地址:https://www.cnblogs.com/lxyyyy/p/10328025.html
Copyright © 2011-2022 走看看