/* 第一次写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 ",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 ",ans); return 0; }