夏令营回来后就不知道怎么回事,状态一直不好==
为了让自己不要太颓废,开个坑在noip前把一本通的好题都刷一遍。
如果想要noip拿省一的话,就要开始好好努力了。加油!
为了节省时间,一些比较简单的东西就不再赘述了。
第一部分 基础算法
第 1 章 贪心算法
按右端点排序。
1 #include <iostream>
2 #include <cstdio>
3 #include <algorithm>
4 #include <cstring>
5 #include <cmath>
6 #include <queue>
7 #include <map>
8 #define ll long long
9 #define ull unsigned long long
10 #define out(a) printf("%d ",a)
11 #define writeln printf("\n")
12 const int N=1e5+50;
13 using namespace std;
14 typedef int array[N];
15 int n;
16 int now=0,ans=0;
17 int read()
18 {
19 int s=0,t=1; char c;
20 while (c<'0'||c>'9'){if (c=='-') t=-1; c=getchar();}
21 while (c>='0'&&c<='9'){s=s*10+c-'0'; c=getchar();}
22 return s*t;
23 }
24 ll readl()
25 {
26 ll s=0,t=1; char c;
27 while (c<'0'||c>'9'){if (c=='-') t=-1; c=getchar();}
28 while (c>='0'&&c<='9'){s=s*10+c-'0'; c=getchar();}
29 return s*t;
30 }
31 struct node
32 {
33 int l,r;
34 }a[N];
35 bool cmp(node a,node b)
36 {
37 return a.r==b.r?a.l<b.l:a.r<b.r;
38 }
39 int main()
40 {
41 n=read();
42 for (int i=1;i<=n;i++)
43 a[i].l=read(),a[i].r=read();
44 sort(a+1,a+n+1,cmp);
45 for (int i=1;i<=n;i++)
46 if (now<=a[i].l) now=a[i].r,ans++;
47 out(ans);
48 return 0;
49 }
按右端点排序,在区间的末尾种树,若当前区间前面一部分种了一些,在区间末尾补上足够数量。
1 #include <iostream>
2 #include <cstdio>
3 #include <algorithm>
4 #include <cstring>
5 #include <cmath>
6 #include <queue>
7 #include <map>
8 #define ll long long
9 #define out(a) printf("%d",a)
10 #define writeln printf("\n")
11 const int N=1e5+50;
12 const int mod=1e9+7;
13 using namespace std;
14 int n,h;
15 int cnt=0,ans=0;
16 bool vis[N];
17 struct node
18 {
19 int l,r,t;
20 }a[N];
21 int read()
22 {
23 int s=0,t=1; char c;
24 while (c<'0'||c>'9'){if (c=='-') t=-1; c=getchar();}
25 while (c>='0'&&c<='9'){s=s*10+c-'0'; c=getchar();}
26 return s*t;
27 }
28 ll readl()
29 {
30 ll s=0,t=1; char c;
31 while (c<'0'||c>'9'){if (c=='-') t=-1; c=getchar();}
32 while (c>='0'&&c<='9'){s=s*10+c-'0'; c=getchar();}
33 return s*t;
34 }
35 bool cmp(node a,node b)
36 {
37 return a.r==b.r?a.l<b.l:a.r<b.r;
38 }
39 int main()
40 {
41 n=read();
42 h=read();
43 for (int i=1;i<=h;i++)
44 a[i].l=read(),a[i].r=read(),a[i].t=read();
45 memset(vis,false,sizeof(vis));
46 sort(a+1,a+h+1,cmp);
47 for (int i=1;i<=h;i++){
48 cnt=0;
49 for (int j=a[i].l;j<=a[i].r;j++)
50 if (vis[j]) cnt++;
51 if (cnt>=a[i].t) continue;
52 for (int j=a[i].r;j>=a[i].l;j--){
53 if (!vis[j]) {
54 vis[j]=true;
55 ans++; cnt++;
56 if (cnt>=a[i].t) break;
57 }
58 }
59 }
60 out(ans);
61 return 0;
62 }
开一个大根堆和一个小根堆维护一下。
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 #include <cmath> 6 #include <queue> 7 #include <map> 8 #define ll long long 9 #define out(a) printf("%d",a) 10 #define writeln printf("\n") 11 const int N=1e5+50; 12 const int mod=1e9+7; 13 using namespace std; 14 int n,x; 15 int a,b; 16 priority_queue<int>q_mi; 17 priority_queue<int,vector<int>,greater<int> >q_mx; 18 int read() 19 { 20 int s=0,t=1; char c; 21 while (c<'0'||c>'9'){if (c=='-') t=-1; c=getchar();} 22 while (c>='0'&&c<='9'){s=s*10+c-'0'; c=getchar();} 23 return s*t; 24 } 25 ll readl() 26 { 27 ll s=0,t=1; char c; 28 while (c<'0'||c>'9'){if (c=='-') t=-1; c=getchar();} 29 while (c>='0'&&c<='9'){s=s*10+c-'0'; c=getchar();} 30 return s*t; 31 } 32 int main() 33 { 34 n=read(); 35 for (int i=1;i<=n+1;i++){ 36 x=read(); 37 if (i>n) break; 38 q_mx.push(x),q_mi.push(x); 39 } 40 while (q_mx.size()>1){ 41 a=q_mx.top(); q_mx.pop(); 42 b=q_mx.top(); q_mx.pop(); 43 q_mx.push(a*b+1); 44 } 45 while (q_mi.size()>1){ 46 a=q_mi.top(); q_mi.pop(); 47 b=q_mi.top(); q_mi.pop(); 48 q_mi.push(a*b+1); 49 } 50 out(q_mx.top()-q_mi.top()); 51 return 0; 52 }