N个点,M条无向边。现在有Q组操作,一种是给 i号点增加能量,一种是询问 i号点相邻点的能量和(点间有多条边就算两次)。

据说暴力能过,但还是用这题学习了一下 点分块 。 度数不超过 sqrt(M) 的为 "轻点", 否则为 "重点","轻点"可以指向(连向)这两种点,但"重点"只能指向(连向)"重点" 。val[i]表示i号点能量,sum[i]维护i号点所有相邻的能量。"增加能量"时更新i号点相邻点j的sum[j],查询时"轻点"暴力搜,"重点"直接O(1)返回 sum[i]即可。

修改时,"轻点"们可以修改"重点","重点"可以修改"重点","重点"的sum[]是被维护的,而"轻点"只有sqrt(M)条边,爆搜没问题。

ps : 似乎"重点"出度不超过 2*sqrt(M),未证明。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define fst first
  4. #define scd second
  5. #define pb(x) push_back((x))
  6. #define mkp(x,y) make_pair((x),(y))
  7. #define ist(x) insert((x))
  8. typedef long long ll;
  9. typedef pair<int ,int > pii;
  10. typedef pair<ll ,ll > pll;
  11. typedef vector< int > vi;
  12. ll gcd(ll a,ll b){ return b==?a:gcd(b,a%b);}
  13. ll qPow(ll a,ll b,ll mod){ ll ret=1ll;while(b){ if(b&) ret=ret*a%mod;a=a*a%mod;b>>=;} return ret; }
  14.  
  15. const int maxn=;
  16. int degree[maxn];
  17. vi G[maxn];
  18. ll val[maxn];
  19. ll sum[maxn];
  20. pii bian[maxn];
  21. int bound;
  22.  
  23. void addedge(int u,int v){
  24. if(degree[u]<=bound) G[u].pb(v);
  25. else if(degree[v]>bound) G[u].pb(v);
  26. }
  27.  
  28. int main(){
  29. int T;
  30. scanf("%d",&T);
  31. while(T--) {
  32. int N,M;
  33. scanf("%d%d",&N,&M);
  34. for(int i=;i<=N;++i){
  35. degree[i]=;
  36. G[i].clear();
  37. val[i]=0ll;
  38. sum[i]=0ll;
  39. }
  40. for(int i=;i<=M;++i){
  41. int u,v;
  42. scanf("%d%d",&u,&v);
  43. pii tmp=mkp(u,v);
  44. degree[u]++,degree[v]++;
  45. bian[i]=tmp;
  46. }
  47. bound=sqrt(M);
  48. for(int i=;i<=M;++i)
  49. {
  50. int u=bian[i].fst,v=bian[i].scd;
  51. addedge(u,v);
  52. addedge(v,u);
  53. }
  54. int Q;
  55. scanf("%d",&Q);
  56. for(int i=;i<Q;++i){
  57. int op;
  58. scanf("%d",&op);
  59. if(op){
  60. int u;scanf("%d",&u);
  61. if(degree[u]>bound) printf("%I64d\n",sum[u]);
  62. else{
  63. ll ans=0ll;
  64. for(auto to: G[u]) {
  65. ans+=val[to];
  66. }
  67. printf("%I64d\n",ans);
  68. }
  69. }
  70. else{
  71. int u,w;scanf("%d%d",&u,&w);
  72. val[u]+=1ll*w;
  73. for(auto to: G[u]){
  74. sum[to]+=1ll*w;
  75. }
  76. }
  77. }
  78. }
  79. return ;
  80. }

分摊复杂度,点分块。

HDU - 4858 项目管理的更多相关文章

  1. HDU 4858 项目管理(邻接表 暴力模拟)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4858 我们建造了一个大项目!这个项目有n个节点,用很多边连接起来,并且这个项目是连通的! 两个节点间可 ...

  2. hdu 4858 项目管理 图的分块

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4858 我们建造了一个大项目!这个项目有n个节点,用很多边连接起来,并且这个项目是连通的!两个节点间可能 ...

  3. HDU 4858 项目管理 分块

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4858 题解: 下面说一个插入查询时间复杂度为sqrt(m)的算法: 对每个点定义两个值:val,su ...

  4. hdu 4858 项目管理(STL集装箱)

    项目管理 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  5. hdu 4858 项目管理(vector模拟)

    # include <stdio.h> # include <algorithm> # include <string.h> # include <vecto ...

  6. (hdu)4858 项目管理 (vector)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4858 Problem Description 我们建造了一个大项目!这个项目有n个节点,用很多边连接起 ...

  7. HDOJ 4858 项目管理 ( 只是有点 莫队的分块思想在里面而已啦 )

    题目: 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4858 题意: 我们建造了一个大项目!这个项目有n个节点,用很多边连接起来,并且这个项目是连通的! ...

  8. HDU 4858 分块

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4858 题意:中文题面 思路:来自此博客 对每个点定义两个值:val,sum,val记录自己的特征值,s ...

  9. hdu 4858 水题

    题意:我们建造了一个大项目!这个项目有n个节点,用很多边连接起来,并且这个项目是连通的!两个节点间可能有多条边,不过一条边的两端必然是不同的节点.每个节点都有一个能量值.现在我们要编写一个项目管理软件 ...

随机推荐

  1. Sql更新

    //要传一个DataSet,和若干个表 /// <summary> /// 更新数据库 /// </summary> /// <param name="data ...

  2. Ext 行统计有意思的实现.(js对象的循环, ext列的设置)

    考勤界面, 列包含日期. 行的数据格式:  需要实现 编辑一列然后在最后产生的统计的效果. 行数据内容. Gird Load 的时候统计数据:  -- 根据对象. 可以Ext.Date.parse 成 ...

  3. electron+antd详细教程

    第一步: 要做一个electron项目,理论上我们应该从electron-quick-start开始,就是说我们需要如下3个文件: package.json,node工程最基本的要求,类似于Java的 ...

  4. 【Python爬虫】01:网络爬虫--规则

    Python网络爬虫与信息提取 目标:掌握定向网络数据爬取和网页解析的基本能力. the website is the API 课程分为以下部分: 1.requsets库(自动爬取HTML页面.自动网 ...

  5. 对map集合按照value从大到小进行排序

    概述: 基本特点: 该集合存储键值对,而且要保证键的惟一性 子类: |--HashTable 底层是哈希数据表结构,不可以使用Null作为键或者值:该集合线程是同步的 |--hashMap   底层是 ...

  6. mongoexport 导出需要授权数据库中的集合 报错 Authentication failed.

    当 mongo数据库启动服务时,使用了 认证机制,在使用mongoexport导出集合文件时,需要用户权限认证. 开启数据库认证服务: mongod --auth 导出mongo中集合文件: mong ...

  7. Centos7上使用tomcat8

    1.上传apache-tomcat-8.5.39.tar.gz到/usr/local 2.解压文件:tar -zxvf apache-tomcat-8.5.39.tar.gz 3.把文件夹名改简单一些 ...

  8. springboot学习一:快速搭建springboot项目

    1.idea创建springboot工程 JDK选择1.8以上的版本 选择springboot的版本和添加配置项 新建一个HelloController,测试 访问 http://localhost: ...

  9. python configparse模块&xml模块

    configparse模块 用于生成和修改常见配置文档,当前模块的名称在 python 3.x 版本中变更为 configparser. [DEFAULT] serveraliveinterval = ...

  10. win10基础上安装linux系统,添加双系统启动项

    1. 本机安装Centos7mini(注意点:进入安装界面先修改下面的内容,修改为U盘名称) 2. 配置文件/boot/grub2/grub.cfg,完成双系统启动设置. 3. 配置ip地址 nmcl ...