boxmoe_header_banner_img

欢迎来到DRheEheAM的blog

加载中

文章导读

Week4 Day6 | Aug. 16th


avatar
DRheEheAM_Gary 2025年8月16日 33

S+20250816测试

A. 回文插入

暴力枚举插入点即可(

#include<bits/stdc++.h>
using namespace std;
#define intc const int
#define intl long long
#define Cios ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
string a,b;
int ans=0;
signed main(){
    Cios;
    cerr.tie(0);
    cin>>a>>b;
    for (int i=0;i<a.size();i++) {
        string a1=a.substr(0,i),a2=a.substr(i,a.size()-i);
        string s;
        s.append(a1);
        s.append(b);
        s.append(a2);
        cerr<<s<<endl;
        bool re=1;
        for (int j=0,k=(int)s.size()-1;j<k;j++,k--) {
            if (s[j]!=s[k]) {
                re=0;
                break;
            }
        }
        if (re) ans++;
    }
    a.append(b);
    cerr<<a<<endl;
    bool re=1;
    for (int i=0,j=(int)a.size()-1;i<j;i++,j--) {
        if (a[i]!=a[j]) {
            re=0;
            break;
        }
    }
    cout<<ans+re<<endl;
    return 0;
}
C++

B. 三角形

输入点,预处理所有不相同点之间的斜率,此时我们定义,斜率$slove_{a,b}$:
$$
slove_{a,b} = \frac{|x_a-x_b|}{|y_a-y_b|} (y_a \not = y_b)
$$
$y_a=y_b$ 时,我们将斜率定义成 $\infty$;
分析三角形存在条件,无论方向,当三条边的斜率在我们这样定义的情况下一定会有至少两条边斜率不同。所以当我们发现三条边的斜率在数值上都相同时,这个三角形不存在。

#include<bits/stdc++.h>
using namespace std;
#define intc const int
#define int long long
#define Cios ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
intc N=400;
int n,ans=0;
struct point {
    int x,y;
}p[N];
struct slope {
    int p,q;
    bool operator !=(const slope &s) {
        return p!=s.p||q!=s.q;
    }
}sl[N][N];
slope getsl(int p,int q) {
    int gcd=__gcd(p,q);
    return {p/gcd,q/gcd};
}
//define slope_{a,b} = |x_a-x_b|/|y_a-y_b|
signed main(){
    Cios;
    cin>>n;
    for (int i=1;i<=n;i++) cin>>p[i].x>>p[i].y;
    for (int i=1;i<=n;i++) {
        for (int j=1;j<=n;j++) {
            if (i!=j) {
                sl[i][j]=getsl(abs(p[i].x-p[j].x),abs(p[i].y-p[j].y));
            }
        }
    }
    for (int i=1;i<=n;i++) {
        for (int j=i+1;j<=n;j++) {
            for (int k=j+1;k<=n;k++) {
                slope s1=sl[i][j],s2=sl[i][k],s3=sl[k][j];
                if (s1!=s2||s2!=s3||s1!=s3) ans++;
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}
C++

C. 幂次整除

设 $c$ 的质因数分解 $c=p_1^{k_1}\times p_2^{k_2}\times … \times p_n^{k_n}$ ,$a$ 的质因数分解 $a=q_1^{r_1}\times q_2^{r_2}\times … \times q_m^{r_m}$ ;
可以发现,$c^d | a^b$,当且仅当 $\forall 1\le i\le n , \exists 1\le j\le m , \to p_i=q_j \land k_i d \le r_j b$。
所以我们记录所有 $c$ 的质因数分解,并进行判断即可。
注意两个特判,当 $a=1$ 时,当且仅当 $c=1$ 时有解,否则一定无解;当 $c=1$ 时一定有解。

#include<bits/stdc++.h>
using namespace std;
#define intc const int
#define intl long long
#define Cios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
intl a,b,c,d;
int main() {
    Cios;
    cin>>a>>b>>c>>d;
    if (c==1) {
        cout<<"divisible"<<endl;
        return 0;
    }
    if (a==1) {
        cout<<"not divisible"<<endl;
        return 0;
    }
    map<intl,int> fac;
    intl temc=c;
    for (intl i=2;i*i<=temc;i++) {
        while (temc
            fac[i]++;
            temc/=i;
        }
    }
    if (temc>1) fac[temc]++;
    for (auto [p,cnt]:fac) {
        intl tema=a;
        int cnta=0;
        while (tema
            cnta++;
            tema/=p;
        }
        if (cnta==0) {
            cout<<"not divisible"<<endl;
            return 0;
        }
        if ((intl)cnta*b<(intl)cnt*d) {
            cout<<"not divisible"<<endl;
            return 0;
        }
    }
    cout<<"divisible"<<endl;
    return 0;
}
C++

D. 完整正方形

dp求解即可~
设 $dp_{i,j}$ 表示以 $(i,j)$ 为左上角的正方形个数 ,容易得出当$(i,j)$ 不为洞时,$dp_{i,j}=\min(dp_{i+1,j},dp_{i,j+1},dp_{i+1,j+1})+1$ ,为洞时 $dp_{i,j} =0$。

#include<bits/stdc++.h>
using namespace std;
#define intc const int
#define intl long long
#define Cios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
intc N=3e3+2;
int dp[N][N];
bool hole[N][N];
int main() {
    Cios;
    int h,w,n;
    cin>>h>>w>>n;
    for (int i=1;i<=n;i++) {
        intl a,b;
        cin>>a>>b;
        hole[a][b]=1;
    }
    intl ans=0;
    for (int i=h;i>=1;i--) {
        for (int j=w;j>=1;j--) {
            if (hole[i][j]) dp[i][j]=0;
            else dp[i][j]=min({dp[i+1][j],dp[i][j+1],dp[i+1][j+1]})+1;
            ans+=dp[i][j];
        }
    }
    cout<<ans;
    return 0;
}
C++

F. 小学数学

理解题目之后就知道是二分图最大匹配的板子(大概?
需要一点离散化xd

#include<bits/stdc++.h>
using namespace std;
#define intc const int
#define intl long long
#define Cios ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
intc N=2510,M=7510;
struct edge{
    int to;
    char oper;
};
vector<edge> g[N];
map<intl,int> disc;
intl val_arr[M];
int match_r[M];
char ans_op[N];
int res_node[N];
bool vis[M];
intl a_arr[N],b_arr[N];
bool dfs(int u){
    for(auto &e:g[u]){
        int v=e.to;
        if(vis[v]) continue;
        vis[v]=1;
        if(!match_r[v]||dfs(match_r[v])){
            match_r[v]=u;
            ans_op[u]=e.oper;
            res_node[u]=v;
            return 1;
        }
    }
    return 0;
}
signed main(){
    Cios;
    int n,cnt=0;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a_arr[i]>>b_arr[i];
        intl val1=a_arr[i]+b_arr[i];
        intl val2=a_arr[i]-b_arr[i];
        intl val3=a_arr[i]*b_arr[i];
        if(!disc.count(val1)){
            disc[val1]=++cnt;
            val_arr[cnt]=val1;
        }
        if(!disc.count(val2)){
            disc[val2]=++cnt;
            val_arr[cnt]=val2;
        }
        if(!disc.count(val3)){
            disc[val3]=++cnt;
            val_arr[cnt]=val3;
        }
        g[i].push_back({disc[val1],'+'});
        g[i].push_back({disc[val2],'-'});
        g[i].push_back({disc[val3],'*'});
    }
    int matchc=0;
    for(int i=1;i<=n;i++){
        memset(vis,0,sizeof(bool)*(cnt+1));
        if(dfs(i)) matchc++;
    }
    if(matchc!=n) cout<<"impossible";
    else{
        for(int i=1;i<=n;i++) cout<<a_arr[i]<<" "<<ans_op[i]<<" "<<b_arr[i]<<" = "<<val_arr[res_node[i]]<<'\n';
    }
    return 0;
}
C++


评论(0)

查看评论列表

暂无评论


发表评论

表情 颜文字
插入代码
DRheEheAM Blog

返回

您的消息已发送

需要反馈文章问题?点击这里...

警告
警告
警告
警告

隐私政策...

请给出具有实用,建设性的建议!
注意:若频繁发送邮件,或发送过多无意义邮件,可能会遭到临时封禁,严重者永久封禁!

警告。