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

题意:给你n个点(每个点都有一个颜色,0代表黑色,1代表白色),m条边,每条边有一个权值.现在有有两个操作,一个是修改某个点的颜色(白变成黑/黑变成白),另外一个是询问那些边的两个端点                        都为指定颜色的权值总和

思路:将所有点分为重点和轻点,但是这次重点和重点之前的边要建在一个图中,剩余的边要建在另一个图中。对于最后访问的颜色,只有三种情况黑+黑(求和为0),黑+白(求和为1),白+白(求和为                     2),所以用ans[0],ans[1],ans[2]分别对应的答案。对于重点i设置一个sum[i][2],sum[i][0]表示所有与他相邻且颜色为0(黑)的点的边权之和,sum[i][1]同理。更新时,对于重点i来说拿sum[i][0]和sum[i][1]            去直接更新a数组,同时将其相邻的重点的sum值进行修改。而对于轻点i来说,遍历所有与i相连的边,暴力更新a数组,而当其相邻点为重点时则需要更新一下重点的sum数组。对于查询操作,直接输出                ans数组 中的  值即可  (转自 : https://www.cnblogs.com/HDUjackyan/p/8996172.html)

#include<bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define dep(i,j,k) for(int i=k;i>=j;i--)
#define INF 0x3f3f3f3f
#define mem(i,j) memset(i,j,sizeof(i))
#define make(i,j) make_pair(i,j)
#define pb push_back
using namespace std;
const int N=1e5+;
int c[N],du[N];
LL ans[],sum[N][];
bool vis[N];
struct note {
int u,v;
LL w;
}a[N];
vector< pair<int,LL> > Z[N],Q[N];
bool cmp (note a,note b) {
return a.u==b.u?a.v<b.v:a.u<b.u;
}
char op[];
int main() {
int n,m; int cas=;
while(~scanf("%d %d",&n,&m)) {
rep(i,,n) scanf("%d",&c[i]);
rep(i,,n) {
du[i]=; vis[i]=false; sum[i][]=sum[i][]=;
Z[i].clear(); Q[i].clear();
}
mem(ans,);
rep(i,,m) {
scanf("%d %d %lld",&a[i].u,&a[i].v,&a[i].w);
if(a[i].u>a[i].v) swap(a[i].u,a[i].v);
ans[c[a[i].u]+c[a[i].v]]+=a[i].w;
}
sort(a+,a++m,cmp);
int I,J; int head=;
for(I=;I<=m;I=J) {
for(J=I+;J<=m;J++) {
if(a[I].u==a[J].u && a[I].v==a[J].v) {
a[I].w+=a[J].w;
}
else break;
}
a[++head]=a[I];
}
int block=sqrt(head);
rep(i,,head) {
if(++du[a[i].u]>block) vis[a[i].u]=true;
if(++du[a[i].v]>block) vis[a[i].v]=true;
}
int x,y; LL z;
rep(i,,head) {
x=a[i].u; y=a[i].v; z=a[i].w;
if(vis[x]) {
if(vis[y]) {
Z[x].pb(make(y,z));
Z[y].pb(make(x,z));
sum[x][c[y]]+=z;
sum[y][c[x]]+=z;
}
else {
Q[y].pb(make(x,z));
sum[x][c[y]]+=z;
}
}
else {
if(vis[y]) {
Q[x].pb(make(y,z));
sum[y][c[x]]+=z;
}
else {
Q[x].pb(make(y,z));
Q[y].pb(make(x,z));
}
}
}
int q;
printf("Case %d:\n",++cas);
scanf("%d",&q);
while(q--) {
scanf("%s",op);
if(op[]=='A') {
scanf("%d %d",&x,&y);
printf("%lld\n",ans[x+y]);
}
else {
scanf("%d",&x);
if(vis[x]) {
ans[c[x]+]-=sum[x][];
ans[c[x]+]-=sum[x][];
ans[-c[x]+]+=sum[x][];
ans[-c[x]+]+=sum[x][];
int len=Z[x].size()-;
rep(i,,len) {
y=Z[x][i].first; z=Z[x][i].second;
sum[y][c[x]]-=z;
sum[y][-c[x]]+=z;
}
}
else {
int len=Q[x].size()-;
rep(i,,len) {
y=Q[x][i].first; z=Q[x][i].second;
ans[c[x]+c[y]]-=z;
ans[-c[x]+c[y]]+=z;
if(vis[y]) {
sum[y][c[x]]-=z;
sum[y][-c[x]]+=z;
}
}
}
c[x]=-c[x];
}
}
}
return ;
}

HDOJ4467 ( 分块 思想 )的更多相关文章

  1. Codeforces Round #319 (Div. 1)C. Points on Plane 分块思想

                                                                              C. Points on Plane On a pl ...

  2. ZOJ 1654 Place the Robots建图思维(分块思想)+二分匹配

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=654 AC一百道水题,不如AC一道难题来的舒服. 题意:一个n*m地图 ...

  3. PAT1057 stack(分块思想)

    1057 Stack (30分)   Stack is one of the most fundamental data structures, which is based on the princ ...

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

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

  5. 莫队算法 sqrt(n)分块思想

    在此说一下本渣对莫队算法思想的一些浅薄理解 莫队算法的思想就是对真个区间的分块,然后按照每块来分别进行计算,这样最终的复杂度可以达到n*sqrt(n) 小Z的袜子是一道非常经典的题目.:题目链接htt ...

  6. [BZOJ 2957]楼房重建(THU2013集训)(分块思想)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2957 分析: 首先明确问题,对于每栋楼房的斜率K=H/X,问题就是问有多少个楼房的K比前面所有 ...

  7. hdu_5110_Alexandra and COS(DP+分块思想)

    题目连接:hdu_5110_Alexandra and COS 题意: 给你一个图,X代表宝藏,然后有一个船,它的声纳的频率为D,定船到宝藏的距离为Dis=max(abs(x1-x2),abs(y1- ...

  8. hdu_5085_Counting problem(莫队分块思想)

    题目连接:hdu_5085_Counting problem 题意:给你一个计算公式,然后给你一个区间,问这个区间内满足条件的数有多少个 题解:由于这个公式比较特殊,具有可加性,我们考虑讲一个数分为两 ...

  9. 牛客小白月赛12 H(dfs序+线段树),F(分块思想+bit),J(二分)

    H 华华和月月种树 链接:https://ac.nowcoder.com/acm/contest/392/H 思路:先得到整棵树最终的形态,在这棵树上进行三种操作,用dfs跑下,第二种操作就直接对最终 ...

随机推荐

  1. python-day5(正式学习)

    格式化输出 符合某种输出规范的print函数的应用 第一种方式 使用占位符.漫威里有个人叫斯塔克,他平时站在人堆里(print函数引号内的内容)我们看不出来和其他人有什么异常(print的终端显示), ...

  2. 第5章:Linux系统管理

    1.文件读写 1).Python内置的open函数 f = open('data.txt', 'w') f.write('hello, world') f.close() 2).避免文件句柄泄露 tr ...

  3. k8s之资源指标API部署metrics-server

    1.部署metrics-server 从v1.8开始,引入了新的功能,即把资源指标引入api,资源指标:metrics-server,自定义指标:prometheus,k8s-prometheus-a ...

  4. 训练技巧详解【含有部分代码】Bag of Tricks for Image Classification with Convolutional Neural Networks

    训练技巧详解[含有部分代码]Bag of Tricks for Image Classification with Convolutional Neural Networks 置顶 2018-12-1 ...

  5. WebApi 空项目生成帮助文档

    1.创建一个WebApi的空项目 2.写一些接口,在接口文档中忽略某个方法可以使用  [ApiExplorerSettings(IgnoreApi = true)] 特性 3.在Nuget中添加 Mi ...

  6. git基本操作及实用工具

    //git1.安装客户端git Git-2.9.3-rebase-i-64-bit.exe2.安装完成后打开git bashgit config --global user.name "li ...

  7. windows 安装K8s 简易教程

    1. 先安装 chocolatey https://chocolatey.org/install administrator 运行 命令: @"%SystemRoot%\System32\W ...

  8. 一个jenkins的bug

    部署在redhat上docker中的jenkins运行了很久了,最新发现一个站点不是最新的,于是去查看发现git仓库都连不上,我换成外网github的仓库就可以连非得是https吗???? 提示是域名 ...

  9. gdb-example-ncurses

    gdb-example-ncurses http://www.brendangregg.com/blog/2016-08-09/gdb-example-ncurses.html 1. The Prob ...

  10. sqlserver跨库操作数据

    垮库只能读操作,写操作需要设置权限. USE [jdddb] GO /****** Object: StoredProcedure [dbo].[proc_LYOrderCancel] Script ...