http://codeforces.com/contest/816
A
模拟,从头到尾就行
给你一个时间。
输出最小的时间差(比当前大),使时间回文
时间很短。60*60*60*24
#include <bits/stdc++.h>
using namespace std;
char b[6];
int a[6];
bool solve(){
if(a[0]==a[4]&&a[1]==a[3])
return true;
return false;
}
int main()
{ ios::sync_with_stdio(false);
cin>>b;
for(int i=0;i<5;i++){
if(i!=2)
a[i]=b[i]-'0';
// cout<<a[i]<<endl;
}
int sum=0;
while(!solve()){
sum++;
//cout<<sum<<endl;
a[4]++;
while(a[4]>=10) a[4]-=10,a[3]++;
while(a[3]>=6) a[3]-=6,a[1]++;
while(a[1]>=10) a[1]-=10,a[0]++;
//while(a[1]>=4)
if(a[0]==2&&a[1]==4){
a[0]=0;a[1]=0;
}
}
printf("%d\n",sum);
return 0;
}
2 以为是线段树的区间操作。。后来考虑好像不行,不是更新更新。。发现了新操作。。类似 lazy标记??
区间加值,只需要 第一个地方加1,最后一个后面的-1 。然后累加求前缀就行。、、、
判断次数也很简单,也是前缀。。
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+2000;
int sum[maxn];
int cnt[maxn];
int main(){
int l,r,k,m,n;
scanf("%d%d%d",&m,&k,&n);
for(int i=1;i<=m;i++){
scanf("%d%d",&l,&r);
cnt[r+1]--;
cnt[l]++;
}
for(int i=1;i<maxn;i++){
cnt[i]+=cnt[i-1];
}
for(int i=0;i<maxn;i++){
if(cnt[i]>=k){
sum[i]=1;
}
}
for(int i=1;i<maxn;i++){
sum[i]+=sum[i-1];
}
for(int i=0;i<n;i++){
scanf("%d%d",&l,&r);
printf("%d\n",sum[r]-sum[l-1]);
}
return 0;
}
CDE都能补。。。明天。
C 是思维。。t了。
D是 思维。。
E 是树形。。