一开始我是不会写的,后来点开了题解:

无话可说……那就写吧……然而第一发跑成暴力分,后来加了一个优化:就是在询问里面提到过的边都不用再加了。

然后……然后就过了呀……

其实还有面向数据的编程的骚操作……既然卡过了那也没什么好说了。

以前的巨佬们Orz

Code:

#include <cstdio>
#include <cstring>
using namespace std; const int N = ;
const int M = 8e5 + ; int n, m, qn, tot = , head[N], ans = ;
int pCnt = , id[N], idCnt = , ufs[N], cnt[N][N];
bool ex[N][N], men[N][N], vis[N]; struct Edge {
int to, nxt;
} e[M]; inline void add(int from, int to) {
e[++tot].to = to;
e[tot].nxt = head[from];
head[from] = tot;
} struct Pathway {
int u, v;
} path[M]; struct Query {
int type, u, v;
} q[M]; inline void read(int &X) {
X = ;
char ch = ;
int op = ;
for(; ch > '' || ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} inline void init() {
for(int i = ; i <= n; i++) ufs[i] = i;
} int find(int x) {
return x == ufs[x] ? x : ufs[x] = find(ufs[x]);
} inline void merge(int x, int y) {
int fx = find(x), fy = find(y);
if(ufs[fx] != fy) ufs[fx] = fy;
} void dfs(int x) {
vis[x] = ;
for(int i = head[x]; i; i = e[i].nxt) {
int y = e[i].to;
if(!ex[x][y]) continue;
if(vis[y]) continue;
dfs(y);
}
} inline void reCnt() {
ans = ;
for(int i = ; i <= idCnt; i++) vis[i] = ;
for(int i = ; i <= idCnt; i++)
if(!vis[i]) {
ans++;
dfs(i);
}
} inline void addEdge(int p) {
int u = id[find(q[p].u)], v = id[find(q[p].v)];
cnt[u][v]++, cnt[v][u]++;
if(!ex[u][v]) {
ex[u][v] = ex[v][u] = ;
add(u, v), add(v, u);
} // reCnt();
} inline void delEdge(int p) {
int u = id[find(q[p].u)], v = id[find(q[p].v)];
cnt[u][v]--, cnt[v][u]--;
if(!cnt[u][v] && !cnt[v][u])
ex[u][v] = ex[v][u] = ; // reCnt();
} inline void query(int p) {
reCnt();
printf("%d\n", ans);
} int main() {
read(n), read(m);
for(int i = ; i <= m; i++)
read(path[i].u), read(path[i].v);
read(qn);
for(int i = ; i <= qn; i++) {
char op[];
scanf("%s", op);
if(op[] == 'l') {
q[i].type = , read(q[i].u), read(q[i].v);
men[q[i].u][q[i].v] = men[q[i].v][q[i].u] = ;
}
if(op[] == 'c') {
q[i].type = ;
read(q[i].u), read(q[i].v);
men[q[i].u][q[i].v] = men[q[i].v][q[i].u] = ;
}
if(op[] == 'q') q[i].type = ;
} init();
for(int i = ; i <= m; i++) {
if(men[path[i].u][path[i].v]) continue;
merge(path[i].u, path[i].v);
}
for(int i = ; i <= n; i++) {
int nowf = find(i);
if(!vis[nowf]) vis[nowf] = , id[nowf] = ++idCnt;
} /* for(int i = 1; i <= n; i++)
printf("%d ", id[find(i)]);
printf("\n"); */ for(int i = ; i <= m; i++) {
if(!men[path[i].u][path[i].v]) continue;
int x = id[find(path[i].u)], y = id[find(path[i].v)];
add(x, y), add(y, x);
ex[x][y] = ex[y][x] = ;
cnt[x][y]++, cnt[y][x]++;
} // reCnt();
for(int i = ; i <= qn; i++) {
if(q[i].type == ) addEdge(i);
if(q[i].type == ) delEdge(i);
if(q[i].type == ) query(i);
} return ;
}

WOJ 18 动态无向图的更多相关文章

  1. 【转】Android IDA 动态调试最完善攻略,跨过各种坑

    前提条件和运行环境一定要写清楚,不然会有很多坑,坑死人. (1)IDA 是最新的7.0版本  (2) JDB 使用Java安装目录下的 (3)系统是win10 使用命令窗口时有很大的差别 (4)手机是 ...

  2. Python如何动态的为对象添加方法或属性,__slots__用法

    代码示例如下: import types    #使用MethodType方法需要导入包 class test(object):  #定义 一个test类,包含name属性和f()方法 def __i ...

  3. python 函数之day3

    一 函数的语法及特性 什么是函数? 定义:函数是一个功能通过一组语句的集合,由名字(函数名)将其封装起来的代码块,要想执行这个函数,只要调用其函数名即可. 特性: 减少重复代码 使程序变的可扩展 使程 ...

  4. winserver2008 DNS 很详细

    from http://www.it165.net/admin/html/201312/2182.html DNS(Domain Name System域名系统)区域化管理 分布式 层次性 域名空间结 ...

  5. 《构建高性能web站点》随笔 无处不在的性能问题

    前言– 追寻大牛的足迹,无处不在的“性能”问题. 最近在读郭欣大牛的<构建高性能Web站点>,读完收益颇多.作者从HTTP.多级缓存.服务器并发策略.数据库.负载均衡.分布式文件系统多个方 ...

  6. asp.net(C#)页面事件顺序

    asp.net(C#)页面事件顺序 http://www.cnblogs.com/henw/archive/2012/02/09/2343994.html   1 using System.Data; ...

  7. 第九章:四大组件之Broadcast Receiver

    第九章:四大组件之Broadcast Receiver   一.广播的功能和特征 广播的生命周期很短,经过调用对象-->实现onReceive-->结束,整个过程就结束了.从实现的复杂度和 ...

  8. spring ioc 原理 spring aop原理

    大家一直都说spring的IOC如何如何的强大,其实我倒觉得不是IOC如何的强大,说白了IOC其实也非常的简单.我们先从IOC说起,这个概念其实是从我们平常new一个对象的对立面来说的,我们平常使用对 ...

  9. Objective-c知识小结

    1.创建一个类产生.h和.m两个文件,.h中对用到的变量.方法作声明,.m文件中实现,导入时只导入.h文件,如果直接把方法写在.m文件中,未在.h文件中进行声明,则是私有方法  2.@interfac ...

随机推荐

  1. 2018.7.19 AK22 续集

    话说上次坏机检查没有找到问题,后来我们联合软件工程师一起分析原因 ------------------------ 在线调试: MCU在内部晶振模式下:初始化正常,功能函数正常,切换到外部晶振12M后 ...

  2. javascript网页复制功能-复制到粘贴板-兼容多数浏览器(不使用flash)

    使用方法:clipBordCopy("hello Copy");//执行后复制hello Copy到粘贴板 通过 var result = clipBordCopy("h ...

  3. CERC2016 爵士之旅 Jazz Journey

    传送门(洛谷) 题目大意 给定$n$个位置,和一个长为$m$的序列$A$,你需要经过一条直接的边从第$A_i$个位置到第$A_{i+1}$个位置. 每条有向边$(u,v)$分为两种,第一种可以花费$C ...

  4. BZOJ5341: [Ctsc2018]暴力写挂

    BZOJ5341: [Ctsc2018]暴力写挂 https://lydsy.com/JudgeOnline/problem.php?id=5341 分析: 学习边分治. 感觉边分治在多数情况下都能用 ...

  5. 调整 WiFi 驱动设置让 WiFi 信号更稳定

    调整 WiFi 驱动设置让 WiFi 信号更稳定 修改 WiFi 驱动中 的设置,将 Power Saving Mode 的值改为 CAM.

  6. BZOJ2724:[Violet 6]蒲公英

    浅谈分块:https://www.cnblogs.com/AKMer/p/10369816.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?i ...

  7. BZOJ2120:数颜色(分块版)

    浅谈分块:https://www.cnblogs.com/AKMer/p/10369816.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?i ...

  8. Visualforce Page超链接

    Salesforce开发者文档:https://developer.salesforce.com/docs/atlas.en-us.pages.meta/pages/pages_quick_start ...

  9. springboot或者jetty等启动服务器后,如何去停止这个服务

    首先在win7下找到运行,但是win7的运行不像XP那么好找,win7运行的位置在:开始→所有程序→附件→运行.   然后在对话框中,输入cmd(大小写均可).   然后是如何查看80端口的方法,一般 ...

  10. spring学习十三

    1: RESTful URL : 域和端口 / servlet / 资源 / 参数id 2:  静态资源访问处理? 采用RESTful架构后,需要将web.xml中控制器拦截的请求设置为/,这样会将c ...