HDU 4858 项目管理 分块
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=4858
题解:
下面说一个插入查询时间复杂度为sqrt(m)的算法:
对每个点定义两个值:val,sum,val记录自己的特征值,sum记录周边所有点特征值的和。
现在我们把所有的节点分成两类,重点(度数>=sqrt(m)),轻点(度数sqrt(m))。
插入:
轻点更新自己的val,同时更新所有的邻点的sum值
重点更新自己的val,同时只更新相邻重点的sum值(所以重点不需要连边到轻点)
查询:
轻点:暴力周边的所有邻点的val值。
重点:直接输出自己的sum值。
性质:
与重点相邻的重点不超过sqrt(m)个。
与轻点相邻的所有点不超过sqrt(m)个。
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<utility>
#include<cmath>
using namespace std; typedef long long LL;
const int maxn=1e5+; vector<int> G[maxn];
pair<int,int> E[maxn]; LL val[maxn],sum[maxn];
int cnt[maxn];
int n,m,q; void init(){
memset(val,,sizeof(val));
memset(sum,,sizeof(sum));
memset(cnt,,sizeof(cnt));
memset(E,,sizeof(E));
for(int i=;i<=n;i++) G[i].clear();
} int main(){
int tc;
scanf("%d",&tc);
while(tc--){
scanf("%d%d",&n,&m);
init();
for(int i=;i<m;i++){
int u,v;
scanf("%d%d",&E[i].first,&E[i].second);
cnt[E[i].first]++,cnt[E[i].second]++;
}
for(int i=;i<m;i++){
int u=E[i].first,v=E[i].second;
if(cnt[u]>cnt[v]) swap(u,v);
if(cnt[u]<sqrt(m+0.5)){
G[u].push_back(v);
if(cnt[v]<sqrt(m+0.5)) G[v].push_back(u);
}
else{
G[u].push_back(v);
G[v].push_back(u);
}
}
scanf("%d",&q);
while(q--){
int cmd; scanf("%d",&cmd);
if(cmd==){
int id,v;
scanf("%d%d",&id,&v);
val[id]+=v;
for(int i=;i<G[id].size();i++){
sum[G[id][i]]+=v;
}
}else{
int id;
scanf("%d",&id);
if(cnt[id]>=sqrt(m+0.5)) printf("%lld\n",sum[id]);
else{
LL res=;
for(int i=;i<G[id].size();i++){
res+=val[G[id][i]];
}
printf("%lld\n",res);
}
}
}
}
return ;
}
HDU 4858 项目管理 分块的更多相关文章
- hdu 4858 项目管理 图的分块
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4858 我们建造了一个大项目!这个项目有n个节点,用很多边连接起来,并且这个项目是连通的!两个节点间可能 ...
- HDU 4858 项目管理(邻接表 暴力模拟)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4858 我们建造了一个大项目!这个项目有n个节点,用很多边连接起来,并且这个项目是连通的! 两个节点间可 ...
- hdu 4858 项目管理(STL集装箱)
项目管理 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- HDU - 4858 项目管理
N个点,M条无向边.现在有Q组操作,一种是给 i号点增加能量,一种是询问 i号点相邻点的能量和(点间有多条边就算两次). 据说暴力能过,但还是用这题学习了一下 点分块 . 度数不超过 sqrt(M) ...
- hdu 4858 项目管理(vector模拟)
# include <stdio.h> # include <algorithm> # include <string.h> # include <vecto ...
- HDOJ 4858 项目管理 ( 只是有点 莫队的分块思想在里面而已啦 )
题目: 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4858 题意: 我们建造了一个大项目!这个项目有n个节点,用很多边连接起来,并且这个项目是连通的! ...
- (hdu)4858 项目管理 (vector)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4858 Problem Description 我们建造了一个大项目!这个项目有n个节点,用很多边连接起 ...
- HDU 4858 分块
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4858 题意:中文题面 思路:来自此博客 对每个点定义两个值:val,sum,val记录自己的特征值,s ...
- HDU 4366 Successor 分块做法
http://acm.hdu.edu.cn/showproblem.php?pid=4366 今日重新做了这题的分块,果然是隔太久了,都忘记了.. 首先,用DFS序变成一维的问题 关键是它有两个权值, ...
随机推荐
- code vs1262 不要把球传我(组合数学) 2012年CCC加拿大高中生信息学奥赛
1262 不要把球传我 2012年CCC加拿大高中生信息学奥赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 查看运行结果 题目描述 De ...
- Mysql 练习 总结
insert into Course values ('); #---------------Teacher--添加信息---- insert into Teacher values (','李成', ...
- 【leetcode】Maximal Rectangle (hard)★
Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and ...
- 【python】下载远程内容到本地
来源:http://www.jb51.net/article/42630.htm urllib模块 urlretrieve方法 urllib.urlretrieve(url[, filename[, ...
- struts 拦截器 Interceptor
拦截器是AOP中的概念,它本身是一段代码,可以通过定义“织入点”,来指定拦截器的代码在“织入点”的前后执行,从而起到拦截的作用.正如上面 Struts2的Reference中讲述的,Stru ...
- 好用的php类库和方法
1, /** * 将一个平面的二维数组按照指定的字段转换为树状结构 * * 用法: * @code php * $rows = array( * array('id' => 1, 'value' ...
- 生成Geometry
// 由一组点集生成一张三角面片网格Geometry osg::Geometry* createTRIANGLESGeometry(MyMesh &mesh) { osg::ref_ptr&l ...
- UVa815_Flooded!
#include <iostream> //#include <fstream> #include <iomanip> #include <cstdio> ...
- 51nod1019逆序数(归并排序/树状数组)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1019 题意:中文题诶- 思路: 方法1:归并排序- 归并排序过 ...
- 【JAVA常用类演示】
一.java.lang.System类. public final class Systemextends Object 该类包含一些有用的类字段和方法.它不能被实例化. 在 System 类提供的 ...