题目链接: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)个。

#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<string.h>
#include<cstring>
#include<algorithm>
#include<queue>
#include<math.h>
#include<time.h>
#include<vector>
#include<iostream>
using namespace std;
typedef long long int LL;
const int MAXN = + ;
struct Edges{
int u, v; Edges(int u = , int v = ) :u(u), v(v){};
};
vector<Edges>edge;
vector<int>G[MAXN];
int val[MAXN],du[MAXN];
LL sum[MAXN];
int main(){
//#ifdef kirito
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
//#endif
// int start = clock();
int t, n, m, q;
scanf("%d", &t);
while (t--){
scanf("%d%d", &n, &m); edge.clear(); int block = (int)sqrt(m + 0.5);
for (int i = ; i <= n; i++){
G[i].clear(); val[i] = ; du[i] = ; sum[i] = ;
}
for (int i = ; i <= m; i++){
int u, v; scanf("%d%d", &u, &v);
edge.push_back(Edges(u, v));
du[u]++; du[v]++;
}
for (int i = ; i < edge.size(); i++){
int u = edge[i].u, v = edge[i].v;
if (du[u] >= block&&du[v]>=block){
G[u].push_back(v); G[v].push_back(u);
}
if (du[u] < block){
G[u].push_back(v);
}
if (du[v] < block){
G[v].push_back(u);
}
}
scanf("%d", &q);
while (q--){
int type, pos, v; scanf("%d", &type);
if (type){
LL cnt = ; scanf("%d", &pos);
if (du[pos] < block){
for (int i = ; i < G[pos].size(); i++){
cnt += val[G[pos][i]];
}
}
else{
cnt = sum[pos];
}
printf("%I64d\n", cnt);
}
else{
scanf("%d %d", &pos, &v);
val[pos] += v;
for (int i = ; i < G[pos].size(); i++){ sum[G[pos][i]] += v; }
}
} }
//#ifdef LOCAL_TIME
// cout << "[Finished in " << clock() - start << " ms]" << endl;
//#endif
return ;
}

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

#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<string.h>
#include<cstring>
#include<algorithm>
#include<queue>
#include<math.h>
#include<time.h>
#include<vector>
#include<iostream>
using namespace std;
typedef long long int LL;
const int MAXN = + ;
vector<int>G[MAXN];
int val[MAXN];
int main(){
//#ifdef kirito
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
//#endif
// int start = clock();
int t, n, m, q;
scanf("%d", &t);
while (t--){
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++){
G[i].clear(); val[i] = ;
}
for (int i = ; i <= m; i++){
int u, v; scanf("%d%d", &u, &v);
G[u].push_back(v); G[v].push_back(u);
}
scanf("%d", &q);
for (int i = ; i <= q; i++){
int type, pos, v;
scanf("%d", &type);
if (type){
LL cnt = ; scanf("%d", &pos);
for (int k = ; k < G[pos].size(); k++){
cnt += val[G[pos][k]];
}
printf("%I64d\n", cnt);
}
else{
scanf("%d %d", &pos, &v);
val[pos] += v;
}
} }
//#ifdef LOCAL_TIME
// cout << "[Finished in " << clock() - start << " ms]" << endl;
//#endif
return ;
}

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. U盘因为装linux系统变小了

    U盘在Windows下被UltraISO等软件制作成Linux启动盘后会自动被格式化成FAT格式,导致容量变小. 用DiskGenius去修复 http://www.jb51.net/softs/75 ...

  2. Alpha阶段第六次Scrum Meeting

    情况简述 Alpha阶段第六次Scrum Meeting 敏捷开发起始时间 2016/10/27 00:00 敏捷开发终止时间 2016/10/28 00:00 会议基本内容摘要 提出了目前阶段遇到的 ...

  3. python的颜色显示

    我们知道在命令行下,python的输出的字符串颜色和一般字符相同. 若我们想强调某些字符,我们可以利用代码将要强调的部分变成某种颜色. 在linux终端命令可以显示某种颜色,在windows的cmd终 ...

  4. virtual和abstract

    virtual和abstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义. 共同点:如果用来修饰方法,前面必须添加public,要不然就会出现编译错误:虚拟方法或抽象方法是不能私有的. ...

  5. 笔记:MAC OS X下配置PHP开发、调试环境

    操作系统:MAC OS X 工具:MAMP.PhpStorm.xdebug.chrome 1.下载MAMP 2.安装比较简单,安装完成后,应用程序中会增加如下4个应用 MacGDBp是PHP调试器,使 ...

  6. 深入理解javascript原型和闭包(12)——简介【作用域】

    提到作用域,有一句话大家(有js开发经验者)可能比较熟悉:“javascript没有块级作用域”.所谓“块”,就是大括号“{}”中间的语句.例如if语句: 再比如for语句: 所以,我们在编写代码的时 ...

  7. Jquery实现花瓣随机飘落(收藏自慕课网)

    这个东西实际上慕课的艾伦大大先写的. 然后别人推荐给我,偶一直收藏着,然后偶再推荐给偶的队友们,然后呢,这帮货就懒得都不肯去看... 接着今天受伤在家就提出来了一点东西放在我博客顶上... 然后艾伦的 ...

  8. 大熊君{{bb}}移动开发之旅(第一季)

    一,开篇概述 Hi,大家好!大熊君又和大家见面了,从这篇文章开始我要和大家聊聊移动开发的话题,这部分文章共8季,分别从不同角度来讲解什么是移动开发?移动开发涉及到什么方面的技术点以及移动开发中的常见问 ...

  9. bzoj1441 MIN

    Description 给出n个数(A1…An)现求一组整数序列(X1…Xn)使得S=A1*X1+…An*Xn>0,且S的值最小 Input 第一行给出数字N,代表有N个数 下面一行给出N个数 ...

  10. tyvj1013 找啊找啊找GF

    描述 "找啊找啊找GF,找到一个好GF,吃顿饭啊拉拉手,你是我的好GF.再见.""诶,别再见啊..."七夕...七夕...七夕这个日子,对于sqybi这种单身的 ...