codeforces 1422 (#675 div2)题解(ABC)

    科技2022-08-11  102

    A. Fence 题意:给出a,b,c三边,找到任一可以与a,b,c三边构成四边形的边. 传送门 大致思路:

    假定其他三边夹角为直角,此时的d^2 = (c-a)^ 2+b^2.然而作为整形计算d时很可能损失精度,这时可以假设c边可以一定限度的逆时针旋转.由此就可以认为抵消了损失的精度了.

    #pragma GCC optimize("Ofast") #pragma GCC target("avx,avx2,fma") #pragma GCC optimization ("unroll-loops") #include<bits/stdc++.h> #define int long long using namespace std; signed main() { ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); int _; cin>>_; while(_--){ int a,b,c; cin>>a>>b>>c; int ans; int d; d=abs(a-c); ans=sqrt(b*b+d*d); cout<<ans<<endl; } }

    B. Nice Matrix 题意:给出一个矩阵,让你做变换(给任一元素加减1)使得矩阵任一行列均为回文,求出最少的变换次数. 传送门 大致思路: 相同色块中的数字应当是一致的.由于这道题数据量很小,所以可以每四个(边界值时两个)找一次最小的操作值.应当注意边界值i == i-n+1 和 j == j-m+1的情况 .

    #pragma GCC optimize("Ofast") #pragma GCC target("avx,avx2,fma") #pragma GCC optimization ("unroll-loops") #include<bits/stdc++.h> #define int long long using namespace std; int arr[105][105]; signed main() { ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); int _; cin>>_; while(_--){ int n,m; cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++)cin>>arr[i][j]; } int ans=0; int idtx=n%2; int idty=m%2; int qaq[4]; for(int i=1;i<=n/2+idtx;i++){ for(int j=1;j<=m/2+idty;j++){ int sum=0; int add=1e10; qaq[0]=arr[i][j];qaq[1]=arr[n-i+1][j];qaq[2]=arr[i][m-j+1];qaq[3]=arr[n-i+1][m-j+1]; for(int i=0;i<4;i++){ add=min(add,abs(qaq[1]-qaq[i])+abs(qaq[0]-qaq[i])+abs(qaq[2]-qaq[i])+abs(qaq[3]-qaq[i])); } if(i==n-i+1||j==m-j+1)add/=2; ans+=add; } } cout<<ans<<endl; } }

    C. Bargain 题意:给定一个很长的数字,求出去掉其中子串的形成的数和(模1e9+7) 例:107 可以分为07,17,10,1,7.和为42 传送门 思路: 设数字串为s 设讨论进行到该数字的从左到右数第k位.(以下第x位均为从左到右x位) 若删去在第k位前的数字,一共有(k-1)*k/2种方法,给答案的贡献是

    (k-1)*k/2 *10^(n-k) *s[k]

    若删除在第k位后的数字时,删除数字会给原来的位数带来影响,所以应该维护一个差分数组来记录和,把差分数组记作c,c[1]…c[k]的和代表在第n-k+1位可以参与讨论的数的和.此时给答案的贡献是

    k*sum(c[1]…c[k]) * 10^(k-1)

    很可能有错误,欢迎指正~

    #pragma GCC optimize("Ofast") #pragma GCC target("avx,avx2,fma") #pragma GCC optimization ("unroll-loops") #include<bits/stdc++.h> #define int long long const int maxi=1e5+5; const int mod=1e9+7; using namespace std; int a[maxi],pow1[maxi],c[maxi]; signed main() { ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); string s1; cin>>s1; int len=s1.size(); for(int i=0;i<len;i++)a[i+1]=s1[i]-'0'; pow1[0]=1; for(int i=1;i<=len;i++)pow1[i]=pow1[i-1]*10%mod; int ans=0; int cur=0; for(int i=1;i<=len;i++){ ans=(ans+(i*(i-1)/2)%mod*pow1[len-i]%mod*a[i]%mod)%mod; c[len-i+1]=(c[len-i+1]-a[i])%mod; c[1]=(c[1]+a[i])%mod; } for(int i=1;i<=len;i++){ cur=(cur+c[i])%mod; ans=(ans+cur*pow1[i-1]%mod*i%mod)%mod; } ans%=mod; cout<<ans<<endl; }
    Processed: 0.010, SQL: 8