Codeforces Round 906 (Div. 2)(D推公式 E1分类讨论区间 E2 dp+线段树)

news2024/12/23 18:17:31

A - Doremy's Paint 3

推公式得

b1=b3=b5=b7....

b2=b4=b6=b8...

所以如果只有一个数或者两个数且数量差小于等于1即可

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10,mod=1000003;
#define int long long
typedef long long LL;
typedef pair<int, int> PII;
const long long inf=1e17;
int n,m,k;
vector<int> g[N];
int a[N];
void solve()
{
    cin>>n;
    map<int,int> mp;
    for(int i=1;i<=n;i++) cin>>a[i],mp[a[i]]++;
    sort(a+1,a+1+n);
    if(mp.size()<=2)
    {
        if(mp.size()==1)
        {cout<<"Yes\n";return ;}
        else
        {
            auto x=mp[a[1]];
            auto y=mp[a[n]];
            if(abs(x-y)<=1){
                cout<<"Yes\n";
            }
            else cout<<"No\n";
        }
    }
    else cout<<"No\n";
}

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

B - Qingshan Loves Strings

老规矩操作题先思考操作的性质

如果T串本身不合法那么就NO了,且我们插入肯定是在相同的时候插入

比如 相邻的0 或相邻的1,这时候要求T串首尾要不同且能接的上

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10,mod=1000003;
#define int long long
typedef long long LL;
typedef pair<int, int> PII;
const long long inf=1e17;
int n,m,k;
vector<int> g[N];
int a[N];
bool check(string s){
    for(int i=1;i<s.size();i++){
        if(s[i]==s[i-1]) return false;
    }
    return true;
}
void solve()
{
    cin>>n>>m;
    string s,t;
    cin>>s>>t;
    if(check(s))
    {
        cout<<"YES\n";return ;    
    }
    else{
        if(!check(t)||t[0]!=t.back()){
            cout<<"NO\n";return ;
        }
    }
    for(int i=1;i<n;i++){
        if(s[i]==s[i-1]){
            if(s[i]==t[0]){
                cout<<"NO\n";return ;
            }
        }
    }
    cout<<"YES\n";
}

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

C:C - Qingshan Loves Strings 2

看范围100 所以可以n^2去暴力

考虑插入哪个位置

如果 0XXXX0,因为只能插入 01 那么这个只能插入到翻转位置后的那个位置,否则就是无效插入

如果是1XXXX1,因为只能插入01 只能插入到第一个字母的前面

所以可得 如果当前是0 那么插入当前位置的翻转后的位置,如果当前是1,那么插入到当前位置的前面的位置

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10,mod=1000003;
#define int long long
typedef long long LL;
typedef pair<int, int> PII;
const long long inf=1e17;
int n,m,k;
vector<int> g[N];
int a[N];
int check(string s){
    int n=s.size()-1;
    for(int i=1;i<=(n+1)/2;i++){
        if(s[i]==s[n-i+1]){
            return i;
        }
    }
    return 0;
}
void solve()
{
    cin>>n;
    string s;
    cin>>s;
    vector<int> res;
    s="?"+s;
    for(int j=1;j<=300;j++)
    {
        int x=check(s);
        if(!x)
        {
            cout<<res.size()<<"\n";
            for(auto x:res) cout<<x<<" ";
            cout<<"\n";
            return ;
        }
        n=s.size()-1;
     //   cout<<s<<"\n";
        if(s[x]=='0'){
            res.push_back(n-x+1);
            string t;
            for(int i=0;i<=n-x+1;i++)
            {
                t.push_back(s[i]);
            }
            t+="01";
            for(int i=n-x+1+1;i<=n;i++) t.push_back(s[i]);
            swap(s,t);
        }
        else
        {
            res.push_back(x-1);
            string t;
            for(int i=0;i<=x-1;i++)
            {
                t.push_back(s[i]);
            }
            t+="01";
            for(int i=x;i<=n;i++) t.push_back(s[i]);
            swap(s,t);
        }
    }
  //  cout<<check(s)<<"\n";
    if(check(s)) cout<<-1<<"\n";
    else{
        cout<<res.size()<<"\n";
        for(auto x:res) cout<<x<<" ";
        cout<<"\n";return ;
    }
}

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

D - Doremy's Connecting Plan

这是个推公式题,肯定是用已经联通的块连向其他点

设只有两个数

ai+ aj >=i*j*c

然后发现好像不太能合并,然后可以想到1如果i=1,那么就单纯的变成

0>=j*c-aj,然后后面一直用1点去联通即可

证明

ai + aj>=i*j*c

a1+ai<i*c

a1+aj<j*c

假设只能连 i j的点,不能先连 1点,

用反证法得

a1+a1<(i+j-i*j)*c

因为i和j不能为1

所以这个(i+j-i*j)肯定是负数,不满足等式,所以证明如果能连i和j点,必然可以先连1点

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10,mod=1000003;
#define int long long
typedef long long LL;
typedef pair<int, int> PII;
const long long inf=1e17;
int n,m,k;
vector<int> g[N];
int a[N];
void solve()
{
    int c;
    cin>>n>>c;
    priority_queue<PII,vector<PII>,greater<PII>> q;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        if(i!=1) q.emplace(i*c-a[i],i);
    }
  
    auto now=a[1];
    while(q.size())
    {
        auto t=q.top();
        if(now>=t.first){
            now+=a[t.second];
            q.pop();
        }
        else break;
    }
    if(q.size()) cout<<"No\n";
    else cout<<"Yes\n";
}

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

E1 - Doremy's Drying Plan (Easy Version)

因为k=2,所以思考选哪两个区间

1.这两个区间相交

2.这两个区间不相交

因为只能去掉两个区间,所以如果有些点被大于两个区间得点覆盖直接去掉就行了,

对于第二个条件两个区间不相交,说明如果去掉某个区间,那么这个点只能被一个区间覆盖

所以我们预处理

s1:只被一个区间覆盖的点的前缀和

s2:只被两个区间覆盖的点的前缀和

然后第二个条件直接枚举每个区间的贡献的最大值和次大值相加即可

然后可能有人问万一最大值和次大值区间相交呢,这说明这个相交的点要被覆盖两次,

我们求这个用的是s1数组,所以不会重复计算贡献

即任意取两个区间

如果相交的部分至少被覆盖两次他们不会在s1的数组

不相交的部分相加即为第二个条件的答案

对于第一个条件

我们直接暴力枚举每个点,以当前端点为相交的部分即可

然后用个堆枚举即可

贡献就是 两个区间相交部分的s2区间和maxr到minl的s1部分

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10,mod=1000003;
#define int long long
typedef long long LL;
typedef pair<int, int> PII;
const long long inf=1e17;
int n,m,k;
vector<int> g[N];
int a[N];
void solve()
{
    cin>>n>>m>>k;
    vector<int> s1(n+10),s2(n+10),d(n+10);
    vector<array<int,2>> a;
    for(int i=1;i<=m;i++){
        int x,y;
        cin>>x>>y;
        a.push_back({x,y});
        d[x]++,d[y+1]--;
    }
        int res=0;
    for(int i=1;i<=n;i++){
        d[i]+=d[i-1];
        if(d[i]==0) res++;
        if(d[i]==1) s1[i]++;
        if(d[i]==2) s2[i]++;
        s1[i]+=s1[i-1];s2[i]+=s2[i-1];
    }
    int cnt1=0,cnt2=0;

    for(int i=0;i<m;i++)
    {
        int x=a[i][0],y=a[i][1];
        int cnt=s1[y]-s1[x-1];
        if(cnt>cnt1){
            cnt2=cnt1,cnt1=cnt;
        }
        else if(cnt>cnt2) cnt2=cnt;
    }
    int mx=cnt1+cnt2;
    
    priority_queue<PII> q;
    int idx=0;
    sort(a.begin(),a.end());
    for(int i=1;i<=n;i++)
    {
        while(idx<m&&a[idx][0]<=i){
            q.emplace(a[idx][1],a[idx][0]);
            idx++;
        }
        while(q.size()&&q.top().first<i) q.pop();
        if(q.empty()) continue;
        auto t=q.top();q.pop();
        while(q.size()&&q.top().first<i) q.pop();
        q.push(t);
        if(q.size()>=2)
        {
            auto t1=q.top();q.pop();
            auto t2=q.top();
            vector<int> c={t1.first,t1.second,t2.first,t2.second};
            sort(c.begin(),c.end());
            int cnt=s1[c[3]]-s1[c[0]-1]+(s2[c[2]]-s2[c[1]-1]);
            mx=max(mx,cnt);
            q.push(t1);
        }
    }
    cout<<res+mx<<"\n";
}

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

E2 - Doremy's Drying Plan (Hard Version)

考虑dp

状态:第i个点没被区间覆盖,且已经使用了j次机会的最大值

!!!!重点使得当前i点没被区间覆盖

举例说明

当前点5,使用了5次机会可以由

第4个点使用了5次机会获得(为啥机会没-1呢

因为f[4]代表着没被区间覆盖,说明f[4]已经把前面能覆盖到4的点的区间已经删除了)

第3个点使用4次机会获得

这里要把4到5的区间删去

以此类推

所以我们要找这个区间的最大值了

因为可能我后面再加个6的点,但我不增加区间,他可以由f[4][5]和f[5][5]最大值获得

所以涉及区间查询最大值,但是k很小,直接暴力每个k开个线段树即可

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10,mod=1000003;
#define int long long
typedef long long LL;
typedef pair<int, int> PII;
const long long inf=1e17;
int n,m,k;
vector<int> g[N];
int a[N];
struct node{
    int l,r,mx;
}tr[11][N*4];
void pushup(int p,int u){
    tr[p][u].mx=max(tr[p][u<<1].mx,tr[p][u<<1|1].mx);
}
void build(int p,int u,int l,int r)
{
    tr[p][u]={l,r,0};
    if(l==r) return ;
    int mid=l+r>>1;
    build(p,u<<1,l,mid);build(p,u<<1|1,mid+1,r);
}

void modify(int p,int u,int x,int v){
    if(tr[p][u].l==tr[p][u].r&&tr[p][u].l==x){
        tr[p][u].mx=max(tr[p][u].mx,v);
        return ;
    }
    else{
        int mid = tr[p][u].l + tr[p][u].r >> 1;
        if(x <= mid) modify(p, u << 1, x,v);
        else modify(p, u << 1 | 1, x,v);
        pushup(p, u);
    }
}
int query(int p, int u, int l, int r) {
    if(!l && !r) return 0;
    if(l <= tr[p][u].l && r >= tr[p][u].r) return tr[p][u].mx;
    int mid = tr[p][u].l + tr[p][u].r >> 1;
    int res = 0;
    if(l <= mid) res = max(res, query(p, u << 1, l ,r));
    if(r > mid) res = max(res, query(p, u << 1 | 1, l, r));
    return res;
}

void solve()
{
    cin>>n>>m>>k;
    vector<array<int,2>> seg;
    for(int i=0;i<=k;i++) build(i,1,1,n);
    vector<vector<int>> f(n+10,vector<int>(k+10));
    for(int i=0;i<m;i++){
        int x,y;cin>>x>>y;
        seg.push_back({x,y});
    }
    sort(seg.begin(),seg.end());
    multiset<PII> st;
    int res=0;
    for(int i=1,idx=0;i<=n;i++){
        while(idx<m&&seg[idx][0]<=i){
            st.insert({seg[idx][1],seg[idx][0]});
            idx++;
        }
        if(st.size()<=k){
            vector<int> S{0};
            S.push_back(i);
            for(auto [r, l] : st) S.push_back(l);
            sort(S.begin(), S.end());
            for(int j = st.size(); j <= k; j ++ ) {
                for(int z = S.size() - 2, w = 0; w <= j && z >= 0; w ++, z -- ) {
                    int l = S[z], r = S[z + 1] - 1;
                    if(l > r) continue;
                    f[i][j] = max(f[i][j], query(j - w, 1, l ,r) + 1);
                    modify(j, 1, i, f[i][j]);
                }
            }
            res = max(res, f[i][k]);
        }
        PII tmp;
        while(st.size() && (tmp = *(st.begin())).first == i)
        st.extract(tmp);
    }
    cout<<res<<"\n";
    
}

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

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

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

相关文章

idea类和方法模版

类模版 修改目标位置 class #if (${PACKAGE_NAME} && ${PACKAGE_NAME} ! "")package ${PACKAGE_NAME};#end #parse("File Header.java")/*** ${Description}* author whc ${YEAR}/${MONTH}/${DAY}* version v1.0 */public class ${NAME} { }inte…

#HarmonyOS:软件安装

软件地址 https://developer.harmonyos.com/cn/develop/deveco-studio#download 安装的建议 这个界面这样选&#xff0c;其他界面全部按照默认路径往下走&#xff01;&#xff01;&#xff01; 等待安装… 安装环境错误处理 一般就是本地node配置一场导致&#xff0c;建议…

在Pycharm中创建项目新环境,安装Pytorch

在python项目中&#xff0c;很多项目使用的各类包的版本是不一致的。所以我们可以对每个项目有专属于它的环境。所以这个文章就是教你如何创建新环境。 一、创建新环境 首先我们需要去官网下载conda。然后在Pycharm下面添加conda的可执行文件。 用conda创建新环境。 二、…

Netfilter中的NAT

目录 前瞻 SNAT和DNAT SNAT DNAT 实验 前瞻 NAT: &#xff08;network address translation&#xff09;&#xff0c;支持PREROUTING&#xff0c;INPUT&#xff0c;OUTPUT&#xff0c;POSTROUTING四个链 NAT分为SNAT和DNAT SNAT&#xff1a;支持POSTROUTING, INPUT&…

Java封装讯飞星火大模型历险记

问题描述与分析 现状描述与目标 在使用讯飞星火大模型API的过程中&#xff0c;API的返回结果在可以在其他线程中进行分次打印&#xff0c;但是在main方法中直接打印返回结果&#xff0c;显示为空。这种情况下不利于二次封装&#xff0c;希望在main方法中获取完整的API返回结果…

POE浪涌保护器+POE防雷器综合解决方案

POE&#xff08;Power over Ethernet&#xff0c;以太网供电&#xff09;是一种利用双绞线以太网布线同时传输电力和数据的技术&#xff0c;目前常用于智能安防摄像系统、无线局域网、物联网等领域。POE技术可以简化网络设备的布线和安装&#xff0c;降低成本和维护难度&#x…

文献速递:机器学习在超声波非破坏性评估中的合成和增强训练数据综述(第一部分)— (机器学习方法在超声波检测中的概述)

文献速递&#xff1a;机器学习在超声波非破坏性评估中的合成和增强训练数据综述&#xff08;第一部分&#xff09;— &#xff08;机器学习方法在超声波检测中的概述&#xff09; Title 题目 A review of synthetic and augmented training data for machine learning in ul…

python用YOLOv8对图片进行分类

用yolov8的模型进行分类 先上效果图 图片资源 模型下载地址 https://github.com/ultralytics/ultralytics 代码 import matplotlib.pyplot as plt from ultralytics import YOLO from PIL import Image import cv2model YOLO(../ultralytics/yolov8n.pt)# print(model…

代码随想录算法训练营第四十八天【动态规划part09】 | 198.打家劫舍、213.打家劫舍II、337.打家劫舍III

198.打家劫舍 题目链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 求解思路&#xff1a; 当前房屋偷与不偷取决于前一个房屋是否被偷了 动规五部曲 确定dp数组及其下标含义&#xff1a;考虑下标i&#xff08;包括i&#xff09…

Nginx(无法解析PHP网页如何解决?FPM解决你的烦恼!)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️不能因为人生的道路坎坷,就使自己的身躯变得弯曲;不能因为生活的历程漫长,就使求索的 脚步迟缓。 ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xff1a;云计算技…

新建的springboot项目中application.xml没有绿色小叶子(不可用)

经常有朋友会遇到新建了一个springboot项目&#xff0c;发现为啥我创建的application.xml配置文件不是绿色的&#xff1f;&#xff1f;&#xff1f; 下面教大家如何解决&#xff0c;这也是博主在做测试的时候遇到的&#xff1a; 将当前位置application.xml删掉&#xff0c;重新…

RF实现数据驱动DDT

场景 在自动化测试框架中&#xff0c;数据驱动的意思指定的是测试用例或者说测试套件是由外部数据集合来驱动的框架。这里说的数据集可以是任何类型的数据文件比如xls&#xff0c;xlsx&#xff0c;csv等等。它的核心的思想就是数据和测试代码分离&#xff0c;及时当测试数据发…

【同济大学主办】第七届先进算法与控制工程国际学术会议(ICAACE 2024)

第七届先进算法与控制工程国际学术会议&#xff08;ICAACE 2024&#xff09; 2024 7th International Conference on Advanced Algorithms and Control Engineering 第七届先进算法与控制工程国际学术会议&#xff08;ICAACE 2024&#xff09;定于2024年1月26-28日在中国上…

虽然在不同设备上会出现同样的原神错误代码9907,但解决办法因设备而异

你是不是很享受在原神(Genshin Impact)中的神奇旅程,但错误代码9907出现了?与PS4控制台中全面讨论PS4的错误CE-34878-0不同,本文关注的是原神错误本身。本文不仅讨论了这个错误背后的原因,还讨论了每种类型设备的具体解决方案。 在Microsoft Windows/PC上修复错误代码99…

深入学习redis-基于Jedis通过客户端操作Redis

目录 redis客户端&#xff08;JAVA&#xff09; 配置 引入依赖 建立连接 常用命令实现 get/set exists/del keys expire和ttl type 字符串&#xff08;String&#xff09; mget和mset getrange和setrange append incr和decr 列表&#xff08;list&#xff09; …

自动化测试 —— 如何优雅实现方法的依赖!

在 seldom 3.4.0 版本实现了该功能。 在复杂的测试场景中&#xff0c;常常会存在用例依赖&#xff0c;以一个接口自动化平台为例&#xff0c;依赖关系&#xff1a; 创建用例 --> 创建模块 --> 创建项目 --> 登录。 用例依赖的问题 •用例的依赖对于的执行顺序有严格…

好用的chatgpt工具用过这个比较快

chatgpthttps://www.askchat.ai?r237422 chatGPT能做什么 1. 对话和聊天&#xff1a;我可以与您进行对话和聊天&#xff0c;回答您的问题、提供信息和建议。 2. 问题回答&#xff1a;无论是关于事实、历史、科学、文化、地理还是其他领域的问题&#xff0c;我都可以尽力回答…

医疗机构临床数据合规共享解决方案斩获“金智奖”年度优秀方案奖

11月24日&#xff0c;以“并肩聚力&#xff0c;协同创新&#xff0c;共谋网络安全产业新发展”为主题的2022—2023年度中国网络安全与信息产业“金智奖”&#xff08;以下简称&#xff1a;“金智奖”&#xff09;颁奖盛典隆重举行。美创科技—医疗机构临床数据合规共享解决方案…

基于javaweb的宠物服务商城系统设计与开发

摘 要 最近几年以来&#xff0c;宠物在人们的日常生活中所占的地位越来越重要了&#xff0c;它们不仅仅是我们的朋友&#xff0c;也成为了我们家庭中的一份子。21世纪&#xff0c;信息技术飞速发展&#xff0c;计算机行业日新月异&#xff0c;极大地带动了信息的流动&#xff…

跨境电商成拼多多高质量增长奇兵

不曾想到&#xff0c;拼多多增长仍如此迅猛。 11月28日&#xff0c;拼多多发布第三季度财报&#xff0c;数据显示&#xff0c;营收688.404亿元&#xff0c;同比增长94%&#xff0c;超过市场预估的548.7亿元&#xff1b;实现美国通用会计准则口径净利润155.37亿元&#xff0c;同…