题目:链接: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. Eureka【启用https】

    上一篇主要说的是开启http basic认证,从安全角度来讲,基于base64编码,容易被抓包后破解,在公网中很不安全,本文详谈如何在eureka server和eureka client中开启htt ...

  2. 第十一章 ZYNQ-MIZ702 DDR3 PS读写操作方案

      本编文章的目的主要用简明的方法在纯PS里对DDR3进行读写. 本文所使用的开发板是Miz702 PC 开发环境版本:Vivado 2015.4 Xilinx SDK 2015.4 11.0本章难度 ...

  3. hdu 6043 KazaQ's Socks

    规律题.我自己写的规律对长度为2的要特判,wa一万次... 规律题目,容易错的反而是数据小的时候,得长记性. 题解:规律 先是1~n 然后1~n-2 n-1  1~n-2 n 交替出现 比如当n=4 ...

  4. RestShrap Simple REST and HTTP Client for .NET 了解

    最近做一个项目,需要上传文件到文件服务器, 文件服务器是 内部的webapi形式的接口.经朋友推荐使用restshrap , 例子: //上传文件 var request=new RestClient ...

  5. 微信小程序修改radio和checkbox的默认样式和图标

    wxml: <view class="body"> <view class="body-content"> 第1题:企业的价值观是 ? ...

  6. SpringCloud 随笔

    目录 服务间通讯 统一配置中心 RabbitMQ Spring Cloud Stream 服务网关 Spring Cloud Zuul ++==(纯手打,代码可能有错!)==++ 服务间通讯 Rest ...

  7. HTML导航条的制作

    导航条的制作HTML代码:<nav> <ul> <li> <a href="#"></a> </li> &l ...

  8. vue 实现textarea展示时自动换行

    利用 v-html 展示 str.replace(/\n|\r\n/g, '<br>') 数据 完美解决

  9. JavaScript中的setTimeout、setInterval和随机函数制作简易抽奖小程序

    几乎所有计算机语言有都内置随机函数.当然这种随机,人们习惯称为伪随机数发生器,产生的是一个[0,1)之间的一个小数.再通过简单算术运算生成一个符合需求的整数.JS中通用公式通常为parseInt(Ma ...

  10. WinPE基础知识之头部

    1.DOS头 // DOS MZ头,大小为64个字节 typedef struct _IMAGE_DOS_HEADER { WORD e_magic; // EXE标志,“MZ”(有用,解析时作为是否 ...