博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF348C Subset Sums
阅读量:2231 次
发布时间:2019-05-09

本文共 1824 字,大约阅读时间需要 6 分钟。

思路好题

首先,将集合大小大于等于sqrt(n)的集合称为重集合,其余称为轻集合,则重集合个数小于等于sqrt(n)。

令f[i][j]表示第i个集合和第j个集合的同样元素个数,这能够在O(n*sqrt(n))内预处理。

再令sum[i]表示第i个重集合的元素和,add[i]表示第i个重集合全部元素的增量标记。

改动操作。重集合直接改动sum[i]和add[i]。轻集合暴力改动,同一时候用f[i][j]改动重集合。

询问操作。重集合直接输出sum[i],轻集合暴力计算。

总复杂度O(n*sqrt(n))。

注意集合的存储方式。邻接矩阵会超内存。

#include
#include
#include
#include
#include
#include
#define F(i,j,n) for(int i=j;i<=n;i++)#define D(i,j,n) for(int i=j;i>=n;i--)#define ll long long#define maxn 100005using namespace std;int n,m,q,cnt,tot,block,head[maxn],id[maxn],f[maxn][400];ll a[maxn],sum[400],add[400];bool g[400][maxn];struct edge_type{int next,to;}e[maxn];inline int read(){ int x=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();} while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}inline void add_edge(int x,int y){ e[++cnt]=(edge_type){head[x],y}; head[x]=cnt;}int main(){ n=read();m=read();q=read(); block=ceil(sqrt(100000)); F(i,1,n) a[i]=read(); F(i,1,m) { int sz=read(); if (sz>=block) id[i]=++tot; while (sz--) { int x=read(); if (id[i]) g[tot][x]=true; add_edge(i,x); } } F(i,1,m) F(j,1,tot) for(int k=head[i];k;k=e[k].next) if (g[j][e[k].to]) f[i][j]++; F(i,1,m) if (id[i]) for(int j=head[i];j;j=e[j].next) sum[id[i]]+=a[e[j].to]; while (q--) { char ch=getchar();while (ch!='?'&&ch!='+') ch=getchar(); if (ch=='?') { int x=read(); if (id[x]) printf("%I64d\n",sum[id[x]]); else { ll ans=0; for(int i=head[x];i;i=e[i].next) ans+=a[e[i].to]; F(i,1,tot) ans+=add[i]*f[x][i]; printf("%I64d\n",ans); } } else { int x=read(),y=read(); F(i,1,tot) sum[i]+=(ll)y*f[x][i]; if (id[x]) add[id[x]]+=y; else for(int i=head[x];i;i=e[i].next) a[e[i].to]+=y; } }}

转载于:https://www.cnblogs.com/ljbguanli/p/7297496.html

你可能感兴趣的文章
分布式系统理论进阶7:Paxos变种和优化
查看>>
分布式系统理论基础8:zookeeper分布式协调服务
查看>>
搞懂分布式技术1:分布式系统的一些基本概念
查看>>
搞懂分布式技术2:分布式一致性协议与Paxos,Raft算法
查看>>
搞懂分布式技术3:初探分布式协调服务zookeeper
查看>>
搞懂分布式技术4:ZAB协议概述与选主流程详解
查看>>
搞懂分布式技术5:Zookeeper的配置与集群管理实战
查看>>
搞懂分布式技术6:Zookeeper典型应用场景及实践
查看>>
搞懂分布式技术10:LVS实现负载均衡的原理与实践
查看>>
搞懂分布式技术11:分布式session解决方案与一致性hash
查看>>
搞懂分布式技术12:分布式ID生成方案
查看>>
搞懂分布式技术13:缓存的那些事
查看>>
搞懂分布式技术14:Spring Boot使用注解集成Redis缓存
查看>>
搞懂分布式技术15:缓存更新的套路
查看>>
搞懂分布式技术16:浅谈分布式锁的几种方案
查看>>
搞懂分布式技术17:浅析分布式事务
查看>>
搞懂分布式技术18:分布式事务常用解决方案
查看>>
搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务
查看>>
搞懂分布式技术20:消息队列因何而生
查看>>
搞懂分布式技术21:浅谈分布式消息技术 Kafka
查看>>