HDU 4858 分块
题目链接: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 分块的更多相关文章
- HDU 4467 分块
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4467 题意:给定n个点m条边的无向图,点被染色(黑0/白1),边带边权.然后q个询问.询问分为两种: ...
- HDU 5213 分块 容斥
给出n个数,给出m个询问,询问 区间[l,r] [u,v],在两个区间内分别取一个数,两个的和为k的对数数量. $k<=2*N$,$n <= 30000$ 发现可以容斥简化一个询问.一个询 ...
- HDU 5145 分块 莫队
给定n个数,q个询问[l,r]区间,每次询问该区间的全排列多少种. 数值都是30000规模 首先考虑计算全排列,由于有同种元素存在,相当于每次在len=r-l+1长度的空格随意放入某种元素即$\bin ...
- HDU 2920 分块底数优化 暴力
其实和昨天写的那道水题是一样的,注意爆LL $1<=n,k<=1e9$,$\sum\limits_{i=1}^{n}(k \mod i) = nk - \sum\limits_{i=1}^ ...
- HDU 4858 项目管理 分块
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4858 题解: 下面说一个插入查询时间复杂度为sqrt(m)的算法: 对每个点定义两个值:val,su ...
- 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 项目管理
N个点,M条无向边.现在有Q组操作,一种是给 i号点增加能量,一种是询问 i号点相邻点的能量和(点间有多条边就算两次). 据说暴力能过,但还是用这题学习了一下 点分块 . 度数不超过 sqrt(M) ...
- Successor HDU - 4366 分块
代码+注释: 1 /* 2 题意: 3 一共有n个人,其中0号是总裁(金字塔顶尖).后面输入其他n-1个人的信息啊a.b.c,分别代表第i个人的上级是a,他的 4 忠诚度为b,他的能力为c.后面有m次 ...
随机推荐
- cookie 和session 的区别详解
这些都是基础知识,不过有必要做深入了解.先简单介绍一下. 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择, 都纪 ...
- elk系列8之logstash+redis+es的架构来收集apache的日志
preface logstash--> redis --> logstash --> es这套架构在讲究松耦合关系里面是最简单的, 架构图如下: 解释下这个架构图的流程 首先前端lo ...
- LogStash配置、使用(三)
LogStash配置 官方文档:https://www.elastic.co/guide/en/logstash/current/index.html 查看yum安装路径 rpm -ql logsta ...
- HTML-一个网页的头部的大概框架(完善ing)
正常情况下,一个头部(考虑兼容.响应.title图标的需求),所要填写的内容如下: <!DOCTYPE html> <html> <head> <meta c ...
- WebView与JS的几种交互
http://www.jianshu.com/p/0042d8eb67c0 最近整理了一下原生与H5之间的交互方式,简单的做个总结.OC端与JS的交互,大致有这几种:拦截协议.JavaScriptCo ...
- 第一次作业——subway
作业源程序代码:https://github.com/R-81/subway 作业程序使用说明:通过输入命令参数求解路线(仅支持-b,-c),根据参数得出路线后,程序不会结束,此时可输入地铁路线名(例 ...
- eclipse中SSH三大框架环境搭建<三>
相关链接: eclipse中SSH三大框架环境搭建<一> eclipse中SSH三大框架环境搭建<二> 引言:通过上两篇文章我们已经可以掌握struts2和spring的环境的 ...
- CSS知识回顾--读《CSS 那些事儿》笔记
由于之前有了解过CSS的相关知识,有了一定的基础,所以读起<CSS 那些事儿>不是很有难度,况且我现在读起来时,CSS3和HTML5比较流行,这里只是记录一些CSS知识记录,不做详细铺开, ...
- 14个技巧助你适配 iOS10
1.Notification(通知) 自从 Notification 被引入之后,苹果就不断的更新优化,但这些更新优化只是小打小闹,直至现在iOS 10开始真正的进行大改重构,这让开发者也体会到 Us ...
- 设置arc 的默认编辑器
arc set-config editor "vim" 转自:http://udn.yyuap.com/thread-39791-1-1.html Pharicator是FB的代码 ...