题目:链接: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. python3启航

    Python3的基本数据类型 数字 int ,所有功能都放在int里 a1 = 123 a2 = 456 ##int 将字符串转换为数字 a = "123" print(tyep( ...

  2. 怎样使用yum安装nginx

    yum install -y nginx 以上.

  3. element-ui 中 table 鼠标悬停时背景颜色修改

    样式穿透: /deep/ .el-table tbody tr:hover>td { background-color: #颜色 }

  4. ORM框架之EntityFramework介绍

    ORM框架之EntityFramework介绍 1. 简介 大家好!我是高堂. 作为一位伪前端程序猿,我给大家介绍一下微软的自家的 ORM框架. ADO.NET Entity Framework 以下 ...

  5. .NET Core 3.0 发布单文件可执行程序

    Windows dotnet publish -r win10-x64 /p:PublishSingleFile=true maxOS dotnet publish -r osx-x64 /p:Pub ...

  6. gitlab 搭建

     一.ubuntu搭建gitlab     1. 如果以前有安装过gitlab请根据以下步骤来删除 https://www.cnblogs.com/shansongxian/p/6678110.htm ...

  7. scp上传文件到远程服务器

    scp -P 22 E:/download/2028792_www.yeves.cn_nginx/cloud.pem root@ip:/usr/local/src

  8. tempfile:临时文件系统对象

    介绍 想要安全的创建名字唯一的临时文件,以防止被试图破坏应用或窃取数据的人猜出,这很有难度.tempfile模块提供了多个函数来安全创建临时文件系统资源.TemporaryFile函数打开并返回一个未 ...

  9. Hadoop_31_MapReduce参数优化

    1.资源相关参数 (1) mapreduce.map.memory.mb: 一个Map Task可使用的资源上限(单位:MB),默认为1024.如果Map Task实际使用 的资源量超过该值,则会被强 ...

  10. How to export Overload functions from DLL?

    Library that exports functions library liba; procedure F(X: Integer); stdcall; overload; begin end; ...