题目:链接: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. Windows32位或64位下载安装配置Scala

    [学习笔记] Windows 32位或64位下载安装配置Scala: 1)下载地址:http://www.scala-lang.org/download/,看我的spark那节,要求scala是2.1 ...

  2. (十)springMvc 校验

    目录 文章目录 目录 @[toc] springMvc 校验 准备 踩坑 配置校验器 将校验器注入到适配器中 在 pojo 中配置校验规则 在 controller 层进行检验 获取错误信息 将错误信 ...

  3. Python re 模块findall() 函数返回值展现方式详解

    findall 函数: 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表. 注意: match 和 search 是匹配一次 findall 匹配所有,mat ...

  4. 最新精仿Chinaz中国站长网整站源码带全部数据带采集功能

    用范围: 站长网源码演示地址:php源码运行环境:  phpChinaz站长网对于广大站长来说,是不会陌生的,现在几乎成为了每个站长都必须上的网站了.这次分享的是Chinaz站长网的源码,包含了chi ...

  5. 关于greenlet的一些问题

    今天测试关于协程方面的代码发现我安装了greenlet模块缺导入不进.如图: 后来找了半天才发现原来greenlet被整进了gevent包中,如下导入就可以成功: 但这个greenlet没有了swit ...

  6. Java打包

    打成jar包 如果你使用的是maven来管理项目,执行以下命令既可以 cd 项目跟目录(和pom.xml同级)mvn clean package## 或者执行下面的命令## 排除测试代码后进行打包mv ...

  7. k8s之网络插件flannel及基于Calico的网络策略

    1.k8s网络通信 a.容器间通信:同一个pod内的多个容器间的通信,通过lo即可实现; b.pod之间的通信:pod ip <---> pod ip,pod和pod之间不经过任何转换即可 ...

  8. Java浅拷贝与深拷贝(思维导图)

    图1 拷贝思维导图(点击查看图片) 1,拷贝 有两个相同属性的对象A和B,A拥有初始化值,将其值拷贝到B中,使得B拥有与A“相同”数据的属性!注意这里的相同我有加双引号! 相同可能表示这么几个意思:① ...

  9. 高性能网站建设之 MS Sql Server数据库分区

    什么是数据库分区?数据库分区是一种对表的横向分割,Sql server 2005企业版和之后的Sql server版本才提供这种技术,这种对表的横向分割不同于2000中的表分割,它对访问用户是透明的, ...

  10. 【css】display:flex和display:box有什么区别

    说法一: 注意:前者是flex 2012年的语法,也将是以后标准的语法,大部分浏览器已经实现了无前缀版本.后者是2009年的语法,已经过时,是需要加上对应前缀的.所以兼容性的代码,大致如下displa ...