BZOJ 4086: [Sdoi2015]travel(SDOI2015 round2 day1)(分类讨论+容斥原理)
描述:给定一张图(n<1000,m<5000)求有多少点对u,v有不重复经过其他点,共经过k个点的路径。(k<=7)
这个做法应该不是正解吧。。顺便说下SDOI的几道题在BZ上都要卡常数真是哭瞎了QAQ
然后我们知道k这么小,考虑下每个k怎么乱搞吧。。。
k=2:直接枚举每条边就行啦
k=3:枚举中间点,然后再考虑两端端点O(m^2)
k=4:枚举两边的点,然后枚举边考虑中间的两个点是否联通O(m^2)
k=5:枚举夹在中间的两个点,然后记录所有可能的中间点数目tot,然后枚举外面的两点,若tot-两点是否为中间点>0那么就可行
k=6:思路大概相同,记链为x->u->p->q->v->y 枚举u,v记下所有可能的二元组p,q,记总数为tot,出现x的次数为Cx,然后在枚举x,y若tot-Cx-Cy+x,y是否为二元组>0,那么就可行
k=7:依旧是考虑容斥,记链为x->u->p->z->q->v->y,先记下对所有p,q中z的集合,然后枚举u,v,对中间的所有可行的三元组,记录总数为tot,x在两端出现次数为Cx,在中间次数为Mx
x在中,y在两端的次数为ESx,y;x,y都在两端的次数为Sx,y,再枚举x,y,若tot-Cx-Cy-Mx-My+MSx,y+MSy,x+Sx,y>0,那么可行
对于k<7的情况可以O(m^2)完成,K=7的情况有点难估计(O(M^2*N)大概吧)不过能过就对了
好啦好像很短但还是写了5KB左右,主要思路还是分情况讨论然后枚举端点上容斥啦
CODE:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define maxn 1010
#define maxm 5010
bool bo[maxn][maxn],b[maxn][maxn];
vector<int> e[maxn];
#define pb push_back
int n;
inline void task2(){
for (int i=;i<=n;i++)
for (int j=;j<e[i].size();j++) bo[i][e[i][j]]=;
}
inline void task3(){
for (int i=;i<=n;i++)
for (int j=;j<e[i].size();j++)
for (int k=j+;k<e[i].size();k++)
bo[e[i][j]][e[i][k]]=bo[e[i][k]][e[i][j]]=;
}
inline void task4(){
for (int i=;i<=n;i++)
for (int j=i+;j<=n;j++)
for (int k=;k<e[i].size();k++)
for (int l=;l<e[j].size();l++) {
int u=e[i][k],v=e[j][l];
if (u!=v&&u!=j&&v!=i&&b[u][v]) bo[i][j]=bo[j][i]=;
}
}
inline void task5(){
static int cnt[maxn][maxn];
memset(cnt,,sizeof(cnt));
for (int i=;i<=n;i++)
for (int j=;j<e[i].size();j++)
for (int k=j+;k<e[i].size();k++)
cnt[e[i][j]][e[i][k]]++,cnt[e[i][k]][e[i][j]]++;
for (int i=;i<=n;i++)
for (int j=i+;j<=n;j++)
for (int k=;k<e[i].size();k++)
for (int l=;l<e[j].size();l++){
if (i==j||e[i][k]==e[j][l]||e[i][k]==j||e[j][l]==i||cnt[i][j]-b[i][e[j][l]]-b[j][e[i][k]]<=) continue;
bo[e[i][k]][e[j][l]]=bo[e[j][l]][e[i][k]]=;
}
}
inline void task6(){
static int cnt[maxn],ti[maxn];
static int is[maxn][maxn];
static int L;
for (int i=;i<=n;i++)
for (int j=i+;j<=n;j++){
L++;
int tot=;
for (int k=;k<e[i].size();k++)
for (int l=;l<e[j].size();l++)
if (e[i][k]!=e[j][l]&&e[i][k]!=j&&e[j][l]!=i&&b[e[i][k]][e[j][l]]) {
if (ti[e[i][k]]!=L) ti[e[i][k]]=L,cnt[e[i][k]]=;
if (ti[e[j][l]]!=L) ti[e[j][l]]=L,cnt[e[j][l]]=;
cnt[e[i][k]]++,cnt[e[j][l]]++,tot++,is[e[i][k]][e[j][l]]=L;
}
for (int k=;k<e[i].size();k++)
for (int l=;l<e[j].size();l++) {
if (e[i][k]==e[j][l]||e[i][k]==j||e[j][l]==i||
tot-(ti[e[i][k]]==L?cnt[e[i][k]]:)-(ti[e[j][l]]==L?cnt[e[j][l]]:)+(is[e[i][k]][e[j][l]]==L)+(is[e[j][l]][e[i][k]]==L)<=) continue;
bo[e[i][k]][e[j][l]]=bo[e[j][l]][e[i][k]]=;
}
}
}
int L;
vector<int> id[maxn][maxn];
int is_cnt[maxn],cnt[maxn],ex[maxn][maxn],is_ex[maxn][maxn],mid[maxn],is_mid[maxn],side[maxn][maxn],is_side[maxn][maxn];
inline void addcnt(int x) {
if (is_cnt[x]!=L) is_cnt[x]=L,cnt[x]=;
cnt[x]++;
}inline void addmid(int x) {
if (is_mid[x]!=L) is_mid[x]=L,mid[x]=;
mid[x]++;
}inline void addex(int x,int y) {
if (is_ex[x][y]!=L) is_ex[x][y]=L,ex[x][y]=;
ex[x][y]++;
}inline void addside(int x,int y) {
if (is_side[x][y]!=L) is_side[x][y]=L,side[x][y]=;
side[x][y]++;
}
inline int quecnt(int x) {return is_cnt[x]==L?cnt[x]:;}
inline int quemid(int x) {return is_mid[x]==L?mid[x]:;}
inline int queex(int x,int y) {return is_ex[x][y]==L?ex[x][y]:;}
inline int queside(int x,int y) {return is_side[x][y]==L?side[x][y]:;}
inline void task7(){
for (int i=;i<=n;i++)
for (int j=;j<=n;j++) id[i][j].clear();
for (int i=;i<=n;i++)
for (int j=;j<e[i].size();j++)
for (int k=j+;k<e[i].size();k++){
id[e[i][j]][e[i][k]].pb(i);
id[e[i][k]][e[i][j]].pb(i);
}
for (int i=;i<=n;i++)
for (int j=i+;j<=n;j++){
L++;
int tot=;
for (int k=;k<e[i].size();k++)
for (int l=;l<e[j].size();l++) {
int u=e[i][k],v=e[j][l];
if (u==v||u==j||v==i) continue;
for (int r=;r<id[u][v].size();r++) {
int mid=id[u][v][r];
if (mid==i||mid==j) continue;
tot++,addcnt(u),addcnt(v);
addex(id[u][v][r],u);
addex(id[u][v][r],v);
addmid(id[u][v][r]);
addside(u,v);
}
}
for (int k=;k<e[i].size();k++)
for (int l=;l<e[j].size();l++) {
int u=e[i][k],v=e[j][l];
if (u==v||u==j||v==i||tot-quecnt(u)-quecnt(v)-quemid(u)-quemid(v)+queex(u,v)+queex(v,u)+queside(u,v)<=) continue;
bo[u][v]=bo[v][u]=;
}
}
}
int main(){
int T,m,k;
scanf("%d",&T);
while (T--) {
scanf("%d%d%d",&n,&m,&k);
for (int i=;i<=n;i++) e[i].clear();
memset(b,,sizeof(b));
memset(bo,,sizeof(bo));
for (int i=;i<=m;i++) {
int u,v;
scanf("%d%d",&u,&v);
if (u==v) continue;
if (b[u][v]) continue;
e[u].pb(v);e[v].pb(u);
b[u][v]=b[v][u]=;
}
if (k==) task2();
if (k==) task3();
if (k==) task4();
if (k==) task5();
if (k==) task6();
if (k==) task7();
for (int i=;i<=n;i++,puts(""))
for (int j=;j<=n;j++) putchar(bo[i][j]?'Y':'N');
}
return ;
}
BZOJ 4086: [Sdoi2015]travel(SDOI2015 round2 day1)(分类讨论+容斥原理)的更多相关文章
- BZOJ 1067 降雨量(RMQ-ST+有毒的分类讨论)
1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 4399 Solved: 1182 [Submit][Stat ...
- 枚举(分类讨论):BZOJ 1177: [Apio2009]Oil
1177: [Apio2009]Oil Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 1477 Solved: 589[Submit] Descri ...
- bzoj 3779 重组病毒 好题 LCT+dfn序+线段树分类讨论
题目大意 1.将x到当前根路径上的所有点染成一种新的颜色: 2.将x到当前根路径上的所有点染成一种新的颜色,并且把这个点设为新的根: 3.查询以x为根的子树中所有点权值的平均值. 分析 原题codec ...
- Codeforces 460D Little Victor and Set --分类讨论+构造
题意:从区间[L,R]中选取不多于k个数,使这些数异或和尽量小,输出最小异或和以及选取的那些数. 解法:分类讨论. 设选取k个数. 1. k=4的时候如果区间长度>=4且L是偶数,那么可以构造四 ...
- BZOJ-1067 降雨量 线段树+分类讨论
这道B题,刚的不行,各种碎点及其容易忽略,受不鸟了直接 1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2859 ...
- UVaLive 6862 Triples (数学+分类讨论)
题意:给定一个n和m,问你x^j + y^j = z^j 的数量有多少个,其中0 <= x <= y <= z <= m, j = 2, 3, 4, ... n. 析:是一个数 ...
- Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array 分类讨论连续递推dp
题意:给出一个 数列 和一个x 可以对数列一个连续的部分 每个数乘以x 问该序列可以达到的最大连续序列和是多少 思路: 不是所有区间题目都是线段树!!!!!! 这题其实是一个很简单的dp 使用的是分 ...
- 【cf789B】Masha and geometric depression(分类讨论/暴力)
B. Masha and geometric depression 题意 在黑板上写数列,首项是b,公比是q,超过l时就停止不写.给定m个数,遇到后跳过不写.问一共写多少个数,如果无穷个输出inf. ...
- P2331 [SCOI2005]最大子矩阵 (动规:分类讨论状态)
题目链接:传送门 题目: 题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 输入格式: 第一行为n,m,k( ...
随机推荐
- java 解析excel
2014年2月25日 14:24:48 解析excel方法 //首先是jar包下载,请自行百度 //代码 package cn.wuwenfu.excel; import java.io.File; ...
- CentOS6.5编译安装Redis
一.首先要检测是否安装gcc yum install gcc-c++ yum install -y tcl 进入redis目录 cd /usr/local/redis .编译安装 make make ...
- 在ubuntu中为navicat创建快捷方式
在ubuntu中,解压navicat并不会生成快捷方式,每次运行都需要进入软件解压的目录,然后运行命令开启navicat,十分不便.今天尝试引入快捷方式,直接双击运行,感觉挺不错. 首先下载一个合适的 ...
- 关于java sort的几种实现方式(单纯排序,按照bean的某一个字段,按照bean的多个字段)
最近的开发过程中遇到了,按照bean类中的多个字段进行排序的情况,借此机会把相关的排序做法,简单整理备份一下. 1.list的单纯排序 2.list元素为bean的情况,按照bean的某一个属性进行排 ...
- composer 安装和修改中国镜像
参考:http://docs.phpcomposer.com/00-intro.html#Using-Composer http://www.phpcomposer.com/ 下载安装 下载并且运行 ...
- 9.TCP:传输控制协议
1.TCP功能 TCP向应用层提供面向连接的.可靠的字节流服务.TCP可以认为是一个没有选择确认或否认的滑动窗口协议. TCP将用户数据打包构成报文段:它发送数据后启动一个定时器:另一 ...
- php模式设计之 策略模式
策略模式: 策略模式设计帮助构建的对象不必自身包含逻辑,而是能够根据需要利用其他对象中的算法. 使用场景: 例如有一个CD类,我们类存储了CD的信息. 原先的时候,我们在CD类中直接调用getCD方法 ...
- Selenium2(java)环境搭建 一
Selenium2(java)环境搭建 1.下载JDK http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2 ...
- 使用Eclipse开发及测试Spark的环境搭建及简单测试
一.下载专门开发的Scala的Eclipse 1.下载地址:http://scala-ide.org/download/sdk.html,或链接:http://pan.baidu.com/s/1hre ...
- 2017了,回家前 "年末" 分享:下雨,飘雪,红包雨,碰撞球,自定义View
(本博客为原创:http://www.cnblogs.com/linguanh/) 目录: 效果展示 感想 代码拆解 开源地址 效果展示 有没有兴趣继续看下去,直接看下"颜值"是第 ...