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 ...
随机推荐
- Nhibernate系列学习之(三) Criteria查询表达式增删改查
Criteria查询表达式: 正如我们所见,Expression对查询语句的表达式进行了封装和限制,下表列出了Expression所有的方法,以及每个方法所对应的查询表达式及其限制. Restrict ...
- 4.MySQL优化---多表查询优化
整理自互联网 一.多表查询连接的选择: 相信这内连接,左连接什么的大家都比较熟悉了,当然还有左外连接什么的,基本用不上我就不贴出来了.这图只是让大家回忆一下,各种连接查询. 然后要告诉大家的是,需要 ...
- sql server 纵横表的转换
在平常的工作中或者面试中,我们可能有遇到过数据库的纵横表的转换问题.今天我们就来讨论下. 1.创建表 首先我们来创建一张表. sql语句: --1. 创建数据表 if OBJECT_ID('Score ...
- Equation
You are given an equation: Ax2 + Bx + C = 0. Your task is to find the number of distinct roots of th ...
- asp.net 打印控件使用方法
打印的效果及控制性虽然不是很好,但是也能勉强使用,应付一般的打印还是 可以的了.代码如下所示: 代码 复制代码 代码如下: //调用PrintControl.ExecWB(?,?)实现直接打印和打印预 ...
- linux内核图形配置疑难解决
配置linux内核是遇到的问题:(1)问题一make gconfig * * Unable to find the GTK+ installation. Please make sure that * ...
- java文本文件读写
java的IO系统中读写文件使用的是Reader和Writer两个抽象类,Reader中的read()和close()方法是抽象方法,Writer中的write().flush()和close()方法 ...
- laravel的小坑
写控制器的名的时候只能出现一个首写大写字母, 后面的都为小写字母 否则会报找不到该控制器的错误
- Network(lca暴力)
Network Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/65536K (Java/Other) Total Submi ...
- Hybrid App混合模式移动应用开发(AngularJS+Cordova+Ionic)
以前公司开发了某手机APP是通过jquerymobile来实现的,发现它对手机上的原生设备无能为力.于是在下一个项目到来之际,通过筛选最终决定使用cordova+Ionic.看起来简单,但是因为他们各 ...