codeforces Testing Round #12

A题意:问l,r之间多少个数整除k

思路:XJB判断(不要抱着想少几种判断还能过的心态疯狂交。。。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 
 5 int main(){
 6     ll k,a,b;
 7     cin>>k>>a>>b;
 8     ll sum;
 9     if(k==1){
10         cout<<abs(b-a+1)<<endl;return 0;
11     }
12     if(a>0&&b>0){
13         sum=(b/k)-(a-1)/k;
14     }
15     else if(b>0&&a<0){
16         sum=b/k;
17         sum+=abs(a)/k;
18         sum++;
19     }
20     else {
21         sum=abs(a)/k-(abs(b)-1)/k;
22     }
23     if(b>0&&a==0){
24         sum=b/k+1;
25     }
26     else if(a<0&&b==0){
27            // cout<<a<<endl;
28         sum=abs(a)/k+1;
29     }
30     else if(a==0&&b==0) sum=1;
31 
32     cout<<sum<<endl;
33 }

B题意:问有多少个一点都不重合的区间

思路:贪心

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=500006;
 4 
 5 struct node{
 6     int l,r;
 7 }a[N];
 8 bool cmp(node p,node q){
 9     if(p.l==q.l) return p.r<q.r;
10     return p.l<q.l;
11 }
12 int main(){
13     int n;
14     cin>>n;
15 
16     for(int i=1;i<=n;i++){
17 
18         scanf("%d%d",&a[i].l,&a[i].r);
19     }
20     sort(a+1,a+1+n,cmp);
21     int rr=a[1].r;
22     int sum=0;
23     for(int i=2;i<=n;i++){
24 
25         if(a[i].l>rr){
26             sum++;
27             rr=a[i].r;
28 
29         }
30         else {
31             rr=min(rr,a[i].r);
32         }
33 
34     }
35     cout<<sum+1<<endl;
36 }

C题意:问有多少个长度为K的上升子序列

思路:dp[i][j]表示以i结尾的j长度子序列,那么他就+上前面比她小的dp[ii][j-1],树状数组维护下

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N=1e5+10;
 5 
 6 ll a[N],dp[N][20];
 7 ll b[N];
 8 int n,k;
 9 ll hh(int x,int y){
10     ll sum=0;
11     while(x){
12         sum+=dp[x][y];
13         x-=x&-x;
14     }
15     return sum;
16 }
17 void update(int x,int y,ll val){
18     while(x<=n){
19         dp[x][y]+=val;
20         x+=x&-x;
21     }
22 }
23 int  main(){
24     cin>>n>>k;
25     k++;
26     int x;
27     update(1,0,1);
28     for(int i=1;i<=n;i++){
29         scanf("%d",&x);
30         for(int j=k;j>=1;j--){
31             ll y=hh(x,j-1);
32             update(x,j,y);
33         }
34     }
35     cout<<hh(n,k)<<endl;
36 }
原文地址:https://www.cnblogs.com/hhxj/p/7324986.html