[Codeforces348C]Subset Sums(乱搞)

为什么你的Mac蓝牙总断连?深入解析硬件干扰与系统设置避坑 本文深入解析Mac蓝牙频繁断连的原因,包括硬件干扰(如WiFi同频干扰、USB设备电磁干扰)和系统设置问题,并提供详细的优化方案和诊断工具(如blueutil)使用指南,帮助用户有效解决蓝牙稳定性问题。 阅读详情

=== ===

这里放传送门

=== ===

题解

这玩意儿算啥算法啊。。说它是乱搞吧,它其实也挺机智的;但是好像ATP知道的任何一种除了乱搞以外的算法都不能描述它。。。

这道题的意思是给定一个数列和 m 个集合,集合总大小也不超过m。每个集合里都指定了数列里的一些位置。要求支持两种操作,一个是把某个集合中的所有位置的数字都加上某一个值,一个是查询某个集合里的位置上的数字之和。
这题的难点就在于对一个集合的修改可能会影响到好多别的集合的数字和,关键就是怎么解决这个问题。然而我们可以发现因为题目中告诉我们集合总大小不超过 m ,那么大小超过m−−√的集合最多只有 m−−√ 个。而对于那些大小小于 m−−√ 的集合我们可以直接枚举里面的元素暴力修改暴力查询,复杂度不会超过 O(m−−√) 。
然后考虑如果只有大小大于 m−−√ 的集合的话我们该怎么做,设这一类集合的个数为 S ,可以维护一个O(S×S)的数组来记录每个集合和别的集合有多少个元素是重合的,然后再维护一个 O(S) 的数组来记录每个集合的增量。这样的话修改首先是 O(1) 的,然后对于查询的话我们可以枚举别的集合来计算那个集合对于当前查询的集合的影响,也就是如果当前集合是 A ,我们枚举所有除了A以外的集合 B ,那么A的元素和就要累加 deltaB×|A⋂B| 。

那把这两种情况结合一下就有一种科学的做法了。设大小小于 m−−√ 的集合为S类集合,个数为 |S| ;大于 m−−√ 的集合为B类集合,个数为 |B| 。
修改S类集合的时候首先暴力修改原序列以方便S类集合的求和操作,然后要考虑对B类集合造成的影响。这个时候我们预处理一个大小为 (|S|+|B|)×|B| 的数组来记录每个B类集合和其它所有集合有多少交集,然后对于每个B类集合维护一个数组记录它的元素和,修改的时候根据那个记录的数组来更新元素和就可以。修改B类集合的时候直接维护它的增量就可以了。
对于S类集合的求和操作,先枚举原序列中的元素,这样可以统计S类集合的修改对它造成的影响;因为B类集合的增量没有累加到原序列里,所以枚举所有B类集合,把增量*交集大小累加到答案里。对于B类集合的求和操作,因为S类集合的增量已经累加过来了,所以直接枚举其它的B类集合累加增量就可以了。

可以发现对于S类集合的操作是和它的集合大小成正比的,对于B类集合的操作是和它的集合个数成正比的。总复杂度是 O(mm−−√) 。

代码

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,q,tot,rec[100010],cnt[100010][360],num[360],Limit,W,tmp[100010];
long long delta[360],sum[360],a[100010];
struct Set{
    int k,l,r;
}s[100010];
long long AskBig(int now){
    int pos=tmp[now];
    long long ans=sum[pos];
    for (int i=1;i<=W;i++)
      ans+=(long long)cnt[now][i]*delta[i];
    return ans;
}
long long AskSmall(int now){
    long long ans=0;
    for (int i=s[now].l;i<=s[now].r;i++)
      ans+=a[rec[i]];
    for (int i=1;i<=W;i++)
      ans+=(long long)cnt[now][i]*delta[i];
    return ans;
}
void ChangeSmall(int now,int v){
    for (int i=s[now].l;i<=s[now].r;i++)
      a[rec[i]]+=v;
    for (int i=1;i<=W;i++)
      sum[i]+=(long long)cnt[now][i]*v;
}
int main()
{
    scanf("%d%d%d",&n,&m,&q);
    Limit=ceil(sqrt(n));
    for (int i=1;i<=n;i++) scanf("%I64d",&a[i]);
    for (int i=1;i<=m;i++){
        int k;scanf("%d",&k);
        s[i].k=k;s[i].l=tot+1;
        for (int j=1;j<=k;j++){
            int x;scanf("%d",&x);
            rec[++tot]=x;
        }s[i].r=tot;
        if (k>Limit) num[++W]=i;
    }
    for (int i=1;i<=W;i++){
        int u=num[i];
        for (int j=s[u].l;j<=s[u].r;j++){
            ++tmp[rec[j]];
            sum[i]+=a[rec[j]];
        }
        for (int j=1;j<=m;j++)
          for (int k=s[j].l;k<=s[j].r;k++)
            cnt[j][i]+=tmp[rec[k]];
        for (int j=s[u].l;j<=s[u].r;j++) --tmp[rec[j]];
      }
    for (int i=1;i<=W;i++) tmp[num[i]]=i;
    for (int i=1;i<=q;i++){
        char c=getchar();
        int x,v;
        while (c!='?'&&c!='+') c=getchar();
        if (c=='?'){
            scanf("%d",&x);
            if (s[x].k>Limit)
              printf("%I64d\n",AskBig(x));
            else printf("%I64d\n",AskSmall(x));
        }else{
            scanf("%d%d",&x,&v);
            if (s[x].k>Limit) delta[tmp[x]]+=v;
            else ChangeSmall(x,v);
        }
    }
    return 0;
}

偏偏在最后出现的补充说明

这种按照大数据和小数据分类讨论的思路有时候可以解决一些用普通方法很难解决的问题。考虑的时候要注意对于两种类型的元素的特点设计复杂度合适的算法,每一种类型的元素进行操作的时候都要考虑另外一种元素的影响。

UG NX二次开发(C++)-NX2406系列二次开发编程模板配置 前面已经写了有关UG NX二次开发编程模板配置的文章,但是由于NX2406/2412系列的版本中,在UGOpen文件夹中没有了vs_files文件夹了,而是采用了VSIX Project的方式配置(其适用于VS2019),在VS2022中不能正确的配置。我结合以前配置模板的经验和现在的配置方式讲一下NX2406系列二次开发编程模板的配置。我把相应的编程模板放在资源文件UG NX二次开发编程模板(基于NX2406版本制作)中,方便大家下载使用。 阅读详情

相关推荐

V-rep机器人仿真(Win10):UR5+RG2+Kinect+YOLOV3+DDPG+Pytorch(第四部分:YOLOV3图像识别)

这是一个V-rep机器人仿真实验,较为简单,适合初学者在入门图像识别、机器学习、机器人学的内容时进行学习与训练。 实验涉及的内容有:V-rep机器人仿真,YOLOV3图像识别,强化学习DDPG,UR5机械臂及RG2机械手,Kinect摄像头。 使用环境:Win10,Pytorch0.4,V-rep 整个实验一共由多篇文章组成,本文是第四部分。 第四部分:YOLOV3图像识别 文章目录第四部分:YO...

weixin_42158966的博客 5838

CF348C Subset Sums(分块)

给定一个n个数的序列a,m个下标集合,记Sk={Sk,i}S_k=\{S_{k,i}\}。两种操作: 1. ? k 求集合k的和,即∑i=1|Sk|aSk,i\sum\limits_{i=1}^{|S_k|}a_{S_{k,i}} 2. + k w 给集合k的所有下标代表的数加w。 3. 记n=∑i=1m|Si|n=\sum\limits_{i=1}^{m}|S_i| 我们把集合大小大于n√

Icefox的博客 485

七、从0开始卷出一个新项目之瑞萨RZN2L 2.2.2 启动模式和flash

七、从0开始卷出一个新项目之瑞萨RZN2L 2.2.2 启动模式和flash。

cl234583745的博客 1466

Codeforces 348C Subset Sums 分块思想

Subset Sums 把所有集合分成大于sqrt(n)和小于sqrt(n)的集合, 处理出每两个集合有交集是多大之后就可以在sqrt(n)的复杂内完成一次操作。 #include<bits/stdc++.h> #define LL long long #define LD long double #define ull unsigned long long ...

195

基于yolov5的鸟类图像准确识别

本项目主要基于yolov5进行鸟类准确识别,主要识别白鹭家族,红脚鹬,反嘴鹬,环颈珩,小白鹭以及夜鹭六类鸟

weixin_46064184的博客 3823

Altium Concord Pro 的应用范围,安装,和使用范围

Altium Concord Pro 的应用范围,安装,和使用范围。保证满足两者软件的最低安装要求。 Altium Concord Pro 是配合Digapcb,和MCAD,Altium 和相应机械设计软件的基础和交换桥梁

hanzhaos的博客 1121

Codeforces348C - Subset Sums

Portal Description 给出长度为\(n(n\leq10^5)\)的序列\(\{a_n\}\)以及\(m(m\leq10^5)\)个下标集合\(\{S_m\}(\sum|S_i|\leq10^5)\),进行\(q(q\leq10^5)\)次操作: 询问下标属于集合\(S_k\)的所有数之和。 将下标属于集合\(S_k\)的所有数加\(x\)。 Solution 记\(N...

ayw1069的博客 215

SiamFC++笔记

SiamFC++: Towards Robust and Accurate Visual Tracking with Target Estimation Guidelines 文章根据这些思路:引入分类和目标状态估计分支(G1),无歧义的分类得分(G2),无先验知识的跟踪(G3)和评估质量得分(G4)来设计SiamFC ++。 SiamRPN ++和SiamFC ++的比较(红色部分代表得分高的区域): guide: G1 : 分类和状态估计任务的分离:分类任务将目标从干扰物和背景中分类出来,目标状态

木木JL的博客 9435

codeforces 348 C. Subset Sums (暴力+技巧)

C. Subset Sums time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standard output You are given an array a1, a2, ..., an and m

clover_hxy的博客 696

STM32解码EM4100的曼彻斯特编码(库函数版本)

前言: 前些日子老师布置一个任务叫我们焊接一个RFID读卡器,其中刚好我们手上也有一个STM32F103RBT6开发板,老师于是布置任务叫我们用STM32完成对EM4100进行读卡操作 EM4100简介: 中 文 名:EM4100卡 存储容量:64bit 工作频率:125KHZ 读写距离:2-15cm 产品名称:EM4100/EM4102卡 芯片类型:μEM瑞士微电 EM4100/EM4102 擦写寿命:读不限,只读 外形尺寸:ISO标准卡/厚卡 封装材料:PVC、ABS 典型应用:身份识别、考勤系统、门禁

Gancenty 8602

FPGA/IC 秋招笔试/面试题总结(目录)

FPGA/IC 秋招笔试/面试题总结-目录介绍 文章目录FPGA/IC 秋招笔试/面试题总结-目录介绍一、FPGA内部资源1. 什么是FPGA2.FPGA内部资源二、同步时钟、同步/异步电路1.同步时钟2.同步/异步电路三、同步复位/异步复位1.同步复位2. 异步复位3. 异步复位同步释放四、同步FIFO/异步FIFO1.同步FIFO2.异步FIFO五、FIFO最小深度计算1.FIFO最小深度2.示例分析六、逻辑电平1.TTL电平标准2.LVTTL电平标准3.CMOS电平标准4.LVCOMS电平标准5.RS

Crazzy_M的博客 2万+

CodeForces 348 C.Subset Sums(分块)

Description 一个长度为n的序列a[i]和m个集合Si,每个集合都用一些编号表示,这些编号对应的是序列中的元素,有两种操作: 1.查询第k个集合中元素之和 2.把第k个集合中对应a序列中的元素全部加上x Input 第一行三个整数n,m,q分别表示序列长度,集合数和操作数,之后n个整数a[i]表示该序列,之后m行第i行首先输入一个整数num表示第i个集合的元素个数,然后输入num

ZSQ 740

【Halcon-2D测量】add_metrology_object_rectangle2_measure 函数功能(用于向2D计量模型中添加旋转矩形(rectangle2类型)计量对象)

HALCON算子add_metrology_object_rectangle2_measure解析摘要 该算子是HALCON 2D计量模块的核心算子,用于添加旋转矩形计量对象并配置测量参数。主要功能包括:定义旋转矩形几何轮廓(中心坐标、主轴角度、长短半长);生成垂直于矩形边界的测量区域;设置边缘提取预处理参数(高斯平滑、振幅阈值)。关键注意事项:MeasureLength1必须小于矩形长短半长;角度参数Phi需使用弧度单位;多线程需同步模型句柄。该算子适用于方形螺母、PCB板边框等矩形零件的精密测量,需与a

weixin_45590420的博客 1225

乱搞 [CodeForces 348C] Subset Sums nsqrtn

题面去内网找 这道题的思路很神奇,把集合分成了重集合和轻集合。我们把元素个数大于sqrt(n)的集合称为重集合。显然这样的集合超不过sqrt(n)个。 那么就可以分别处理集合了 首先统计出每个集合与每一个重集合交集有多大。维护重集合的sum(总和)和add(这个集合累计加了多少)值。 对于重集合 1.修改:只改一下add就好 2.查询:sum[x]+add所...

aojueyi5506的博客 151

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

CodeForces 348C Subset Sums nsqrtn的姿势。。

题意: 给n个数和m个集合, 一个集合就是n个数的下标。 有q个操作, 每个操作就是给一个集合里面代表的数加上v, 或者询问一个集合里面的数的和。 解法: ORZ题解。。。 设B = sqrtn 先给集合分成两种, 一种是大小大于B的, 称为重集合, 小于的称为轻集合。 显然重集合的个数不会超过B个。 对每个集合, 求出它和每个重集合交集的大小, 即cnt[i][j]表示第

yamiedie_ 1278

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Codeforces Round #348 (div 2) D - Little Artem and Dance

题意:n个人围一圈,第一种操作所有人移动,第二种相邻位置交换(比如原标号为1的地方和原标号为2的人交换),输出交换后的情况思路:暴力处理1和2的移动情况,就能知道奇偶的变化值错误及反思:代码:#include<bits/stdc++.h> using namespace std; int n,q; int ans[1000100]; int main() { long long mo1=1;

Roll_Keyboard的博客 378

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

codeforces#348-C. Little Artem and Matrix-模拟

http://codeforces.com/contest/669/problem/C 给你q个操作,每次移动矩阵一列或一行 一个位置, 告诉你r行c列的数为多少, 让你还原出这个 n*m的矩阵 直接模拟,从最后一部开始模拟即可 #include #include #include #include #include #include #include

缺氧 607

codeforces 348C Subset Sums

http://www.elijahqi.win/2018/03/02/codeforces-348c-subset-sums/ You are given an array a1, a2, …, an and m sets S1, S2, …, Sm of indices of elements of this array. Let’s denote Sk = {Sk, i} (1 ≤ i ≤...

Elijahqi 337

CF348C Subset Sums

sqrt(n)思想

AaronPolaris 3755

Codeforces.348D.Turtles(容斥 LGV定理 DP)

题目链接 \(Description\) 给定\(n*m\)的网格,有些格子不能走。求有多少种从\((1,1)\)走到\((n,m)\)的两条不相交路径。 \(n,m\leq 3000\)。 \(Solution\) 容斥,用总方案数减去路径一定相交的方案数。 怎么算呢?注意到两条相交的路径(一定)可以看做从\((1,2)\)到\((n,m-1)\)和从\((2,1)\)到\((n-1...

weixin_30627341的博客 191

Codeforces-348A

题意:满足n个人,每个人想玩的游戏次数。输出最小(m)的游戏次数。 分析:把每个的要玩的游戏次数看成要得到的物体,而每次需要有一个人不能得到。即有n*m-sum>=m,m>=sum/(n-1); 而m必定大于或等于最大想玩的人的次数:故m>=max(a1,a2...an); #include #include #include typedef __int64 LL; using name

ZXLS-ZMR的专栏 1042

CodeForces - 348D Turtles【DP+LGV】

题意:给你一个矩阵(#表示不可走),两只乌龟从左上角出发到达右下角,中间不能相遇,存在多少种不同的方案,也就是两条不相交的路径的方案数. 分析: LGV:(https://en.wikipedia.org/wiki/Lindstr%C3%B6m%E2%80%93Gessel%E2%80%93Viennot_lemma) ps:我自己也不是很懂原理,但是知道怎么用,就说一下吧. 给定n个起点...

王小二的博客 902

【codeforces 348D】Turtles

题目描述 社论 LGV定理告诉我们,在二维空间下,有起点集 $S$,以及终点集 $T$,从 $S$ 到 $T$ 的每一个点走到对应点且不相交路径的方案数为下列矩阵的行列式: $$\begin{pmatrix}f(S_1,T_1) & f(S_1,T_2) & f(S_1,T_3) & \cdots & f(S_1,T_n) \\f(S_2,T_1) ...

aoping9329的博客 210

[Codeforces 484A]Bits(拆位贪心)

题目链接http://codeforces.com/problemset/problem/484/A题目大意求[L,R][L,R]里二进制中1的出现次数最多的数字思路首先我们把L和R拆成二进制数,然后个位对齐,形如下面这样: R:1100101000011111 L:0000101100000001 假设L和R的二进制里前缀[1,t][1,t]这部分是相同的,那么答案数字x在[1,t][1,t

某沙茶的OI代码库 1144

CodeForces 348A Mafia (思维)

A. Mafia time limit per test:2 seconds memory limit per test:256 megabytes input:standard input output:standard output One day n friends gathered together to play "Mafia". Dur

u012150279的专栏 1493

codeforces 348A Mafia

先贴一个有数学公式的题解 题解 题意: n个人,其中每个人最少参加Ai次比赛。比赛是这样定义的:n个人之中出1个裁判,其中n-1个人参加 问:最少需要多少场比赛可以满足题目要求? 看到最少,然后  sum { A【i】}   是肯定可以的,0是肯定不行的。 想到了什么?二分答案。 如何判断某个x是否可行? 如果x小于某个A【i】,是肯定不行的 否则,x

ACdream 528
上一篇: [Codeforces455D]Serega and Fun(分块+双向链表)
下一篇: [BZOJ4555][Tjoi2016&Heoi2016]求和(FFT)
FromATP
博客等级 码龄10年 75粉丝 163原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值