cf集合***

当周cf集合,我也不知道是不是当周的了,麻了,下下周争取写到e补f

C. Kevin and Puzzle(999)

题解:一眼动态规划,但是具体这个状态应该如何传递呢?

关键点:撒谎的人不相邻,

于是,就有以下两种情况

如果前一个不是liar,那么当前这个人和前一个人的a[i]都一定相同,满足a[i]==a[i-1],则可以状态转移

前一个人是liar,那么当前这个人和前一个的前一个人一定不是liar,满足a[i]==a[i-2]+1,则可以状态转移

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 998244353;
int n,m;
vector<int>a;
void solve() {
    cin>>n;
    a.clear();
    int dp[n+10];
    memset(dp,0,sizeof dp);
    a.push_back(0);
    for(int i=0;i<n;i++) {
        int x;
        cin>>x;
        a.push_back(x);
    }
    dp[0]=1;
    for(int i=1;i<=n;i++) {
        if(a[i]==a[i-1]) dp[i]+=dp[i-1];
        if(a[i]==a[i-2]+1) dp[i]+=dp[i-2];
        dp[i]%=mod;
    }
    cout<<(dp[n]+dp[n-1])%mod<<endl;
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    cin>>t;
    while(t--) {
        solve();
    }
    return 0;
}

D. Kevin and Numbers(999)

题解:

突破点:a中(abs(x-y)<=1)可以合并 == b中所有数都可以拆成x/2+(x-x/2)

b中不需要拆分的元素就是与a共有的元素,其余数都需要拆分,且拆分的过程和结果一定,用优先队列对a,b从大到小拆分,每次拆b中最大且a中没有的元素可保证b的拆分是必要的

所以逆向思维很重要<_>

代码:


#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 998244353;
int n,m;
map<int,int>ma;
map<int,int>mb;
bool com() {
    for(auto it=ma.begin();it!=ma.end();it++) {
        if(mb.find(it->first)!=mb.end()) {
            int num=min(it->second,mb[it->first]);
            it->second-=num;
            mb[it->first]-=num;
        }
    }
    priority_queue<int,vector<int>,less<int> >p;
    priority_queue<int,vector<int>,less<int> >q;
    for(auto it=ma.begin();it!=ma.end();it++) {
        while(it->second!=0) {
            p.push(it->first);
            it->second--;
        }
    }
    for(auto it=mb.begin();it!=mb.end();it++) {
        while(it->second!=0) {
            q.push(it->first);
            it->second--;
        }
    }
    while(q.size()) {
        if(!q.size()||!p.size()||q.size()>p.size()) {
            break;
        }
        //cout<<q.top()<<" "<<p.top()<<endl;
        if(q.top()==p.top()) {
            q.pop();
            p.pop();
        }
        else if(q.top()>p.top()) {
            int temp=q.top();
            q.pop();
            q.push(temp/2);
            q.push(temp-temp/2);
        }
        else {
            return false;
        }
    }
    if(q.size()||p.size()) return false;
    return true;
}
void solve() {
    cin>>n>>m;
    ma.clear();
    mb.clear();
    for(int i=0;i<n;i++) {
        int x;
        cin>>x;
        ma[x]++;
    }
    for(int j=0;j<m;j++) {
        int x;
        cin>>x;
        mb[x]++;
    }
    if(com()) {
        cout<<"YES"<<endl;
    }
    else {
        cout<<"NO"<<endl;
    }
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    cin>>t;
    while(t--) {
        solve();
    }
    return 0;
}

E. Kevin and And(999)

 题解:贪心的思路,每一个数可以更新cnt<m次,我们可以通过二进制枚举算出进行k次操作的最大贡献,对于单个 i,操作的收益是单调减的,因此可以用堆维护这个操作过程。

其次,这个题reminded me of BD202401(简单版)

代码:


#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 998244353;
int n,m;
int k;
#define PII pair<int,int>
vector<int>a;
vector<int>b;
int c[1<<11];
int s[100010][12];
int num[100010];
void solve() {
    cin>>n>>m;
    cin>>k;
    a.clear();
    b.clear();
    //memset(num,0,sizeof(num));
    //memset(s,0,sizeof(s));
    for(int i=0;i<n;i++) {
        int x;cin>>x;
        a.push_back(x);
    }
    for(int i=0;i<m;i++) {
        int x;cin>>x;
        b.push_back(x);
    }
    for(int i=0;i<1<<m;i++) {//二进制枚举1-m次操作
        c[i]=(1<<30)-1;
        for(int j=0;j<m;j++) {
            if(i>>j&1) c[i]&=b[j];
        }
    }
    priority_queue<PII,vector<PII>,less<PII> > q;
    int ans=0;
    for(int i=0;i<n;i++) {//s[i][k]表示a[i]进行k次操作的最大贡献
        for(int j=0;j<=m;j++) {s[i][j]=0;}
        for(int j=0;j<1<<m;j++) {
            int k=__builtin_popcount(j);
            s[i][k]=max(s[i][k],a[i]-(a[i]&c[j]));
        }
        ans+=a[i];
        num[i]=0;
    }
    for(int i=0;i<n;i++) {
        q.push({s[i][1],i});
    }
    while(k--) {//每次操作保证是最大贡献
        int p=q.top().second;
        ans-=q.top().first;
        q.pop();
        ++num[p];
        if(num[p]<m) {
            q.push({s[p][num[p]+1]-s[p][num[p]],p});
        }
    }
    cout<<ans<<endl;
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    cin>>t;
    while(t--) {
        solve();
    }
    return 0;
}

E. Divisor Paths(ECR85)

思路:不愧是2200的题,对于我来说,确实是有点难的,相关很多知识点,单独拎一个出来,我都要思考好久

这个题,按照常规思路先建图,再求最短路数量(废话),但是,我们发现无论是空间还是时间都不够我们建图,所以我们考虑直接找最短路

最新学的一种思维方式,先列重点

1.y/x必须为素数

2.每走一条边都是增加或者减少一个质因子,边权也就是增加或者减少的因子个数,于是我们可以推测出:x→y的最优路径一定是x→gcd(x,y)→y (相反我认为也可以走最小公倍数(错的),但是质因子就不一定在D里面了,cf评论区有相关的证明)

因为这样能保证减少或增加的质因子是其他所有方案减少或增加的质因子的子集,那么显然减少或增加的因数个数是最少的。

x→gcd(x,y)这个过程中因数个数是在减少的,所以删去质因子的顺序可随意排列

gcd(x,y)→y 这个过程中同上

所以我们可以先分解D的因子,然后将x/gcd(x,y)进行质因数分解,因为x,gcd(x,y)都是D的因子,所以可以直接用D的质因子试,我们只需要知道x/gcd(x,y)​质因数分解出的质因子个数cnt即可(在这里提醒一下,我们要求的是方案数,所以最短路是多少是不需要计算的)

最后将x→gcd(x,y)以及gcd(x,y)→x的路径数相乘即可

(实际上这个题补完,我都不知道要怎么去写我的题解,我也有点懵)

代码:


#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10;
int n,m;
#define PII pair<int,int>
const int mod = 998244353;
int f[N];
int inv[N];
vector<int>p;
int qpow(int a,int b) {
    int res=1;
    while(b) {
        if(b&1) res=(res*a)%mod;
        a=(a*a)%mod;
        b>>=1;
    }
    return res;
}
void init(int n) {
    f[0]=1;
    for(int i = 1; i <= n; i++) {
        f[i]=f[i-1]*i%mod;
    }
    inv[n] = qpow(f[n], mod - 2);
    for (int i = n; i; --i) {
        inv[i - 1] =  inv[i] * i % mod;//阶乘的逆元
    }
}
int get(int x) {
    int z = 1,tot=0;
    for(int i=0;i<p.size();i++) {
        int cnt=0;
        while(x%p[i]==0) x/=p[i],cnt++;//这里是组合数学,很细节了,没想到就wa吧
        z=z*inv[cnt]%mod;
        tot+=cnt;
    }

    return z*f[tot]%mod;
}
void solve() {
    cin>>n;
    init(210);
    int tmp = n;
    for(int i=2; i* i <= n; i++ ) {
        if(tmp % i == 0) {
            p.push_back(i);
        }
        while(tmp % i == 0) tmp/=i;
    }
    if(tmp > 1) p.push_back(tmp);//巧妙求质因数集合

    cin >> m;
    while( m-- ) {
        int  x, y;
        cin >> x>> y;
        int g = gcd (x,y);
        cout << get(x / g) *get(y / g) % mod << "\n";
    }

}
signed main() {
    int t=1;
    //cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

D. Game With Triangles(1000)

思路:用g(p,q)表示面积和吗,可得kmax

由于f(k)=max(g(x,k-x)) 

  • 2x+k−x=x+k≤n⟷x≤n−k;
  • x+2(k−x)=2k−x≤m⟷x≥2k−m;
  • x≥0;
  • k−x≥0⟷x≤k.
  • 所以x的范围:max(0,2k−m)≤x≤min(k,n−k)

用两个前缀和统计两个面积最大值,由于f(k)的函数是一个凸函数,所以用三分求出最大值区间

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int k;
const int N=1e5+10;
#define PII pair<int,int>
vector<int>a;
vector<int>b;
int asum[N];
int bsum[N];
void solve() {
    cin>>n>>m;
    for(int i=0;i<n;i++) {
        int x;
        cin>>x;
        a.push_back(x);
    }
    for(int i=0;i<m;i++) {
        int x;
        cin>>x;
        b.push_back(x);
    }
    sort(a.begin(),a.end());
    sort(b.begin(),b.end());
    asum[0]=0;
    bsum[0]=0;
    for(int i=1;i<=n;i++)asum[i]=asum[i-1]+(a[n-i]-a[i-1]);
    for(int i=1;i<=m;i++)bsum[i]=bsum[i-1]+(b[m-i]-b[i-1]);
    vector<int >ans;
    for(int i=1;2*i-m<=n-i;i++)
    {
        int L=max((int)0,2*i-m),R=min(i,n-i);
        if(L>R)break;
        auto f=[&](int ka){return asum[ka]+bsum[i-ka];};
        while(R-L>3)
        {
            int mL=(L*2+R)/3,mR=(L+R*2)/3;
            if(f(mL)>f(mR))R=mR;
            else L=mL;
        }
        int mans=0;
        for(int i=L;i<=R;i++)
        {
            mans=max(mans,f(i));
        }
        ans.push_back(mans);
    }
    int kmax=(int)size(ans)-1;
    cout<<kmax<<"\n";
    for(int i=1;i<=kmax;i++)cout<<ans[i]<<" \n"[i==kmax];
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    cin>>t;
    while(t--) {
        solve();
    }
    return 0;
}

E. Graph Composition(998)

题解:

1.并查集。我们用fu,gu表示点u在两个图所在的集合。首先如果(u,v)∈f,并且g(u)≠g(v),那么这条边一定要删,g(u)≠g(v),在f中添加这条边;然后在枚举g的集合,如果v∈g并且v∉f,添加这条边

从无向图转换成集合,能够直接联想到并查集(但是我没有想到)

2.dfs。

代码:

#include<bits/stdc++.h>
using namespace std;
#define PII pair<int,int>
int n,m,k;
const int N=2e5+10;
vector<PII>a;
vector<PII>b;
int f1[N];
int f2[N];
void solve() {
    cin>>n>>m>>k;
    a.clear();
    b.clear();
    for(int i=0;i<=n;i++) f1[i] = i,f2[i] = i;

    function<int(int)> find1 =[&](int x)->int {
        return  x == f1[x] ? x : f1[x] = find1(f1[x]);
    };
    function<int(int)> find2 =[&](int x)->int {
        return  x == f2[x] ? x : f2[x] = find2(f2[x]);
    };
    for(int i=0;i<m;i++) {
        int x,y;
        cin>>x>>y;
        a.push_back({x,y});
    }
    for(int i=0;i<k;i++) {
        int x,y;
        cin>>x>>y;
        f2[find2(x)]=find2(y);
        b.push_back({x,y});
    }
    int ans=0;
    for(auto [x,y]:a) {
       // cout<<find1(x)<<" "<<find2(y)<<endl;
        if(find2(x) != find2(y)) {
            ans++;
        }
        else {
            f1[find1(x)]=find1(y);
        }
    }
    map<int,vector<int>>mp;

    for(int i=1;i<=n;i++) {
        mp[find2(i)].push_back(i);
    }
    for(int i=1;i<=n;i++) {
        for(auto & x:mp[i]) {
            if(find1(x) != find1(i)) {
                ans++;
                f1[find1(x)]=find1(i);
            }
        }
    }
    cout << ans << endl;


}
int main() {
    int _=1;
    cin>>_;
    while (_--) {
        solve();
    }
    return 0;
}

B. Find the Permutation(997)

题解:我是万万没想到哈,我居然这题能写不出来,真是一天比一天菜了

代码:

#include <bits/stdc++.h>

using namespace std;

void solve() {
    int n;
    cin >> n;
    vector<string> g(n);
    for(auto &i : g) {
        cin >> i;
    }
    vector<int> p(n);
    iota(p.begin(), p.end(), 0);
    sort(p.begin(), p.end(),
    [&](int x, int y) {
        if(g[x][y] == '1') return x < y;
        else return x > y;
    });
    for(auto i : p) cout << i + 1 << " "; cout << '\n';
}

signed main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int ttt = 1;
    cin >> ttt;
    while(ttt--) {
        solve();
    }
}

C. Palindromic Subsequences(997)

题解:构造,赛时没想出来,蠢

代码:


#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,m;
#define PII pair<int,int>

int main() {
    int t;
    cin >> t;
    while (t--) {
        cin >> n ;
        cout << 1<<" "<<1 <<" ";
        for(int i = 3;i <= n-1;i += 1) cout<< i <<" ";
        cout << 1 << endl;
    }
    return 0;
}

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

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

相关文章

蓝桥杯思维训练营(一)

文章目录 题目总览题目详解翻之一起做很甜的梦 蓝桥杯的前几题用到的算法较少&#xff0c;大部分考察的都是思维能力&#xff0c;方法比较巧妙&#xff0c;所以我们要积累对应的题目&#xff0c;多训练 题目总览 翻之 一起做很甜的梦 题目详解 翻之 思维分析&#xff1a;一开…

基于微信小程序的电子商城购物系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

变量和常量

一.变量 1.标准声明 var 变量名 变量类型 变量声明行末不需要分号 2..批量声明 package main import "fmt" func main(){var(a string b int c boold float32)}3.变量的初始化 var a int 10 var b float321.1 4.类型推导 var name"tom" var age18 fmt.Pr…

7. 马科维茨资产组合模型+金融研报AI长文本智能体(Qwen-Long)增强方案(理论+Python实战)

目录 0. 承前1. 深度金融研报准备2. 核心AI函数代码讲解2.1 函数概述2.2 输入参数2.3 主要流程2.4 异常处理2.5 清理工作2.7 get_ai_weights函数汇总 3. 汇总代码4. 反思4.1 不足之处4.2 提升思路 5. 启后 0. 承前 本篇博文是对前两篇文章&#xff0c;链接: 5. 马科维茨资产组…

Linux网络 HTTP cookie 与 session

Cookie 定义与功能&#xff1a;Cookie是服务器发送到用户浏览器并保存在本地的一小块数据&#xff0c;它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常&#xff0c;它用于告知服务端两个请求是否来自同一浏览器&#xff0c;如保持用户的登录状态、记录…

BW AO/工作簿权限配置

场景&#xff1a; 按事业部配置工作簿权限&#xff1b; 1、创建用户 事务码&#xff1a;SU01&#xff0c;用户主数据的维护&#xff0c;可以创建、修改、删除、锁定、解锁、修改密码等 用户设置详情页 2、创建权限角色 用户的权限菜单是通过权限角色分配来实现的 2.1、自定…

Python之Excel操作 - 写入数据

我们将使用 openpyxl 库&#xff0c;它是一个功能强大且易于使用的库&#xff0c;专门用于处理 Excel 文件。 1. 安装 openpyxl 首先&#xff0c;你需要安装 openpyxl 库。你可以使用 pip 命令进行安装&#xff1a; pip install openpyxl创建一个文件 example.xlsx&#xff…

【后端开发】字节跳动青训营之性能分析工具pprof

性能分析工具pprof 一、测试程序介绍二、pprof工具安装与使用2.1 pprof工具安装2.2 pprof工具使用 资料链接&#xff1a; 项目代码链接实验指南pprof使用指南 一、测试程序介绍 package mainimport ("log""net/http"_ "net/http/pprof" // 自…

2025开源DouyinLiveRecorder全平台直播间录制工具整合包,多直播同时录制、教学直播录制、教学视频推送、简单易用不占内存

一、DouyinLiveRecorder软件介绍&#xff08;文末提供下载&#xff09; 官方地址&#xff1a;GitHub - ihmily/DouyinLiveRecorder 本文信息来源于作者GitHub地址 一款简易的可循环值守的直播录制工具&#xff0c;基于FFmpeg实现多平台直播源录制&#xff0c;支持自定义配置录制…

大数据学习之SCALA分布式语言三

7.集合类 111.可变set一 112.可变set二 113.不可变MAP集合一 114.不可变MAP集合二 115.不可变MAP集合三 116.可变map一 package com . itbaizhan . chapter07 //TODO 2. 使用 mutable.Map 前导入如下包 import scala . collection . mutable // 可变 Map 集合 object Ma…

RAG是否被取代(缓存增强生成-CAG)吗?

引言&#xff1a; 本文深入研究一种名为缓存增强生成&#xff08;CAG&#xff09;的新技术如何工作并减少/消除检索增强生成&#xff08;RAG&#xff09;弱点和瓶颈。 LLMs 可以根据输入给他的信息给出对应的输出&#xff0c;但是这样的工作方式很快就不能满足应用的需要: 因…

使用 Tauri 2 + Next.js 开发跨平台桌面应用实践:Singbox GUI 实践

Singbox GUI 实践 最近用 Tauri Next.js 做了个项目 - Singbox GUI&#xff0c;是个给 sing-box 用的图形界面工具。支持 Windows、Linux 和 macOS。作为第一次接触这两个框架的新手&#xff0c;感觉收获还蛮多的&#xff0c;今天来分享下开发过程中的一些经验~ 为啥要做这个…

三甲医院大型生信服务器多配置方案剖析与应用(2024版)

一、引言 1.1 研究背景与意义 在当今数智化时代&#xff0c;生物信息学作为一门融合生物学、计算机科学和信息技术的交叉学科&#xff0c;在三甲医院的科研和临床应用中占据着举足轻重的地位。随着高通量测序技术、医学影像技术等的飞速发展&#xff0c;生物医学数据呈爆发式…

2025_2_1 C语言中关于字符串

1.字符串 C语言中的字符串都是字符数组&#xff0c;以空字符 ‘\0’结尾。 创建一个字符数组必须以空字符结尾&#xff0c;不然会访问非法区域&#xff0c;直到找到\0为止 char c[] {a, b, c, \0};长度为n的字符串字面值&#xff0c;会存储在虚拟内存中的只读数据段中&#…

Redis篇 Redis如何清理过期的key以及对应的解决方法

Redis设置Key过期时间 在 Redis 中&#xff0c;可以通过特定的命令为 Key 设置过期时间&#xff0c;使得 Key 在一定时间后自动删除&#xff0c;这对于管理缓存、验证码等临时数据非常有用。 解决方法 1. Redis过期删除策略 1.1 如何实现过期策略 对一个 key 设置了过期时间…

java练习(1)

两数之和&#xff08;题目来自力扣&#xff09; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相…

Python3 OS模块中的文件/目录方法说明十四

一. 简介 前面文章简单学习了 Python3 中 OS模块中的文件/目录的部分函数。 本文继续来学习 OS 模块中文件、目录的操作方法&#xff1a;os.statvfs() 方法&#xff0c;os.symlink() 方法。 二. Python3 OS模块中的文件/目录方法 1. os.statvfs() 方法 os.statvfs() 方法用…

从理论到实践:Linux 进程替换与 exec 系列函数

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言&#xff1a; 在Linux中&#xff0c;进程替换&#xff08;Process Substitution&#xff09;是一个非常强大的特性&#xff0c;它允许将一个进程的输出直接当作一个文件来处理。这种技术通常用于Shell脚本和命令行操作中…

ZZNUOJ(C/C++)基础练习1041——1050(详解版)

1041 : 数列求和2 题目描述 输入一个整数n&#xff0c;输出数列1-1/31/5-……前n项的和。 输入 输入只有一个整数n。 输出 结果保留2为小数,单独占一行。 样例输入 3 样例输出 0.87注意sum 1相当于sumsum1 注意sum * 1相当于sumsum*1 C语言版 #include<stdio.h> // 包含…

2021 年 6 月大学英语四级考试真题(第 2 套)——纯享题目版

&#x1f3e0;个人主页&#xff1a;fo安方的博客✨ &#x1f482;个人简历&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;目前中南大学MBA在读&#xff0c;也考取过HCIE Cloud Computing、CCIE Security、PMP、CISP、RHCE、CCNP RS、PEST 3等证书。&#x1f433; &…