HDOJ4467 ( 分块 思想 )
题目:链接: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 ( 分块 思想 )的更多相关文章
- Codeforces Round #319 (Div. 1)C. Points on Plane 分块思想
C. Points on Plane On a pl ...
- ZOJ 1654 Place the Robots建图思维(分块思想)+二分匹配
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=654 AC一百道水题,不如AC一道难题来的舒服. 题意:一个n*m地图 ...
- PAT1057 stack(分块思想)
1057 Stack (30分) Stack is one of the most fundamental data structures, which is based on the princ ...
- HDOJ 4858 项目管理 ( 只是有点 莫队的分块思想在里面而已啦 )
题目: 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4858 题意: 我们建造了一个大项目!这个项目有n个节点,用很多边连接起来,并且这个项目是连通的! ...
- 莫队算法 sqrt(n)分块思想
在此说一下本渣对莫队算法思想的一些浅薄理解 莫队算法的思想就是对真个区间的分块,然后按照每块来分别进行计算,这样最终的复杂度可以达到n*sqrt(n) 小Z的袜子是一道非常经典的题目.:题目链接htt ...
- [BZOJ 2957]楼房重建(THU2013集训)(分块思想)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2957 分析: 首先明确问题,对于每栋楼房的斜率K=H/X,问题就是问有多少个楼房的K比前面所有 ...
- hdu_5110_Alexandra and COS(DP+分块思想)
题目连接:hdu_5110_Alexandra and COS 题意: 给你一个图,X代表宝藏,然后有一个船,它的声纳的频率为D,定船到宝藏的距离为Dis=max(abs(x1-x2),abs(y1- ...
- hdu_5085_Counting problem(莫队分块思想)
题目连接:hdu_5085_Counting problem 题意:给你一个计算公式,然后给你一个区间,问这个区间内满足条件的数有多少个 题解:由于这个公式比较特殊,具有可加性,我们考虑讲一个数分为两 ...
- 牛客小白月赛12 H(dfs序+线段树),F(分块思想+bit),J(二分)
H 华华和月月种树 链接:https://ac.nowcoder.com/acm/contest/392/H 思路:先得到整棵树最终的形态,在这棵树上进行三种操作,用dfs跑下,第二种操作就直接对最终 ...
随机推荐
- Equations HDU - 1496(哈希的应用)
Problem Description Consider equations having the following form: a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 a, b ...
- 对Python中print函数参数的认识
输出函数是最常用的,对print()参数的准确认识尤为重要. sep='':sep参数表示函数中不同value的分隔符,默认为一个空格. end='':end参数表示函数结尾的处理,默认换行. 例如: ...
- 【数据结构】P1449 后缀表达式
[题目链接] https://www.luogu.org/problem/P1449 [题目描述] 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符 ...
- GoLang语言环境搭建及idea集成开发(超详细)
一.所需安装包(windows) 1. https://golang.org/dl/ 下载 MSI installer.不会翻墙的自己找国内下载,双击运行,按照提示安装即可.环境变量自动配置 2.i ...
- C#数字前补0
[TestMethod] public void Test8() { ; string b = string.Format("{0:000000}", a); , '); }
- 怎样理解ECMAScript 和 JavaScript的关系
JavaScript可以分为三大部分: 1. 核心语法 2. DOM 3. BOM 而核心语法实际上就是指的ECMAScript, 而JS又是不断在发展的, 而这个发展实际上最主要的就是ECMAScr ...
- hdu 1269 入手强连通
思路待整理 #include<cstdio> #include<iostream> #include<cstring> #include<vector> ...
- Java并发(思维导图)【待评估、删除】
1, 2, 3,常用函数 Semaphore import java.util.concurrent.Semaphore;Semaphore name=new Semaphore(n); name.a ...
- C#/.net 通过js调用系统相机进行拍照,图片无损压缩后进行二维码识别
这两天撸了一个需求,通过 JS 调用手机后置相机,进行拍照扫码.前台实现调用手机相机,然后截取图片并上传到后台的功能.后台接收传过来的图片后,通过调用开源二维码识别库 ZXing 进行二维码数据解析 ...
- angularJs同步请求
今天在写几级联动的时候,因为比如上一个接口请求数据成功返回后,才能根据上一个接口返回的数据请求下一个接口,以此类推:因此有了同步请求的想法. 在前端做同步读取显然不是好的实践做法,同步之后会严重影响前 ...