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;
} 
相關文章
相關標籤/搜索