题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4858

题意:中文题面

思路:来自此博客

对每个点定义两个值:val,sum,val记录自己的特征值,sum记录周边所有点特征值的和。

现在我们把所有的节点分成两类,重点(度数>=sqrt(m)),轻点(度数sqrt(m))。

插入:

轻点更新自己的val,同时更新所有的邻点的sum值

重点更新自己的val,同时只更新相邻重点的sum值(所以重点不需要连边到轻点)

查询:

轻点:暴力周边的所有邻点的val值。

重点:直接输出自己的sum值。

性质:

与重点相邻的重点不超过sqrt(m)个。

与轻点相邻的所有点不超过sqrt(m)个。

  1. #define _CRT_SECURE_NO_DEPRECATE
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<queue>
  7. #include<math.h>
  8. #include<time.h>
  9. #include<vector>
  10. #include<iostream>
  11. using namespace std;
  12. typedef long long int LL;
  13. const int MAXN = + ;
  14. struct Edges{
  15. int u, v; Edges(int u = , int v = ) :u(u), v(v){};
  16. };
  17. vector<Edges>edge;
  18. vector<int>G[MAXN];
  19. int val[MAXN],du[MAXN];
  20. LL sum[MAXN];
  21. int main(){
  22. //#ifdef kirito
  23. // freopen("in.txt", "r", stdin);
  24. // freopen("out.txt", "w", stdout);
  25. //#endif
  26. // int start = clock();
  27. int t, n, m, q;
  28. scanf("%d", &t);
  29. while (t--){
  30. scanf("%d%d", &n, &m); edge.clear(); int block = (int)sqrt(m + 0.5);
  31. for (int i = ; i <= n; i++){
  32. G[i].clear(); val[i] = ; du[i] = ; sum[i] = ;
  33. }
  34. for (int i = ; i <= m; i++){
  35. int u, v; scanf("%d%d", &u, &v);
  36. edge.push_back(Edges(u, v));
  37. du[u]++; du[v]++;
  38. }
  39. for (int i = ; i < edge.size(); i++){
  40. int u = edge[i].u, v = edge[i].v;
  41. if (du[u] >= block&&du[v]>=block){
  42. G[u].push_back(v); G[v].push_back(u);
  43. }
  44. if (du[u] < block){
  45. G[u].push_back(v);
  46. }
  47. if (du[v] < block){
  48. G[v].push_back(u);
  49. }
  50. }
  51. scanf("%d", &q);
  52. while (q--){
  53. int type, pos, v; scanf("%d", &type);
  54. if (type){
  55. LL cnt = ; scanf("%d", &pos);
  56. if (du[pos] < block){
  57. for (int i = ; i < G[pos].size(); i++){
  58. cnt += val[G[pos][i]];
  59. }
  60. }
  61. else{
  62. cnt = sum[pos];
  63. }
  64. printf("%I64d\n", cnt);
  65. }
  66. else{
  67. scanf("%d %d", &pos, &v);
  68. val[pos] += v;
  69. for (int i = ; i < G[pos].size(); i++){ sum[G[pos][i]] += v; }
  70. }
  71. }
  72.  
  73. }
  74. //#ifdef LOCAL_TIME
  75. // cout << "[Finished in " << clock() - start << " ms]" << endl;
  76. //#endif
  77. return ;
  78. }

思路2:另一种方法。 可能由于数据弱,所以本题可以完全按照题意暴力。 不过暴力的复杂度是O(n^2)的。只是本题没卡该做法。

  1. #define _CRT_SECURE_NO_DEPRECATE
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<queue>
  7. #include<math.h>
  8. #include<time.h>
  9. #include<vector>
  10. #include<iostream>
  11. using namespace std;
  12. typedef long long int LL;
  13. const int MAXN = + ;
  14. vector<int>G[MAXN];
  15. int val[MAXN];
  16. int main(){
  17. //#ifdef kirito
  18. // freopen("in.txt", "r", stdin);
  19. // freopen("out.txt", "w", stdout);
  20. //#endif
  21. // int start = clock();
  22. int t, n, m, q;
  23. scanf("%d", &t);
  24. while (t--){
  25. scanf("%d%d", &n, &m);
  26. for (int i = ; i <= n; i++){
  27. G[i].clear(); val[i] = ;
  28. }
  29. for (int i = ; i <= m; i++){
  30. int u, v; scanf("%d%d", &u, &v);
  31. G[u].push_back(v); G[v].push_back(u);
  32. }
  33. scanf("%d", &q);
  34. for (int i = ; i <= q; i++){
  35. int type, pos, v;
  36. scanf("%d", &type);
  37. if (type){
  38. LL cnt = ; scanf("%d", &pos);
  39. for (int k = ; k < G[pos].size(); k++){
  40. cnt += val[G[pos][k]];
  41. }
  42. printf("%I64d\n", cnt);
  43. }
  44. else{
  45. scanf("%d %d", &pos, &v);
  46. val[pos] += v;
  47. }
  48. }
  49.  
  50. }
  51. //#ifdef LOCAL_TIME
  52. // cout << "[Finished in " << clock() - start << " ms]" << endl;
  53. //#endif
  54. return ;
  55. }

HDU 4858 分块的更多相关文章

  1. HDU 4467 分块

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4467 题意:给定n个点m条边的无向图,点被染色(黑0/白1),边带边权.然后q个询问.询问分为两种: ...

  2. HDU 5213 分块 容斥

    给出n个数,给出m个询问,询问 区间[l,r] [u,v],在两个区间内分别取一个数,两个的和为k的对数数量. $k<=2*N$,$n <= 30000$ 发现可以容斥简化一个询问.一个询 ...

  3. HDU 5145 分块 莫队

    给定n个数,q个询问[l,r]区间,每次询问该区间的全排列多少种. 数值都是30000规模 首先考虑计算全排列,由于有同种元素存在,相当于每次在len=r-l+1长度的空格随意放入某种元素即$\bin ...

  4. HDU 2920 分块底数优化 暴力

    其实和昨天写的那道水题是一样的,注意爆LL $1<=n,k<=1e9$,$\sum\limits_{i=1}^{n}(k \mod i) = nk - \sum\limits_{i=1}^ ...

  5. HDU 4858 项目管理 分块

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

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

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

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

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

  8. HDU - 4858 项目管理

    N个点,M条无向边.现在有Q组操作,一种是给 i号点增加能量,一种是询问 i号点相邻点的能量和(点间有多条边就算两次). 据说暴力能过,但还是用这题学习了一下 点分块 . 度数不超过 sqrt(M) ...

  9. Successor HDU - 4366 分块

    代码+注释: 1 /* 2 题意: 3 一共有n个人,其中0号是总裁(金字塔顶尖).后面输入其他n-1个人的信息啊a.b.c,分别代表第i个人的上级是a,他的 4 忠诚度为b,他的能力为c.后面有m次 ...

随机推荐

  1. cookie 和session 的区别详解

    这些都是基础知识,不过有必要做深入了解.先简单介绍一下. 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择, 都纪 ...

  2. elk系列8之logstash+redis+es的架构来收集apache的日志

    preface logstash--> redis --> logstash --> es这套架构在讲究松耦合关系里面是最简单的, 架构图如下: 解释下这个架构图的流程 首先前端lo ...

  3. LogStash配置、使用(三)

    LogStash配置 官方文档:https://www.elastic.co/guide/en/logstash/current/index.html 查看yum安装路径 rpm -ql logsta ...

  4. HTML-一个网页的头部的大概框架(完善ing)

    正常情况下,一个头部(考虑兼容.响应.title图标的需求),所要填写的内容如下: <!DOCTYPE html> <html> <head> <meta c ...

  5. WebView与JS的几种交互

    http://www.jianshu.com/p/0042d8eb67c0 最近整理了一下原生与H5之间的交互方式,简单的做个总结.OC端与JS的交互,大致有这几种:拦截协议.JavaScriptCo ...

  6. 第一次作业——subway

    作业源程序代码:https://github.com/R-81/subway 作业程序使用说明:通过输入命令参数求解路线(仅支持-b,-c),根据参数得出路线后,程序不会结束,此时可输入地铁路线名(例 ...

  7. eclipse中SSH三大框架环境搭建<三>

    相关链接: eclipse中SSH三大框架环境搭建<一> eclipse中SSH三大框架环境搭建<二> 引言:通过上两篇文章我们已经可以掌握struts2和spring的环境的 ...

  8. CSS知识回顾--读《CSS 那些事儿》笔记

    由于之前有了解过CSS的相关知识,有了一定的基础,所以读起<CSS 那些事儿>不是很有难度,况且我现在读起来时,CSS3和HTML5比较流行,这里只是记录一些CSS知识记录,不做详细铺开, ...

  9. 14个技巧助你适配 iOS10

    1.Notification(通知) 自从 Notification 被引入之后,苹果就不断的更新优化,但这些更新优化只是小打小闹,直至现在iOS 10开始真正的进行大改重构,这让开发者也体会到 Us ...

  10. 设置arc 的默认编辑器

    arc set-config editor "vim" 转自:http://udn.yyuap.com/thread-39791-1-1.html Pharicator是FB的代码 ...