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_0=\sqrt{\sum|S_i|}\)。

我们把集合划分成轻集合与重集合,大小超过\(N_0\)的集合就是重集合。容易知道重集合的个数不超过\(N_0\)。对于每个重集合,记录sum表示该集合的和,add表示该集合总体被加了的值,cnt[i]表示该集合与集合\(i\)的交集大小。

询问时,如果是重集合则输出sum;否则暴力求\(\{a\}\)上的和,再加上每个重集合对该轻集合的贡献add*cnt[k]

修改时,如果是重集合则add+=x;否则暴力修改\(\{a\}\)。然后更新每个重集合的sum,也就是加上x*cnt[k]

时间复杂度\(O(q\sqrt{\sum|S_i|})\)。

Code

//Subset Sums
#include <cstdio>
#include <cmath>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long lint;
inline int read()
{
int x=0,f=1; char ch=getchar();
while(ch<'0'||'9'<ch) {if(ch=='-') f=-1; ch=getchar();}
while('0'<=ch&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
int const N=1e5+1e3;
int const N0=400;
int n,m,q,n0; lint a[N];
int ori[N];
struct _set{int siz,id; vector<int> x;} s[N];
bool cmpSiz(_set x,_set y) {return x.siz>y.siz;}
bool tmp[N]; int cnt[N0][N]; lint add[N0],sum[N0];
int main()
{
n=read(),m=read(),q=read();
for(int i=1;i<=n;i++) a[i]=read();
int sumK=0;
for(int i=1;i<=m;i++)
{
s[i].siz=read(),s[i].id=i,s[i].x.push_back(0); sumK+=s[i].siz;
for(int p=1;p<=s[i].siz;p++) s[i].x.push_back(read());
}
sort(s+1,s+m+1,cmpSiz);
for(int i=1;i<=m;i++) ori[s[i].id]=i;
n0=sqrt(sumK); int cnt1=0;
for(int i=1;s[i].siz>=n0;i++) cnt1=i;
for(int i=1;i<=cnt1;i++)
{
memset(tmp,false,sizeof tmp);
for(int p=1;p<=s[i].siz;p++) sum[i]+=a[s[i].x[p]],tmp[s[i].x[p]]=true;
for(int j=1;j<=m;j++)
for(int p=1;p<=s[j].siz;p++) if(tmp[s[j].x[p]]) cnt[i][j]++;
}
for(int owo=1;owo<=q;owo++)
{
char opt; scanf("%c",&opt);
if(opt=='?')
{
int k=ori[read()];
if(k<=cnt1) printf("%lld\n",sum[k]);
else
{
lint res=0;
for(int p=1;p<=s[k].siz;p++) res+=a[s[k].x[p]];
for(int i=1;i<=cnt1;i++) res+=add[i]*cnt[i][k];
printf("%lld\n",res);
}
}
if(opt=='+')
{
int k=ori[read()]; lint v=read();
if(k<=cnt1) add[k]+=v;
else for(int p=1;p<=s[k].siz;p++) a[s[k].x[p]]+=v;
for(int i=1;i<=cnt1;i++) sum[i]+=v*cnt[i][k];
}
}
return 0;
}

P.S.

可以用vector<int>存储集合元素,直接开数组内存太大。

要开long long啊啊啊啊啊!

Codeforces348C - Subset Sums的更多相关文章

  1. 洛谷P1466 集合 Subset Sums

    P1466 集合 Subset Sums 162通过 308提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 对于从1到N (1 ...

  2. Project Euler 106:Special subset sums: meta-testing 特殊的子集和:元检验

    Special subset sums: meta-testing Let S(A) represent the sum of elements in set A of size n. We shal ...

  3. Project Euler P105:Special subset sums: testing 特殊的子集和 检验

    Special subset sums: testing Let S(A) represent the sum of elements in set A of size n. We shall cal ...

  4. Project Euler 103:Special subset sums: optimum 特殊的子集和:最优解

    Special subset sums: optimum Let S(A) represent the sum of elements in set A of size n. We shall cal ...

  5. CodeForces 348C Subset Sums(分块)(nsqrtn)

    C. Subset Sums time limit per test 3 seconds memory limit per test 256 megabytes input standard inpu ...

  6. DP | Luogu P1466 集合 Subset Sums

    题面:P1466 集合 Subset Sums 题解: dpsum=N*(N+1)/2;模型转化为求选若干个数,填满sum/2的空间的方案数,就是背包啦显然如果sum%2!=0是没有答案的,就特判掉F ...

  7. spoj-SUBSUMS - Subset Sums

    SUBSUMS - Subset Sums Given a sequence of N (1 ≤ N ≤ 34) numbers S1, ..., SN (-20,000,000 ≤ Si ≤ 20, ...

  8. 洛谷 P1466 集合 Subset Sums Label:DP

    题目描述 对于从1到N (1 <= N <= 39) 的连续整数集合,能划分成两个子集合,且保证每个集合的数字和是相等的.举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,每个子 ...

  9. 【USACO 2.2】Subset Sums (DP)

    N (1 <= N <= 39),问有多少种把1到N划分为两个集合的方法使得两个集合的和相等. 如果总和为奇数,那么就是0种划分方案.否则用dp做. dp[i][j]表示前 i 个数划分到 ...

随机推荐

  1. linkin大话面向对象--java关键字

    java中的关键字有以下几个,他们不能作任何其它的用途. 发现没,java中的关键字全是小写,java是严格区分大小写的. abstract  default  null  synchronized ...

  2. 易趣:使用MongoDB创建关键业务的多数据中心应用

    eBay:使用MongoDB创建关键业务的多数据中心应用 作为全球前十的零售品牌,eBay的活跃用户有一亿七千多万,并拥有跨越全世界190个市场的10亿购物清单,这样的规模下,eBay绝对不允许出现宕 ...

  3. SQL SERVER 表最小行的一个纠结问题

    昨天一个同事突然问我,说他在SQL 2000数据库创建如下表的时候,突然碰到了下面一条警告信息.SQL脚本和警告信息如下: IF OBJECT_ID(N'Log') IS  NULL BEGINCRE ...

  4. zabbix监控windows agent安装配置

    下载Windows的zabbix客户端 下载地址:http://www.zabbix.com/download.php 从官方下载Zabbix Agent后,压缩包里面有2个目录,bin和conf,c ...

  5. Win10微软帐户切换不回Administrator本地帐户的解决方法--(转,虽转但亲测有效)

    在Win10系统中经常会用到微软帐户登录,如应用商店等地方,不过一些用户反馈原来使用Administrator帐户被绑定微软帐户后无法切换回本地帐户,连[改用本地帐户登录]按钮都没有,那么怎么解决呢? ...

  6. 监控mysql主从同步状态

    在高并发网站架构中,MySQL数据库主从同步是不可或缺的,不过经常会发生由于网络原因或者操作错误,MySQL主从经常会出现不同步的情况,那么如何监控MySQL主从同步,也变成网站正常运行的重要环节. ...

  7. ASP.NET Core 2.0 : 三. 项目结构

    本章我们一起来对比着ASP.NET Framework版本看一下ASP.NET Core 2.0的项目结构.(此后的文章也尽量这样对比着, 方便学习理解.) 关注差异, 也为项目迁移做准备. 新建项目 ...

  8. linux下硬盘uuid查看及修改设置

    查看硬盘UUID 方法一:ls -l /dev/disk/by-uuid方法二:blkid /dev/sdb1 修改硬盘UUID: uuidgen 会返回一个合法的 uuid,结合 tune2fs 可 ...

  9. iOS-FMDB事务【批量更新数据】

    打开数据库(sqlite) ///打开数据库 + (BOOL)openDataBase{ _TYDatabase = [[FMDatabase alloc]initWithPath:[self dat ...

  10. 让44.1版本的sketch打开更高版本的sketch文件

    我们都知道,sketch的有效license与版本挂钩.最近设计师又更新了sketch版本,导致她生成的源文件我都无法打开. 毕竟我不是使用sketch进行UI设计,仅用它来查看设计稿参数,再花99美 ...