WOJ 18 动态无向图
一开始我是不会写的,后来点开了题解:
无话可说……那就写吧……然而第一发跑成暴力分,后来加了一个优化:就是在询问里面提到过的边都不用再加了。
然后……然后就过了呀……
其实还有面向数据的编程的骚操作……既然卡过了那也没什么好说了。
以前的巨佬们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 动态无向图的更多相关文章
- 【转】Android IDA 动态调试最完善攻略,跨过各种坑
前提条件和运行环境一定要写清楚,不然会有很多坑,坑死人. (1)IDA 是最新的7.0版本 (2) JDB 使用Java安装目录下的 (3)系统是win10 使用命令窗口时有很大的差别 (4)手机是 ...
- Python如何动态的为对象添加方法或属性,__slots__用法
代码示例如下: import types #使用MethodType方法需要导入包 class test(object): #定义 一个test类,包含name属性和f()方法 def __i ...
- python 函数之day3
一 函数的语法及特性 什么是函数? 定义:函数是一个功能通过一组语句的集合,由名字(函数名)将其封装起来的代码块,要想执行这个函数,只要调用其函数名即可. 特性: 减少重复代码 使程序变的可扩展 使程 ...
- winserver2008 DNS 很详细
from http://www.it165.net/admin/html/201312/2182.html DNS(Domain Name System域名系统)区域化管理 分布式 层次性 域名空间结 ...
- 《构建高性能web站点》随笔 无处不在的性能问题
前言– 追寻大牛的足迹,无处不在的“性能”问题. 最近在读郭欣大牛的<构建高性能Web站点>,读完收益颇多.作者从HTTP.多级缓存.服务器并发策略.数据库.负载均衡.分布式文件系统多个方 ...
- asp.net(C#)页面事件顺序
asp.net(C#)页面事件顺序 http://www.cnblogs.com/henw/archive/2012/02/09/2343994.html 1 using System.Data; ...
- 第九章:四大组件之Broadcast Receiver
第九章:四大组件之Broadcast Receiver 一.广播的功能和特征 广播的生命周期很短,经过调用对象-->实现onReceive-->结束,整个过程就结束了.从实现的复杂度和 ...
- spring ioc 原理 spring aop原理
大家一直都说spring的IOC如何如何的强大,其实我倒觉得不是IOC如何的强大,说白了IOC其实也非常的简单.我们先从IOC说起,这个概念其实是从我们平常new一个对象的对立面来说的,我们平常使用对 ...
- Objective-c知识小结
1.创建一个类产生.h和.m两个文件,.h中对用到的变量.方法作声明,.m文件中实现,导入时只导入.h文件,如果直接把方法写在.m文件中,未在.h文件中进行声明,则是私有方法 2.@interfac ...
随机推荐
- 数论板子——来自Loi_black
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> usin ...
- 剑指offer--14.求1+2+3+...+n
&&短路原理 ------------------------------------------------------------------------------------- ...
- python3中zip()函数的用法
>>>a = [1,2,3] >>> b = [4,5,6] >>> c = [4,5,6,7,8] >>> zipped = ...
- Unity 5 官方打包管理工具 Asset Bundle Manager
http://blog.csdn.net/suifcd/article/details/51570003 Unity5在Asset bundle 打包管理上采用了全新的方式,不需要再对每个文件进行MD ...
- openfl更新2.0后,android输入法又不能输中文了
今天手贱更新了一下openfl,fd里面又各种报错.最伤心的是,之前修改MainView.java输入中文的方法现在居然失效了.还好这段时间研究c2dx,总算是能读能懂修改的那段代码,捣鼓了一下午,算 ...
- FastAdmin 中的 formatter flag 分析
FastAdmin 中的 formatter flag 分析 效果 首先看看效果,这里的文字和颜色可以根据数据改变. 这是系统自带的分类管理. 代码 功能在 \public\assets\js\bac ...
- git之clone
git clone 命令参数: usage: git clone [options] [--] <repo> [<dir>] -v, --verbose be more ver ...
- 最终还是选择了markdownpad2
markdownpad2使用 最终 哈哈,最后还是选择了markdownpad2,经过探索才知道这个玩意多么好用. 点击,下载. 碰到的问题 1.win10出现HTML无法渲染得对话框 结果是,官网有 ...
- 命令行启动MySQL
1 首先打开CMD,即命令行 输入mysqld ,如出现 则说明MySQL安装路径下的bin不在系统的环境变量中,你需要进入它的安装路径的bin目录下启动. ps:如果你不知道路径可以去开始菜单,找到 ...
- bzoj 4559 [JLoi2016]成绩比较——拉格朗日插值
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4559 关于拉格朗日插值,可以看这些博客: https://www.cnblogs.com/E ...