【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 }
初中大佬的贪心

我拒绝模拟退火

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

原文地址:https://www.cnblogs.com/lxyyyy/p/10328025.html