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( ...
随机推荐
- IOS即时通讯XMPP搭建openfire服务器 分类: ios技术 2015-03-07 11:30 53人阅读 评论(0) 收藏
一.下载并安装openfire 1.到http://www.igniterealtime.org/downloads/index.jsp下载最新openfire for mac版 比如:Openfir ...
- 结合实际项目分析pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- UVa 374 - Big Mod
题目大意:计算R = BP mod M,根据模运算的性质计算. 正常计算会超时,可以用分治的思想降低时间复杂度.不过如果遇到00,结果...话说00的结果是1吗?忘了都... #include < ...
- access 随机选取数据
access随机读取数时 用order by rnd(id) 发现每次获取的数据顺序都是一致的,必须要加上随机数才可以,如下: Random r = new Random(); ...
- centos6.6-------DHCP服务配置
一.为一个单一的网段提供地址服务 软件包: dhcp配置文件: /etc/dhcp/dhcpd.conf租约文件: /var/lib/dhcpd/dhcpd.leases监听端口: ...
- 创建 Web 前端开发环境(node和npm以及git)
Web 前端开发涉及多种工具,这里将常用工具的安装和配置进行说明,提供了详细的说明,为后继的开发创建一个坚实的基础. 本文介绍的工具有:NodeJS, NPM, Bower, Git 和 Grunt. ...
- IOS 程序图标添加数字
+(void)setAppIconNumber:(NSInteger)num{ if ([UIParam getIOSVersion]>8.0) { UIUserNotificationSett ...
- 2.1. 托管对象模型是什么(Core Data 应用程序实践指南)
托管对象模型是一种数据结构.在这里,数据结构.纲要.对象图.数据模型.托管对象模型这些术语是一个意思.它们是对同一个东西不同场景的描述.比如,对Core Data 而言是托管对象模型,对设计器来说是对 ...
- --@ui-router--登录页通过路由跳转到内页的demo
今天还是来说一下angular中的路由模块.我们实际项目中,各个页面的切换是经常会与Auth相关的.比如我网站的后台,是需要登录过的用户才能进去,那么我们用angularJS做前端路由的时候应该怎么完 ...
- SimpleDateFormat解析的时候字符串过长问题
竟然不会报错: try { SimpleDateFormat dateFormatFrom = new SimpleDateFormat("yyyyMMddHHmmss"); St ...