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 ...
随机推荐
- 20165210 Java第九周学习总结
20165210 Java第九周学习总结 教材学习内容 - 第十三章学习总结 URL类: URL的构造方法: try { URL url = new URL("http://www.goog ...
- UVA - 11754 Code Feat (分块+中国剩余定理)
对于一个正整数N,给出C组限制条件,每组限制条件为N%X[i]∈{Y1,Y2,Y3,...,Yk[i]},求满足条件的前S小的N. 这道题很容易想到用中国剩余定理,然后用求第k小集合的方法输出答案.但 ...
- BZOJ- 3142:数列 (数学)
题意:给出N,K,M,P.求有多少长度为K的序列A,满足:(1)首项为正整数:(2)递增数列:(3)相邻两项的差小于等于m:(4)最后一个数小于等于N. 思路:根据差分来算数量. #include&l ...
- 让人蛋疼的“Oracle.DataAccess.dll”
项目介绍:为前台网站提供rest接口来操作erp相关数据 涉及db:oracle11 技术方案:因为erp是用remoting来调用,我想rest实现部分调用remoting来操作减少耦合,当然性能上 ...
- 用javascript实现base64编码器以及图片的base64编码
前面的话 base-64作为常见的编码函数,在基本认证.摘要认证以及一些HTTP扩展中得到了大量应用.在前端领域,也常常把图片转换为base-64编码在网络中传输.本文将详细介绍base64的原理及用 ...
- Operating System-进程/线程内部通信-管程(Monitor)介绍,实现以及应用
本文主要内容: 管程(Monitor)介绍 管程实现 管程应用 一.管程(Monitor)介绍 1.1 管程 前一篇文章介绍了信号量以及使用,信号量已经提供了一个方便且高效的进程同步机制,但是信号量有 ...
- BZOJ4358:permu
浅谈\(K-D\) \(Tree\):https://www.cnblogs.com/AKMer/p/10387266.html 题目传送门:https://lydsy.com/JudgeOnline ...
- Python 函数之定义函数
在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号: 然后,在缩进块中编写函数体,函数的返回值用return语句返回. 1.定义一个函数 def myfirst( ...
- Azure上每个VM多个IP地址
Azure的每个VM都有多种IP地址,包括DIP.VIP和PIP.具体如下: DIP地址是在VM里能够看到的IP地址,即私网地址:PIP地址是这个VM关联的公网IP地址,即公网地址:VIP地址是负载均 ...
- Java基础--读写文件
Java读写文件需要注意异常的处理,下面是一个例子 写文件 public class WriteFile { public static void write(String file, String ...