首页 > 其他分享 >从CF1660F2看同余分组

从CF1660F2看同余分组

时间:2024-05-28 20:44:51浏览次数:13  
标签:pre std CF1660F2 看同 int 分组 余数 逆序

https://codeforces.com/contest/1660/problem/F2

同余分组,树状数组维护逆序对

先承继F1的做法,维护一个前缀和数组,让 s[i] == '+' 为 \(1\),s[i] == '-' 为 \(-1\)。

那么要满足两个条件:

  • \(pre_r - pre_l \leq 0\)
    • 要么加减号相同,要么减号更多(只有减号能减少)
  • \(pre_r - pre_l \equiv 0 \pmod{3}\)
    • 两个减号变成一个加号,相差为三的倍数。

其中第二个条件可以同余转化为

\[pre_r\equiv pre_l\pmod 3 \]

而第一个条件显然 \(l < r\)​,那么第一个条件等效于求逆序对。

而要求的逆序对还要满足 \(pre_r\equiv pre_l\pmod 3\),可以发现三的余数极少,所以对于三的每个余数分别开树状数组来维护逆序对就能满足两个条件。

void solve()
{
    int n;
    std::cin >> n;
    std::string s;
    std::cin >> s;
    std::vector<int> pre(n + 1);
    for (int i = 0; i < n; i++) {pre[i + 1] = pre[i] + (s[i] == '+' ? 1 : -1);}
    //对%3的余数分组开Fenwick
    //0, 1, 2

    std::vector fenwicks(3, Fenwick<int>(n * 2 + 1));
    auto get = [&](int x) {return (x % 3 + 3) % 3;};
    i64 ans = 0;
    for (int i = n; i >= 0; i--) {
        ans += fenwicks[get(pre[i])].sum(pre[i] + n + 1);//用pre[i] % 3 的余数来分组,在组内求逆序对。
        fenwicks[get(pre[i])].add(pre[i] + n, 1);
    }
    std::cout << ans << '\n';
}

标签:pre,std,CF1660F2,看同,int,分组,余数,逆序
From: https://www.cnblogs.com/kdlyh/p/18218804

相关文章

  • java list分组并对bigdecimal属性求和
    JavaList分组并对BigDecimal属性求和在Java中,我们经常需要对一个List进行分组,并对其中的BigDecimal属性进行求和操作。这种需求在实际项目中非常常见,比如在处理财务数据、统计数据等场景中。本文将介绍如何使用Java来实现这一功能,同时会提供代码示例来帮助读者更好地理解。1.使......
  • CSP历年复赛题-P1094 [NOIP2007 普及组] 纪念品分组
    原题链接:https://www.luogu.com.cn/problem/P1094题意解读:贪心选择解题思路:贪心策略:将纪念品按价格由小到大排序,优先一大、一小,如果价格之和不超限,则分为一组,如果超限,则大的单独分为一组,重复以上过程,直到所有数据都遍历到,采用一头一尾双指针即可。证明:如果最大价格不是和最......
  • 【JAVA系列】JAVA与C#中List分组、排序方法
    C#中List分组、排序、动态分组定义实体类publicclassStudent{publicstringName{get;set;}publicintAge{get;set;}publicstringGrade{get;set;}}按单个属性分组classProgram{staticvoidMain(){List<Stu......
  • springboot集成kafka解决集群模式下分组ID不同问题
    背景:在集群模式下,每个实例需要分组ID不同,共同消费某个topic,集群下的实例是动态扩展的,无法确认实例的个数,每次项目启动的时候,需要动态的给定kakfa的分组ID,但是分组ID整体是一样的,不能改变。方式1:CURRENT_INSTANCE_GROUP_ID=KafkaConstant.SSE_GROUP.concat(String.valueOf(Sys......
  • 前端流下载写入文件夹分组
    用到createWriteStream和zip插件:写入文件夹就是拼接好路径就行:文件夹字符串,比如‘第一文件夹/子文件夹/孙文件夹’,成功后可写入本机 consthandleBatchDownload=async(cosFileNameUrls,downName)=>{proxy.$modal.closeLoading();//创建一个文件项目......
  • mysql 分组加行号
    mysql示例SELECTcasewhen@currentid<>t.idthen@rownum:=1else@rownum:=@rownum+1endASrow_num,casewhen@currentid<>t.idthen@currentid:=t.idelse@currentidendASrow_num,ID,......
  • Python Pandas 数据分组
    在数据处理中,分箱、分组是一种常见的技术,用于将连续数据的间隔分组到“箱”或“桶”中。我们将讨论以下两种方法:使用Pandas的between和loc方法:between方法返回一个布尔向量,指示Series元素是否位于给定的边界值之间。loc方法用于根据条件选择数据。示例:将学......
  • MySQL数据高阶处理技巧:掌握先排序后分组的智慧
    在MySQL数据库的数据探索旅程中,排序和分组是不可或缺的工具。然而,当你面对大量数据、重复值等情况时,常规的处理方法可能显得不够灵活。本文将为你揭示一个精妙的技巧:如何在MySQL中先排序,后分组,从而获取每个类型的最新数据,助你轻松驾驭复杂的数据处理任务。 问题背景:先排序,后分......
  • 分组查询
    语法select分组函数,列(要求出现在groupby的后面)from表【where筛选条件】groupby分组的列表【orderby子句】注意:查询列表必须特殊,要求是分组函数和groupby后出现的字段特点:......
  • pivot 分组案例测试
    droptableStudentScores;CREATETABLEStudentScores(schoolvarchar(20),UserNameVARCHAR(20),--学生姓名SubjectVARCHAR(30),--科目ScoreFLOAT--成绩);INSERTINTOStudentScoresSELECT'人民大学......