2020 年第一届辽宁省大学生程序设计竞赛

news2025/1/20 5:06:29

比赛经历:摸鱼划水了一个多小时又是只会签到,看来还得提升自己的解题能力写了六题

补题:E线段树维和区间平方和,比较经典好久没写过线段树了傻了,注意维护lazy

           J计算几何,看来得提上日程了,用叉积判断位置

           k题意看起来难爆了,没想到竟然做法如此优秀,所以有些题还是得多尝试

目录

A.组队分配

B.两点距离

C.轮到谁了?

E.线段树

F.最长回文串

G.管管的幸运数字

I.鸽子的整数运算

J.鸽者文明的三体问题

K.xor


A.组队分配

文字游戏

注意有些简单题,题目说法就是暗藏玄机,比如本题就是如此,注意按照排名升序,同时注意到内部排序是用降序

int t,n,m;
struct code{
    string s;
    int x;
    bool operator<(const code&t)const{
        return x<t.x;
    }
}e[N];

void solve(){
    
    cin>>n;
    for(int i=1;i<=3*n;i++){
        string s; cin>>s;
        int x; cin>>x;
        e[i]={s,x};
    }
    sort(e+1,e+1+3*n);
    int cnt = 0;
    for(int i=1;i<=3*n;i+=3,cnt++){
        auto [s1,x1]=e[i];
        auto [s2,x2]=e[i+1];
        auto [s3,x3]=e[i+2];
        cout << "ACM-" << cnt << ' ' << s3 << ' ' << s2 << ' ' << s1 << endl;
    }
    return ;
}

B.两点距离

小小思考一手

注意题目定义我们可以发现两个点之间最大的距离就是2(分别到1),最小的距离就是__gcd,同时注意在一起即可,这种题要留个心眼想全再提交

void solve(){
    
    cin>>n>>m;
    while(m--){
        int x,y; cin>>x>>y;
        if(x>y) swap(x,y);
        if(x==y){
            cout << 0 << endl;
            continue;
        }
        cout << min(2,__gcd(x,y)) << endl;
    }
    return ;
}

C.轮到谁了?

斐波那契数列

通过兔子问题以及简单分析可以得知是斐波那契问题,但是即使没得到这个结论我们可以按照要求模拟,定义a,b,c为成年的,一个月,两个月的兔子来模拟即可

void solve(){
    
    cin>>n>>m;
    int a = 1 ,b = 0 , c = 0;// 表示成年有多少 一个月的有多少 两个月的有多少
    for(int i=3;i<=n;i++){
        a = a + c; // 表示上次两个月到现在已经成年了 
        c = b; // 一个月变两个月
        b = a; //
        a %= m;
        b %= m;
        c %= m;
    }
    int ans = ((a+b+c-1)%m+m)%m; // 转化为编号
    cout << ans << endl;
    return ;
}

E.线段树

区间平方和

注意只要是区间问题中出现一个式子,我们都需要对式子进行推演变形,变成有利于我们做计算的,可以按照经验,一般可以为前缀和做差,预处理,莫队,线段树维护等,对于本题进行推理之和可以得到(\sum_{i=l}^ra_i *\sum_{i=l}^ra_i - \sum_{i=l}^r{a_i}^2 )/2

j接着我们就是维护区间和 和区间平方和,同时题目要求的区间修改乘法和加法,我们可以依靠先对乘法处理,后面的加法*mul,同时维护,对于平方和对式子变化得到

sum2*mul + 2*add*sum1*mul + (r-l+1)*add

sum1 表示区间和,sum2表示区间平方和,注意到乘一个数之后再做加法,所以先乘之后sum1会变化,所以sum1需要乘mul,sum1的变化同上

LL w[N];
struct code{
    int l,r;
    LL sum1,sum2; // 表示 总和
    LL add,mul; // 表示平方和
}tr[4*N];

void eval(code&u,LL add,LL mul){
    u.sum2=(u.sum2*mul%p*mul%p+2*u.sum1*mul%p*add%p+(LL)(u.r-u.l+1)*add%p*add%p)%p;
    u.sum1=((LL)u.sum1*mul%p+(LL)(u.r-u.l+1)*add%p)%p;
    u.mul=(LL)(u.mul)%p*mul%p;
    u.add=((LL)u.add%p*mul%p+add)%p;
}

void pushup(code&u,code&l,code&r){
     u.sum1 = (l.sum1 + r.sum1)%p;
     u.sum2 = (l.sum2 + r.sum2)%p;
}

void pushdown(code&u,code&l,code&r){
     eval(l,u.add,u.mul);
     eval(r,u.add,u.mul);
     u.add=0,u.mul=1;
}

void pushup(int u){
    pushup(tr[u],tr[u<<1],tr[u<<1|1]);
}

void pushdown(int u){
     pushdown(tr[u],tr[u<<1],tr[u<<1|1]);
}

void build(int u,int l,int r){
    if(l==r){
        tr[u]={l,r,w[l],w[l]*w[l]%p};
        return ;
    }
    tr[u]={l,r,0,0,0,1};
    int mid=l+r>>1;
    build(u<<1,l,mid),build(u<<1|1,mid+1,r);
    pushup(u);
}

void modify(int u,int l,int r,int mul,int add){
    if(tr[u].l>= l && tr[u].r<=r){
        eval(tr[u],add,mul);
        return ;
    }
    pushdown(u);
    int mid=tr[u].l+tr[u].r>>1;
    if(l<=mid) modify(u<<1,l,r,mul,add);
    if(r>mid) modify(u<<1|1,l,r,mul,add);
    pushup(u);
}

code query(int u,int l,int r){
    if(tr[u].l>=l && tr[u].r<=r){
        return tr[u];
    }
    pushdown(u);
    int mid=tr[u].l+tr[u].r>>1;
    if(r<=mid) return query(u<<1,l,r);
    else if(l>mid) return query(u<<1|1,l,r);
    else{
        code res;
        code ll=query(u<<1,l,r);
        code rr=query(u<<1|1,l,r);
        pushup(res,ll,rr);
        return res;
    }
}
void solve(){
    
    auto qmi = [&](LL a,LL b,LL p){
        LL res = 1;
        while(b){
            if(b&1) res=res*a%p;
            b>>=1;
            a=a*a%p;
        }
        return res;
    };
    
    cin>>n>>m>>p;
    LL inv2 = qmi(2,p-2,p);
    for(int i=1;i<=n;i++) cin>>w[i],w[i]%=p;
    build(1,1,n);
    while(m--){
        int op,l,r,v; cin>>op>>l>>r;
        if(op==1){
            cin>>v; v%=p;
            modify(1,l,r,1,v);
        }
        else if(op==2){
            cin>>v; v%=p;
            modify(1,l,r,v,0);
        }
        else{
            code t = query(1,l,r);
            LL ans1 = t.sum1*t.sum1%p;
            LL ans2 = t.sum2;
            LL ans = ans1 - ans2;
            ans *= inv2;
            ans = (ans%p+p)%p;
            cout << ans << endl;
        }
    }
    return ;
}

F.最长回文串

简单贪心

题目咋一看很难,但是最忌讳就是咋一看可能就看错很多信息,对于有些字符串可以丢弃,对于每个字符串字符可以重新排列,最后字符串可以重新排列最后构成的最长的回文串

分析得出 一个串留下来的条件 

1.有一个和他一模一样的放两边构成回文

2.当前这个可以作为回文串中间位置

我们直接排序判断是不是一样即可,对于中间的判断其奇数个数是不是小于等于1即可

void solve(){
    
    unordered_map<string,int> mp;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        string s; cin>>s;
        sort(s.begin(),s.end());
        mp[s]++;
    }
    int ans = 0;
    vector<string> a;
    for(auto&[v,w]:mp){
       ans += (int)v.size()*(w-(w&1));
       if(w&1) a.push_back(v);
    }
    int add = 0;
    for(auto&v:a){
        vector<int> cnt(26);
        for(auto&c:v) cnt[c-'a']++;
        int odd = 0;
        for(int i=0;i<26;i++) if(cnt[i]&1) odd++;
        if(odd<=1){
            add = m; break;
        }
    }
    ans += add;
    cout << ans << endl;
    return ;
}

G.管管的幸运数字

暴力

有些时候可能有好的做法,但是如果你发现你是用暴力的做法时间复杂度是可以轻松过去的时候也可以考虑暴力,比如本题我们可以得出结论每一个数的左右移动次数不会超过10000,轻松可以跑过直接暴力即可,首先用线性筛,然后直接左右遍历

bool st[N];
int p[N],cnt;
 
void get(){
    
    for(int i=2;i<M;i++){
        if(!st[i]) p[cnt++]=i;
        for(int j=0;p[j]<M/i;j++){
            st[i*p[j]]=true;
            if(i%p[j]==0) break;
        }
    }
}
void solve(){
     
    cin>>n;
    if(!st[n]){
        cout << "YES" << endl;
        return ;
    }
    int ans = N;
    for(int i=n;i>=1;i--){
        if(!st[i]){
            ans = min(ans,n-i);
            break;
        }
    }
    for(int i=n+1;i;i++){
        if(!st[i]){
            ans = min(ans,i-n);
            break;
        }
    }
    cout << ans << endl;
    return ;
}

I.鸽子的整数运算

纯签到

没什么好说的直接模拟

void solve(){
     
    int op,a,b; cin>>op>>a>>b;
    int ans = 0;
    if(op==1) ans = a+b;
    if(op==2) ans = a-b;
    if(op==3) ans = a*b;
    if(op==4) ans =a/b;
    cout << ans << endl;
    return ;
}

J.鸽者文明的三体问题

叉积处理内外

我们可以考虑直接使用叉积来判断是不是在三角形的同一侧即可

struct code{
    int x[3],y[3];
}e[N];

void solve(){
    
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=0;j<3;j++){
            cin>>e[i].x[j]>>e[i].y[j];
        }
    }
    auto check = [&](int x,int y,code t){
        auto get = [&](int x1,int y1,int x2,int y2){
            LL ans = (LL)x1*y2 - (LL)x2*y1;
            return ans;
        };
        
        int t1 = get(x-t.x[0],y-t.y[0],t.x[1]-t.x[0],t.y[1]-t.y[0]);
        int t2 = get(x-t.x[1],y-t.y[1],t.x[2]-t.x[1],t.y[2]-t.y[1]);
        int t3 = get(x-t.x[2],y-t.y[2],t.x[0]-t.x[2],t.y[0]-t.y[2]);
        return (t1>0) == (t2>0) and (t2>0)==(t3>0);  
    };
    
    while(m--){
        int x,y; cin>>x>>y;
        int ans = 0;
        for(int i=1;i<=n;i++) if(check(x,y,e[i])) ans++;
        cout << (ans&1 ? "Yes" : "No") << endl;
    }
    return ;
}

K.xor

妙妙dp

对于本题题目看起来十分复杂,我们看看能不能简单处理,明显的是一个dp同时时间复杂度只能在nlogn级别,我们直接来定义一手dp[i]表示前i个构成符合题意的方案数,当前异或为a[i]我们来看当前这个数可以从什么状态转移过来,前缀中符合要求的能dp[j],异或为x^a[i]的,注意到我们无法从某一个位置转移过来,但是我们要的是异或为x^a[i]的位置,我们可以再定义一个dp,注意到数据范围可以开map来处理,定义为当前数为x的符合题目要求的方案数即可,map[x] 从当前数是x的位置转移过来不重不漏

int a[N],dp[N];

void solve(){
    
    cin>>n>>x;
    map<int,int> mp;
    mp[0]=1;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        a[i] ^= a[i-1];
        dp[i] = mp[x^a[i]];
        mp[a[i]] += dp[i];
        dp[i] %= mod;
        mp[a[i]] %= mod;
    }
    cout << dp[n] << endl;
    return ;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1681975.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

0.98T优于10米高程DEM数据

我们在《全球30米100%水陆覆盖高程》一文中&#xff0c;为大家分享了全球100%覆盖&#xff0c;且包括海底高程的30米DEM数据。 该数据虽然全球无死角覆盖&#xff0c;但分辨率只有30米。 这里&#xff0c;再为大家分享一个优于10米的高程数据&#xff0c;但目前仅覆盖全国范围…

The 13th Shandong ICPC Provincial Collegiate Programming Contest

The 13th Shandong ICPC Provincial Collegiate Programming Contest The 13th Shandong ICPC Provincial Collegiate Programming Contest A. Orders 题意&#xff1a;有n个订单&#xff0c; 每日可生产k个产品&#xff0c;每个订单给出交付日和交付数量&#xff0c;是否能…

每日一练 2024.5.16(补 2024.5.14)

题目&#xff1b; 我们定义 arr 是 山形数组 当且仅当它满足&#xff1a; arr.length > 3存在某个下标 i &#xff08;从 0 开始&#xff09; 满足 0 < i < arr.length - 1 且&#xff1a; arr[0] < arr[1] < ... < arr[i - 1] < arr[i]arr[i] > arr…

泛微E9开发 自动获取日期

选择开始日期&#xff0c;自动获取指定天数后的结束日期 1、功能背景2、展示效果3、实现方法 1、功能背景 用户选择开始日期&#xff0c;系统自动带出结束日期&#xff0c;如需要带出6天后的结束日期&#xff0c;下图所示&#xff0c;5月14日到5月20日是一个周期&#xff0c;用…

Linux-centos下安装ffmpeg的详细教程

源安装 第一种方式&#xff1a; . 首先需要安装yum源&#xff1a; 这个源安装的ffmpeg版本是3.4 yum install epel-release yum install -y https://mirrors.ustc.edu.cn/rpmfusion/free/el/rpmfusion-free-release-7.noarch.rpm然后可以安装ffmpeg yum install -y ffmpeg ff…

电阻式传感器

电阻式传感器是一种将非电学量&#xff08;如温度、压力、位移等&#xff09;转换为电阻变化的传感器。它大致分为电阻应变式传感器、压阻式传感器和变阻式传感器三类。 电阻式传感器的优点包括结构简单、成本低廉、稳定性好&#xff0c;适用于多种环境。但它们也有局限性&…

第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组 AB路线

//bfs 1000100010不会超时 #include<bits/stdc.h> using namespace std; #define int long long const int n1e311; int a,b,c,h[n][n][12],k[4][2]{0,1,0,-1,1,0,-1,0}; char t[n][n]; struct s {int x,y,z,w; }; signed main() {ios::sync_with_stdio(false);cin.t…

VMware虚拟机-安装程序无法自动安装virtual machine......_windows server 2008 R2

系统版本&#xff1a;windows server 2008 R2 问题-安装程序无法自动安装virtual machine… 在使用虚拟机安装windows server 2008 R2系统中&#xff0c;安装VMware Tools工具安祖啊寄给你失败&#xff0c;提示安装程序无法自动安装virtual machine…&#xff0c;必须手动安装…

lazada、shopee新店铺如何快速出单?自养号补单测评实战操作指南

作为一家Lazada、虾皮新店铺&#xff0c;要快速出单&#xff0c;需要采取一些策略和措施。以下是一些可以考虑的方法&#xff1a; 一、优化产品信息 确保您的产品信息完整、准确、清晰&#xff0c;并且可以吸引潜在客户。这包括商品标题、描述、图片、价格等。 二、优化店铺…

其他自动化工程师都在偷偷学习AI技术,你再不学就落后了!一篇文章教会你使用AI!

其他自动化工程师都在偷偷学习AI技术&#xff0c;你再不学就落后了&#xff01;一篇文章教会你使用AI&#xff01; 哈喽&#xff0c;大家好&#xff0c;我是小叔。了解小叔的朋友都清楚&#xff0c;我从来都不是标题党&#xff0c;我只会用美女图片来吸引你们&#x1f602;&am…

如何管理研发人员

在日益激烈的市场竞争中&#xff0c;企业的核心竞争力往往取决于其技术创新能力和研发实力。然而&#xff0c;随着企业研发的深入和技术的积累&#xff0c;研发人员泄密的风险也愈发严重。如何防止研发人员泄密&#xff0c;已经成为企业面临的重要问题。本文将从加强员工保密意…

前端简史之崛起:Router迁鼎

引 &#x1f4a1; Ajax 的出现&#xff0c;带来了 jQuery 时代&#xff1b;Node技术的发展&#xff0c;带来了前端工程化进阶&#xff1b;如果说前面二者是带来技术的革命&#xff0c;那么前端路由方案的多样化则带来了用户体验的升级以及项目管理的优化。 课程简介 《前端简史…

AI for Good | 我们用“AI”保护地球

4月&#xff0c;草长莺飞的春夏之交&#xff0c;我们将迎来第55个世界地球日 (The World Earth Day)。在这个不断变暖的星球上&#xff0c;我们面临着一个巨大的挑战&#xff1a;气候变化。随着极端天气事件的频发&#xff0c;如何汇聚社会各界的共同努力&#xff0c;找到创新的…

【网站项目】SpringBoot379儿童疫苗接种管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

ubuntu虚拟机的 网卡不见了?

通过 ifconfig 命令查找不到自己的虚拟机上网网卡了,虚拟机的上网网卡名字是ens33 发现只有一个本地回环地址 执行如下两条指令可恢复网卡 sudo dhclient ens33#获取ip sudo ifconfig ens33#查看ip 再次通过ifconfig查看网卡信息

对话YashanDB CTO陈志标:如何推动国产数据库长远发展

深圳计算科学研究院&#xff08;以下简称“深算院”&#xff09;是深圳市人民政府2018年11月批准建设的“十大基础研究机构”之一&#xff0c;由深圳市科技创新委员会主管、深圳大学举办、深圳市龙华区人民政府共建的二类事业法人单位。 崖山数据库系统YashanDB是深算院完全自主…

券商龙头借助 PowerAgent 实现大模型落地成本与效率平衡

2022 年 ChatGPT 的诞生被看作是 AI 大模型技术的“iPhone 时刻”&#xff0c;也象征着 AI 普惠时代的真正到来。大模型持续引领全球 AI 大模型技术突飞猛进&#xff0c;特别是中国的 AI 市场。 2023 年&#xff0c;我国 AI 领域“百模大战”的硝烟还未完全消散&#xff0c;20…

金蝶AAS-V9.0前后端部署

前言 包含金蝶AAS9.0部署&#xff0c;前端部署&#xff0c;后端部署。 金蝶AAS9.0部署 1. 下载金蝶AAS9.0安装包上传至服务器&#xff1b; 2. 解压安装包&#xff1b; unzip -d /opt/AAS-V9.0 AAS-V9.0.zip3. 配置JAVA路径&#xff1b; echo $JAVA_HOME vim /opt/AAS-9.0…

二三维战场仿真系统

收费工具&#xff0c;白嫖党勿扰 收费金额1万元 1 概述 给某个公司做了一个战场仿真系统&#xff0c;该公司给了5W的辛苦费。现在把相关功能部分提取出来&#xff0c;给需要的同学。 2 功能说明 战场仿真系统&#xff0c;分为三个部分&#xff1a; 服务器&#xff0c;用来发…

太平洋产险海南分公司提醒您:高温来袭!新能源车该如何正确充电?

据不完全统计 近三年来 7-8月一直是电动汽车烧车事故的高发期 毕竟夏季的高温影响着动力电池的状态新能源汽车为什么会自燃&#xff1f; 小保替你们找到了央视的官方回答&#xff01; 原来 新能源汽车比传统燃油车多了一套电池系统 电解液为可燃物 当热量聚集达到燃点却没…