https://vjudge.net/problem/HDU-4467

大概就是,设一个块大小T

对于度数<=T的点,设为1类点,在改变颜色的时候暴力查询与其相邻点,更新答案

对于度数>T的点,设为2类点,分别维护与其相邻的颜色为0/1的点之间的边权和(记录与每个点相连的所有2类点,然后在任意点(注意2类点也要)改变颜色时维护一下与其相连2类点的这个值),改变颜色的时候根据维护的值O(1)可以计算出对答案的修改

说的再简单一点,1类点由自身去更新其他,2类点由其他去更新自身。。复杂度很容易发现是根号级别的(T=sqrt(m))

但是要注意,重边一定要去。。。不然可以被卡到$n^2$

错误记录:

1.没有在改变2类点颜色时改变相连其他2类点维护的值

2.没有去重边

3.d[a],d[b]和a,b没有极其仔细地区分

 //#pragma GCC optimize(3)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<set>
#include<map>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
#define N 100000
struct E
{
int to,nxt;ll d;
}e[*N+];
int f1[N+],ne;
int TT,n,m,mm,d[N+];
int in[N+],sz,q;
//1类点:in[i]<=sz;2类点:in[i]>sz
ll a1[N+][];
//a1[i][j]:i为2类点,i与相邻的颜色为j的点之间的所有边的权值和
//int num[100100];
char tmp[];
vector<int> ss[N+];//ss[i]:i点到相邻的2类点的边
ll ans[];//ans[0]:00边答案;ans[1]:11边答案;ans[2]:01边答案
map<pii,pii> ma;
ll &gg(int a,int b)
{
if(a==&&b==) return ans[];
if(a==&&b==) return ans[];
return ans[];
}
int main()
{
int a,b,c,i,k;pii t;
while(scanf("%d%d",&n,&m)==)
{
TT++;mm=;//num[0]=0;
memset(f1,,sizeof(f1));ne=;ma.clear();
memset(in,,sizeof(in));ans[]=ans[]=ans[]=;
memset(a1,,sizeof(a1));
for(i=;i<=n;i++) scanf("%d",&d[i]);
for(i=;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(a>b) swap(a,b);
if(ma.count(mp(a,b)))
{
t=ma[mp(a,b)];
e[t.fi].d+=c;e[t.se].d+=c;
}
else
{
e[++ne].to=b;e[ne].nxt=f1[a];f1[a]=ne;e[ne].d=c;
e[++ne].to=a;e[ne].nxt=f1[b];f1[b]=ne;e[ne].d=c;
in[a]++;in[b]++;
ma[mp(a,b)]=mp(ne-,ne);mm++;
}
gg(d[a],d[b])+=c;
}
sz=sqrt(*mm);
for(i=;i<=n;i++)
if(in[i]>sz)
{
//num[++num[0]]=i;
for(k=f1[i];k;k=e[k].nxt)
a1[i][d[e[k].to]]+=e[k].d;
}
for(i=;i<=n;i++)
{
ss[i].clear();
for(k=f1[i];k;k=e[k].nxt)
if(in[e[k].to]>sz)
ss[i].pb(k);
}
scanf("%d",&q);
printf("Case %d:\n",TT);
while(q--)
{
scanf("%s",tmp);
if(tmp[]=='A')
{
scanf("%d%d",&a,&b);
printf("%lld\n",gg(a,b));
}
else
{
scanf("%d",&a);
if(in[a]<=sz)
{
for(k=f1[a];k;k=e[k].nxt)
{
b=e[k].to;
gg(d[a],d[b])-=e[k].d;
if(in[b]>sz) a1[b][d[a]]-=e[k].d;
}
d[a]^=;
for(k=f1[a];k;k=e[k].nxt)
{
b=e[k].to;
gg(d[a],d[b])+=e[k].d;
if(in[b]>sz) a1[b][d[a]]+=e[k].d;
}
}
else
{
for(i=;i<ss[a].size();i++)
a1[e[ss[a][i]].to][d[a]]-=e[ss[a][i]].d;
gg(d[a],)-=a1[a][];gg(d[a],)-=a1[a][];
d[a]^=;
gg(d[a],)+=a1[a][];gg(d[a],)+=a1[a][];
for(i=;i<ss[a].size();i++)
a1[e[ss[a][i]].to][d[a]]+=e[ss[a][i]].d;
}
}
}
}
return ;
}

Graph HDU - 4467的更多相关文章

  1. hdu 4467 Graph

    P. T. Tigris is a student currently studying graph theory. One day, when he was studying hard, GS ap ...

  2. HDU 4467 Graph(图论+暴力)(2012 Asia Chengdu Regional Contest)

    Description P. T. Tigris is a student currently studying graph theory. One day, when he was studying ...

  3. HDU 4467 分块

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4467 题意:给定n个点m条边的无向图,点被染色(黑0/白1),边带边权.然后q个询问.询问分为两种: ...

  4. Bipartite Graph hdu 5313 bitset 并查集 二分图

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5313 题意: 给出n个顶点,m条边,问最多添加多少条边使之构成一个完全二分图 存储结构: bitset   ...

  5. The Shortest Path in Nya Graph HDU - 4725

    Problem Description This is a very easy problem, your task is just calculate el camino mas corto en ...

  6. B - Rikka with Graph HDU - 5631 (并查集+思维)

    As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some mat ...

  7. AC日记——The Shortest Path in Nya Graph hdu 4725

    4725 思路: 拆点建图跑最短路: 代码: #include <cstdio> #include <cstring> #include <iostream> #i ...

  8. Rikka with Graph hdu 6090

    题解:考虑贪心地一条一条边添加进去. 当 m \leq n-1m≤n−1 时,我们需要最小化距离为 nn 的点对数,所以肯定是连出一个大小为 m+1m+1 的联通块,剩下的点都是孤立点.在这个联通块中 ...

  9. 7.11 NOI模拟赛 graph 生成函数 dp 多项式

    LINK:graph HDU题库里的原题 没做过自闭. 考虑dp 设\(f_{i,j}\)表示前i个点构成j个联通块是树的方案数. 对于一次询问答案即为\(\sum_{j}f_{n,j}j^k\) 考 ...

随机推荐

  1. MTK 手机芯片 2014 Roadmap

    注:其中 A53 架构的是 64 位处理器. MT6733 魅蓝 MT6752 魅族 note 联通/移动版 MT6595 魅族 MX4

  2. 三张图教你生成一个Android jar 库。

    我看到非常多教人使用第三方开源组件的Android教程.都是在教基于源代码project的库导入,个人觉得非常不妥,觉得最恰当的方式是把源代码project生成一个jar再导入到目标project上使 ...

  3. 记一次OGG数据写入HBase的丢失数据原因分析

    一.现象二.原因排查2.1 SparkStreaming程序排查2.2 Kafka数据验证2.3 查看OGG源码2.3.1 生成Kafka消息类2.3.2 Kafka配置类2.3.3 Kafka 消息 ...

  4. strong and weak 强引用和弱引用的差别

    (weak和strong)不同的是 当一个对象不再有strong类型的指针指向它的时候 它会被释放  ,即使还有weak型指针指向它. 一旦最后一个strong型指针离去 .这个对象将被释放,全部剩余 ...

  5. 使用Mock.js进行独立于后端的前端开发

    Mockjs能做什么? 基于 数据模板 生成模拟数据. 基于 HTML模板 生成模拟数据. 拦截并模拟 ajax 请求. 能解决的问题 开发时,前后端进度不同步,后端还没完成数据输出,前端只好写静态模 ...

  6. redis03----集合 set 相关命令

    集合 set 相关命令 集合的性质: 唯一性,无序性,确定性 注: 在string和link的命令中,可以通过range 来访问string中的某几个字符或某几个元素 但,因为集合的无序性,无法通过下 ...

  7. mysql优化-------Myisam与innodb引擎,索引文件的区别

    Myisam与innodb引擎,索引文件的区别: innodb的次索引指向对主键的引用. myisam的次索引和主索引都指向物理行. myisam一行一行的插入,会产生一行一行的文件,磁盘上有数据文件 ...

  8. HDU3746 Cyclic Nacklace —— KMP 最小循环节

    题目链接:https://vjudge.net/problem/HDU-3746 Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others)    M ...

  9. Linux下配置rsync服务器

    一.简介 rsync是一个远程数据同步工具,可以快速同步多台主机间的文件.Rsync使用所谓的“Rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都 ...

  10. YTU 2422: C语言习题 n个数逆序

    2422: C语言习题 n个数逆序 时间限制: 1 Sec  内存限制: 128 MB 提交: 150  解决: 96 题目描述 将n(n<20)个数按输入时顺序的逆序排列,用函数实现. 输入 ...