[ICPC2024 Xi‘an I] ICPC2024 邀请赛西安站(7/8/13)

心得

[ICPC2024 Xi'an I] ICPC2024 邀请赛西安站重现赛 - 比赛详情 - 洛谷

7表示赛时ac了7个,8表示含补题总共ac数,13表示题目总数

题目

M. Chained Lights

打表,发现只有k=1是YES

//#include <bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<vector>
#include<map>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair<int,int> P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
using namespace std;
const int N=1e6+10;
int t,n,k,fac[N],sum[N],light[N];
void press(int x)
{
    light[x]^=1;
    for (int y=x+x;y<=n;y+=x) press(y);
}
int main(){
    sci(t);
    while(t--){
        sci(n),sci(k);
        puts(k==1?"YES":"NO");
    }
    return 0;
}

J. Triangle

数三角形,手玩发现一些规律,

比如:n=3,m=9实际是15,然后发现和gcd有关

//#include <bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<vector>
#include<map>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair<int,int> P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
using namespace std;
const int N=1e6+10;
int a,b;
ll gcd(ll a,ll b){
    return !b?a:gcd(b,a%b);
}
int main(){
    sci(a),sci(b);
    // if(a==b){
    //     printf("%lld\n",1ll*a*(a+1)/2);
    // }
    // else{
    ll v=gcd(a,b);
    ptlle((1ll*a*b-1ll*v*(a/v)*(b/v))/2+1ll*((a/v)*(b/v)+1)/2*v);
    //}
    return 0;
}
/*
3 9 = 15
*/

D. Make Them Straight

枚举k,根据ai-i*k确定能在同一个序列里的子序列,子序列里的是不改的

首项得是正的,后面i*k>1e6说明一定要改

剪枝一下复杂度是可接受的O(klogn)

//#include <bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<vector>
#include<map>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair<int,int> P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
using namespace std;
const int N=2e5+10;
int n,a[N],b[N];
map<ll,ll>mp;
ll sum,ans;
int main(){
    sci(n);
    rep(i,0,n-1)sci(a[i]);
    rep(i,0,n-1){
        sci(b[i]);
        sum+=b[i];
    }
    ans=sum;
    rep(k,0,1000000){
        mp.clear();
        ll res=0;
        rep(i,0,n-1){
            ll v=a[i]-1ll*i*k;
            if(1ll*i*k>1000000)break;
            if(v<0)continue;
            mp[v]+=b[i];
            res=max(res,mp[v]);
            //if(mp[v]==9)printf("i:%d v:%lld mp:%lld\n",i,v,mp[v]);
        }
        ans=min(ans,sum-res);
    }
    ptlle(ans);
    return 0;
}
/*
3 9 = 15
*/

L. Rubbish Sorting

二进制子集枚举一下,大概sosdp的思想,因为|s|<=5

#include <bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<vector>
#include<map>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair<int,int> P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
using namespace std;
const int N=2e5+10,M=2e7+10,INF=0x3f3f3f3f;
int q,n,op,x,y,bs[8];
char s[N];
int val[M],now=INF;
int main(){
    memset(val,INF,sizeof val);
    bs[0]=1;
    rep(i,1,6)bs[i]=bs[i-1]*28;
    sci(q);
    while(q--){
        sci(op);
        scanf("%s",s);
        n=strlen(s);
        if(op==1){
            sci(y);
            int w=0;
            rep(i,0,n-1){
                int v=s[i]-'a'+1;
                w+=v*bs[i];
            }
            val[w]=min(val[w],y);
            now=min(now,y);
            rep(p,1,n){
                int up=(1<<p)-1;
                rep(i,0,up-1){
                    int w=0;
                    rep(j,0,p-1){
                        int z=i>>j&1,v=0;
                        if(z)v=27;
                        else v=(s[j]-'a'+1);
                        w+=v*bs[j];
                    }
                    val[w]=min(val[w],y);
                }
            }
        }
        else{
            int w=0;
            rep(i,0,n-1){
                int v=s[i]-'a'+1;
                w+=v*bs[i];
            }
            if(val[w]!=INF){
                pte(val[w]);
                continue;
            }
            vector<int>mn(n+1,INF);
            mn[n]=now;
            rep(p,1,n){
                int up=(1<<p)-1;
                rep(i,0,up-1){
                    int w=0,tot=0;
                    rep(j,0,p-1){
                        int z=i>>j&1,v=0;
                        if(z)v=27,tot++;
                        else v=(s[j]-'a'+1);
                        w+=v*bs[j];
                    }
                    mn[tot+n-p]=min(mn[tot+n-p],val[w]);
                }
            }
            rep(i,0,n){
                if(mn[i]!=INF){
                    //printf("i:%d mn:%d\n",i,mn[i]);
                    pte(mn[i]);
                    break;
                }
            }
        }
    }
    return 0;
}
/*
3 9 = 15
*/

B. Turn Off The Lights(构造)

最终一定是和某一列完全相同/完全相反的,

不妨和第i列完全相同,全是01011,那么再把这三列的1按列取消掉就可以了

所以枚举和哪列相同,bitset加速统计,复杂度O(n^3/64)

#include <bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<vector>
#include<map>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair<int,int> P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
using namespace std;
const int N=1e3+10;
int n,k,a[N][N],sum[N];
bitset<1005>b[2][N];
bool flip[N];
bool ck(int i){
    int sum=0;
    rep(j,1,n){
        if(j==i)continue;
        int s1=(b[1][i]^b[0][j]).count(),s2=(b[0][i]^b[0][j]).count();
        if(s1<s2)flip[j]=1;
        else flip[j]=0;
        sum+=min(s1,s2);
    }
    return sum<=k;
}
void out(int i){
    //printf("i:%d\n",i);
    vector<P>ans;
    rep(j,1,n){
        if(j==i)continue;
        if(flip[j])ans.pb(P(j,0));
        rep(x,1,n){
            if(flip[j]){
                if(a[j][x]!=(a[i][x]^1))ans.pb(P(j,x));
            }
            else{
                if(a[j][x]!=a[i][x])ans.pb(P(j,x));
            }
        }
    }
    rep(x,1,n){
        if(a[i][x])ans.pb(P(0,x));
    }
    pte(SZ(ans));
    for(auto x:ans){
        printf("%d %d\n",x.fi,x.se);
    }
}
int main(){
    sci(n),sci(k);
    rep(i,1,n){
        rep(j,1,n){
            sci(a[i][j]);
            if(a[i][j])b[0][i].set(j);
            else b[1][i].set(j);
        }
    }
    rep(i,1,n){
        rep(x,0,1){
            if(ck(i)){
                out(i);
                return 0;
            }
        }
    }
    puts("-1");
    return 0;
}
/*
3 9 = 15
*/

F. XOR Game(博弈)

先从大到小考虑ai=1的值,z是0的个数算最小的数

因为操作一次就可以获得收益/ban掉对应收益,所以alice和bob会先抢这部分

剩下的局面,尽可能避免2的出现, 全是2的情况,谁先操作谁就输了,

所以判一下剩下局面的奇偶性,奇数alice全取,偶数bob全ban

#include <bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<vector>
#include<map>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair<int,int> P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
using namespace std;
const int N=1e5+10;
int k,z,a[N],b[N],c;
int main(){
    sci(k);sci(z);
    rep(i,0,k-1){
        sci(a[i]);
    }
    per(i,k-1,0){
        if(a[i]==1){
            c++;
            if(c&1)b[i]=1;
            a[i]=0;
        }
    }
    per(i,k-1,0){
        if(a[i]&1)c++;
    }
    c+=(z&1);
    per(i,k-1,0){
        if(!a[i])continue;
        if(c&1)b[i]=1;
    }
    per(i,k-1,0){
        printf("%1d",b[i]);
    }
    puts("");
    return 0;
}
/*
3 9 = 15
*/

I. Smart Quality Inspector(状压dp+区间dp)

避免后效性,肯定是从大到小考虑max值,

被前面的最大值覆盖了的区间,再选最大值时就没有贡献了

dp[S]表示当前最大值已经覆盖的状态是S时的最大代价和

b[i][l][r]表示区间包含第i位且被[l,r]完整包含的区间的数量

新增一位时,往左往右拓展0的区域找到最左最右,这一段的b值对应的区间都是有贡献的

复杂度O(n^5+n*2^n)

#include <bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<vector>
#include<map>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair<int,int> P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
using namespace std;
const int N=25,M=(1<<20)+5,INF=0x3f3f3f3f;
int n,k,m,l,r,a[N][N],b[N][N][N],dp[M];
void upd(int &x,int y){
    x=min(x,y);
}
int main(){
    sci(n),sci(k),sci(m);
    rep(i,1,m){
        sci(l),sci(r);
        a[l][r]++;
    }
    rep(i,1,n){
        rep(l,1,i){
            rep(r,i,n){
                rep(x,l,i){
                    rep(y,i,r){
                        b[i][l][r]+=a[x][y];
                    }
                }
            }
        }
    }
    memset(dp,INF,sizeof dp);
    dp[0]=0;
    int up=(1<<n)-1;
    rep(i,0,up){
        vector<int>pre(n,-1),suf(n,n);
        int now=-1,bit=0;
        rep(j,0,n-1){
            int v=i>>j&1;
            if(v==1)now=j,bit++;
            else pre[j]=now+1;
        }
        now=n;
        per(j,n-1,0){
            int v=i>>j&1;
            if(v==1)now=j;
            else{
                suf[j]=now-1;
                int x=j+1,y=pre[j]+1,z=suf[j]+1;
                upd(dp[i|(1<<j)],dp[i]+b[x][y][z]*max(k-bit,0));
            }
        }
    }
    pte(dp[up]);
    return 0;
}

赛后补题

G. The Last Cumulonimbus Cloud(拓扑排序好题)

任意非空子图都有一个度不超过10的点=可以把度>10的点的贡献都归到这些不超过10的点上

拓扑排序每删掉一个度数不足10的点就会多出一个不足10的点

最后图可以化成一个联通且每个点出度均不超过10的dag

u加的时候把贡献推到u的下游

u算的时候上游已经推给过u,只需要再加上u的所有下游的贡献

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

idea解决“源根之外的java文件“的问题

一&#xff0c;问题 idea编辑器打开一些老Spring项目&#xff0c;会出现项目结构解析不正确&#xff0c;最后整个项目的java文件都无法正常运行&#xff0c;显示“源根之外的java文件”。 二&#xff0c;解决 打开File->项目结构 选中模块&#xff0c;然后在右边选中对应的…

2024年武汉东湖高新中级职称报名时间是什么时候?

2024年武汉市东湖高新中级职称上半年批次报名已经截止了&#xff0c;下半年东湖高新至少还有一次报名机会&#xff0c;所以各位东湖高新区评职称的朋友们&#xff0c;不要错过这次了。 2024年武汉东湖高新区中级职称报名条件&#xff1a; 1.东湖高新区社保满足1年&#xff0c;近…

LayerSkip:加速大模型推理的端到端解决方案

大模型&#xff08;LLMs&#xff09;在多种应用中表现出色&#xff0c;但其高昂的计算和内存需求导致部署成本昂贵&#xff0c;尤其是在GPU服务器上。现有加速方案在部署到普通GPU时往往会导致准确性显著下降&#xff0c;而将大模型&#xff08;LLMs&#xff09;进一步加速以部…

时间复杂度与空间复杂度的计算

空间复杂度 (O(1)) 空间复杂度是衡量算法在运行过程中所需的额外内存空间。(O(1)) 表示算法只需要常量级别的额外空间&#xff0c;不会随着输入数据的大小 (n) 增加而增加。也就是说&#xff0c;无论处理的数据有多大&#xff0c;算法所需的额外内存空间始终是固定的。 对于选…

链表的回文结构的判定(C语言)怎会如此简单!!!

目录 题目思路分析如何找到中间节点如何实现反转链表链表的对比完整代码 题目 链接: 题目 描述&#xff1a; 对于一个链表&#xff0c;请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法&#xff0c;判断其是否为回文结构。 给定一个链表的头指针A&#xff0c;请返回一个…

php反序列化中的pop链

目录 一、什么是POP 二、成员属性赋值对象 例题&#xff1a; 方法一 方法二 三、魔术方法的触发规则 例题&#xff1a; 四、POC的编写 例题1&#xff1a; 例题2 [NISACTF 2022]babyserialize 今日总结&#xff1a; 一、什么是POP 在反序列化中&#xff0c;我们…

Git配置免密登录Github

1、登录 GitHub &#xff0c;点击右上角头像&#xff0c;选中 Settings (设置)。 在 https://github.com 登录你的帐号&#xff0c;登录以后点击右上角你的头像的Settings 如果没有设置&#xff0c;输入下面的指令进行设置&#xff1a; git config --global user.name “用户名…

【启明智显技术分享】sigmastar ssd202d双网口开发板多串口调试说明

提示&#xff1a;作为Espressif&#xff08;乐鑫科技&#xff09;大中华区合作伙伴及sigmastar&#xff08;厦门星宸&#xff09;VAD合作伙伴&#xff0c;我们不仅用心整理了你在开发过程中可能会遇到的问题以及快速上手的简明教程供开发小伙伴参考。同时也用心整理了乐鑫及星宸…

cesium 的初步认识

Cesium是一个基于JavaScript开发的WebGL三维地球和地图可视化库。它利用了现代Web技术&#xff0c;如HTML5、WebGL和WebAssembly&#xff0c;来提供跨平台和跨浏览器的三维地理空间数据可视化。Cesium的主要特点包括&#xff1a; 跨平台、跨浏览器&#xff1a;无需额外插件&am…

4个免费音频转换器:解放您的音频文件格式转换需求

在日常生活和工作中&#xff0c;我们经常需要处理各种音频文件&#xff0c;但有时候这些文件可能并不是我们需要的特定格式。在这种情况下&#xff0c;一个免费的音频转换器就能派上用场。免费音频转换器是一种非常实用的工具&#xff0c;它可以帮助我们将不同格式的音频文件相…

C++栈、队列

文章目录 目录 文章目录 前言 一、stack、queue介绍 1.stack 2.queue 二、stack、queue的习题 1. 最小栈 2. 栈的压入、弹出序列 3.二叉树的层序遍历 三、stack和queue的模拟实现 1.stack的模拟实现 2.queue的模拟实现 前言 栈和队列是俩种特殊的容器&#xff0c;C在实现栈和队…

contentType 与 dataType

contentType 与 dataType contentType contentType&#xff1a;发送的数据格式&#xff08;请求方发送给服务器的数据格式&#xff09;&#xff0c;这个内容会放在请求方的 请求头中 application/x-www-form-urlencoded 这个是默认的请求格式。 提交给后台的数据会按照 KV&am…

瑞意教育集团阳光助学 军训展风采 青春正当时2024级新生军训圆满落幕

为推进全民素质教育,弘扬爱国主义精神,增强学生的国防意识,培养顽强的意志品格,5月7日—5月10日,瑞意教育集团举行2024级新生军训活动。 2024年5月7日上午8点,瑞意教育集团2024级新生军训动员大会在学校体育场举行,学校校长郭禹彤出席动员大会,并强调注意事项。 "立正!&qu…

AIGC绘画基础——Midjourney关键词大全+万能公式

距发布MJ初级注册入门教程已有时日&#xff0c;很多粉丝表示很有用&#xff0c;但关键词有很多人不知如何组合使用&#xff0c;那今天再给大家更新一期&#xff0c;主要是教大家如何用关键词、把控关键词描述&#xff0c;除此之外在文末更新了一大堆关键词给大家使用~ 一、Midj…

算法工程师需要学习C++的哪些知识?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;以下是算法工程师需要学习的一些…

韶关学院携手泰迪智能科技“见习研学”活动圆满结束

为进一步深化校企合作&#xff0c;落实高校应用型人才培养。5月31日&#xff0c;韶关学院与广东泰迪智能科技股份有限公司联合开展学生企业见习活动。专业教师林思思以及来自韶关学院140名学生参与此次见习活动&#xff0c;泰迪智能科技培训业务部经理钟秋平、校企合作经理吴桂…

linux系统getopt_long函数使用

在linux程序中&#xff0c;我们还经常看见使用--标识输入参数的&#xff0c;这种就需要使用getopt_long函数来解析。 如下使用方式&#xff1a; while ((opt getopt_long(argc, argv, short_options, long_options, &option_index)) ! -1) { //...... } 参数longopts结…

【Python入门学习笔记】Python3超详细的入门学习笔记,非常详细(适合小白入门学习)

Python3基础 想要获取pdf或markdown格式的笔记文件点击以下链接获取 Python入门学习笔记点击我获取 1&#xff0c;Python3 基础语法 1-1 编码 默认情况下&#xff0c;Python 3 源码文件以 UTF-8 编码&#xff0c;所有字符串都是 unicode 字符串。 当然你也可以为源码文件指…

VSCode编译C++代码

1. 自定义编译 主要通过 设置任务&#xff08;动作&#xff09;来实现。 tasks.json文件相当于vscode的.sh或.bat文件&#xff0c;用来记录一系列操作的宏。 一系列动作&#xff0c;那就可以用来设置 如何编译文件&#xff0c;如何 运行文件&#xff0c;几乎.sh能干的都可以干…

三维地图校内导航系统解决方案

在如今的数字化时代&#xff0c;越来越多的学校开始实施智慧校园计划&#xff0c;旨在为学生和教师提供更高效、便捷的学习和教学环境。智慧校园运用互联网、大数据、人工智能等技术&#xff0c;对校园内各信息进行收集、整合、分析和应用&#xff0c;实现教学、管理、服务等多…