Codeforces Round #506 (Div. 3)

/*
第一次写codeforce的题解
之前一直拿它来练手速 
前几天发现在好好施展一场就能到蓝名了
恰好碰上一场div3 灰常开心
然后只做了2题  现在改一改CE题

C - Maximal Intersection
这题一开始想麻烦了 想的是分有n和没有n讨论
比赛的时候少考虑了一种然后wa.......
其实 考虑n条线段的交 就是minr-maxl
那么我们枚举删掉那一个 然后剩下的按上面的方法求一下
借助set 因为要支持删除一个元素 并且有重复要用multiset
另外multiset用的不多刚才wa了好几发.....
end这个迭代器指的应该是最后一个元素 rbegin才是最后一个 
*/

#include<cstdio>
#include<cstring>
#include<iostream>
#include<set>
#define maxn 300010
using namespace std;
int n,l[maxn],r[maxn],ans;
int main(){
    scanf("%d",&n);multiset<int>L,R;
    for(int i=1;i<=n;i++){
        scanf("%d%d",&l[i],&r[i]);
        L.insert(l[i]);R.insert(r[i]);
    }
    for(int i=1;i<=n;i++){
        L.erase(L.find(l[i]));R.erase(R.find(r[i]));
        ans=max(ans,*R.begin()-*L.rbegin());
        L.insert(l[i]);R.insert(r[i]);
    }
    printf("%d\n",ans);
    return 0;
}

/*
D题 字符串拼接的操作就是前一个*10^len2 + 后一个数
正着枚举两个(a+b)%k==0  <->  (a%k+b%k)%k==0
我们只枚举a 构造出b来 看看符合条件的b有几个
必须位数和%k的余数都符合条件才行
然后预处理下f[i][j]是i位数中%k余j的数的个数 
map加了一个log所以比较慢 改改%longlong啥的优化常数卡过去了  
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<map>
#define maxn 200010
#define ll unsigned long long
using namespace std;
int n,k,r,now,tmp,a[maxn];
ll ans;
const ll P=10; 
map<int,int>f[12];
int Get(ll x){
    int res=0;
    while(x){
        res++;x/=10;
    }
    return res;
}
int main(){
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        int c=Get(a[i]);f[c][a[i]%k]++;
    }
    for(int i=1;i<=n;i++){
        now=Get(a[i]);int c=a[i]*P%k,pre=a[i]%k;
        for(int j=1;j<=10;j++){
            tmp=k-c;if(tmp>=k)tmp-=k;
            ans+=f[j][tmp];
            if(j==now&&tmp==pre)
                ans--;c=c*P%k;
        }
    }
    printf("%lld\n",ans);    
    return 0;
} 

猜你喜欢

转载自www.cnblogs.com/yanlifneg/p/9545242.html