当前位置: 首页 > news >正文

Educational Codeforces Round 172 (Rated for Div. 2)

AB略

C

答案没有单调性,无法用二分答案写。b比a多的得分=s1*0+s2*1+.......+sn*(n-1),s代表这一段中b比a多的数量。这里s的处理可以想到用前缀和来,于是得到(s1-0)*0+(s2-s1)*1+(s3-s2)*2......+(sn-sn-1)*(n-1)=-s1-s2-s3.....+sn*(n-1),这里还是没办法确定n的值,毕竟sn*(n-1)很难确定。于是可以想到后缀和。(s1-s2)*0+(s2-s3)*1+(s3-s4)*2.....sn*(n-1)=s2+s3+....+sn。预处理出所有位置的后缀和降序排序,大于k停止即可。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
int T,n,k,s[N],sum;
char c[N];
void init()
{
    sum=0;
}
void solve()
{
    cin>>n>>k;
    init();
    for(int i=1;i<=n;i++)
    cin>>c[i];
    s[n+1]=0;
    for(int i=n;i>=1;i--)
    {
        if(c[i]=='1') s[i]=s[i+1]+1;
        else s[i]=s[i+1]-1;
    }
    sort(s+2,s+n+1);
    for(int i=n;i>=2;i--)
    {
        sum+=s[i];
        if(sum>=k) {cout<<n-i+2<<endl; return ;}
    }
    cout<<-1<<endl;
}
signed main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>T;
    while(T--) solve();
}

D

对于每一段来说,找到所有完全包含这一段的段的交集再减去这一段剩下的整数数量。先将左端点升序相等时再右端点降序排序,这样按顺序处理每个段时,可以保证它的所有预言段都处理完了,利用set可知道它的所有预言段右端点的最小值,减去这个段的右端点。在按照这个逻辑处理左端点,左右相加就是答案。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
int T,n,ll[N],rr[N],bj[N];
struct node{
    int l,r,id;
}a[N],b[N];
bool cmp(node x,node y)
{
    if(x.l==y.l) return x.r>y.r;
    return x.l<y.l;
}
bool cmp1(node x,node y)
{
    if(x.r==y.r) return x.l<y.l;
    return x.r>y.r;
}
void init()
{
    for(int i=1;i<=n;i++)
    ll[i]=rr[i]=bj[i]=0;
}
void solve()
{
    cin>>n;
    init();
    multiset<int> s;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i].l>>a[i].r;
        a[i].id=i;
        b[i].l=a[i].l;
        b[i].r=a[i].r;
        b[i].id=i;
    }
    if(n==1) {cout<<0<<endl; return ;}
    sort(a+1,a+n+1,cmp);
    for(int i=2;i<=n;i++)
    if(a[i].l==a[i-1].l&&a[i].r==a[i-1].r) bj[a[i].id]=bj[a[i-1].id]=1;
    s.insert(a[1].r);
    for(int i=2;i<=n;i++)
    {
        multiset<int>::iterator it;
        it=s.lower_bound(a[i].r);
        if(it!=s.end()) rr[a[i].id]=*it-a[i].r;
        s.insert(a[i].r);
    }
    sort(b+1,b+n+1,cmp1);
    s.clear();
    s.insert(-b[1].l);
    for(int i=2;i<=n;i++)
    {
        multiset<int>::iterator it;
        it=s.lower_bound(-b[i].l);
        if(it!=s.end()) ll[b[i].id]=*it+b[i].l;
        s.insert(-b[i].l);
    }
    for(int i=1;i<=n;i++)
    if(bj[i]) cout<<0<<endl;
    else cout<<ll[i]+rr[i]<<endl;
}
signed main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>T;
    while(T--) solve();
}

相关文章:

  • ros2--gazebo--launch
  • Ubuntu离线安装mysql
  • 处理JWT Token失效需求
  • Debezium日常分享系列之:Debezium3.1版本之增量快照
  • 通过 Markdown 改进 RAG 文档处理
  • 1ms软延时,不用定时器,stm32
  • 智谱AutoGLM:从对话到自主操作的AI智能体革新
  • 第八章 图论
  • 06-03-自考数据结构(20331)- 查找技术-哈希表知识点
  • 【GPIO8个函数解释】
  • 1759. 统计同质子字符串的数目
  • 【深度学习】tf.math.multiply与tf.multiply有啥区别?
  • 在 .NET 8 中使用自定义令牌身份验证掌握 SignalR Hub 安全性
  • 【设计模式】设计模式六大原则
  • 《Golang高性能网络编程:构建低延迟服务器应用》
  • docker导出image再导入到其它docker中
  • openfga-spring-boot3-starter自己封装
  • SAP CEO引领云端与AI转型
  • rk3588配置静态IP和DNS
  • 运筹帷幄:制胜软件开发