Divisibility
题目链接:
http://codeforces.com/problemset/problem/597/A
AC代码:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long ll;
int main(){
ll k,a,b;
while(~scanf("%lld%lld%lld",&k,&a,&b)){
if(a >= 1)
printf("%lld\n",b/k-(a-1)/k);
else if(b <= -1)
printf("%lld\n",(b+1)/k-a/k);
else
printf("%lld\n",b/k-a/k+1);
}
return 0;
}
Restaurant
题目链接:
http://codeforces.com/problemset/problem/597/B
解题思路:
这题跟杭电的今年暑假不AC很相似,更确切的说,就是把杭电的这题的数据扩大了。
AC代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
struct node{
int l,r;
}no[500005];
bool cmp(node a,node b){
return a.r < b.r;
}
int main(){
int n;
while(~scanf("%d",&n)){
for(int i = 0; i < n; i++)
scanf("%d%d",&no[i].l,&no[i].r);
sort(no,no+n,cmp);
int ans = 0,tmpr = 0;
for(int i = 0; i < n; i++){
if(no[i].l > tmpr){
ans++;
tmpr = no[i].r;
}
}
printf("%d\n",ans);
}
return 0;
}
Subsequences
题目链接:
http://codeforces.com/problemset/problem/597/C
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 100010;
int a[N];
ll dp[N][15];
ll bit[N][15];
void add(int p, int t, ll &val){
for(; p < N; p += p & (-p))
bit[p][t] += val;
}
ll get(int p, int t){
ll res = 0;
for(; p > 0; p -= p & (-p))
res += bit[p][t];
return res;
}
int main(){
int n, k;
while(~scanf("%d %d", &n, &k)){
for(int i = 0; i < n; i++)
scanf("%d",&a[i]);
for(int i = 0; i < n; i++)
dp[i][1] = 1;
for(int i = 0; i < n; i++){
for(int t = 2; t < 15; t++){
add(a[i],t-1,dp[i][t-1]);
dp[i][t] = get(a[i]-1,t-1);
}
}
ll ans = 0;
for(int i = 0; i < n; i++)
ans += dp[i][k + 1];
printf("%lld\n", ans);
}
return 0;
}