Online Judge:NOIP2016十连测第一场 T2

Label:暴力,Bitset

题目描述

在美丽的比特镇一共有n个景区,编号依次为1n,它们之间通过若干条双向道路连接。

Byteasar 慕名来到了比特镇旅游,不过由于昂贵的门票费,他只能负担起 4 个景区的门票费。他可以在任意景区开始游览,然后结束在任意景区。

Byteasar 的旅游习惯比较特殊,一旦他路过了一个景区,他就一定会进去参观,并且他永远不会参观同一个景区两次。所以他想知道,有多少种可行的旅游路线,使得他可以恰好参观 4 个景区呢?即,有多少条简单路径恰好经过了 4 个点。

输入

第一行包含两个整数n,表示景区的总数。

2至第n+1行,每行一个长度为n01字符串,第i+1行第j个字符为0表示ij之间没有道路,为1表示有一条道路。

输入数据保证\((i,j)\)的连接情况等于\((j,i)\)的连接情况,且\((i,i)\)恒为0。

输出

输出一行一个整数,即可行的路线总数。

样例

Input

4
0101
1010
0101
1010

Output

8

说明/提示

8 条路线分别为:

1->2->3->4,4->3->2->1,

2->3->4->1,1->4->3->2,

3->4->1->2,2->1->4->3,

4->1->2->3,3->2->1->4。

对于40%数据,\(n<=50\)

对于70%数据,\(n<=300\)

对于100%数据,\(n<=1500\)

题解

40pts

\(O(N^4)\)枚举四个点。

70pts

\(O(N^3)\)。

考虑枚举中间两个点\(p2,p3\),现在要找到符合条件的对数{\(p1,p4\)}。需要满足的条件是这四个点两两都不相同。

设\(cnt[i]\)表示与i直接连通的点的个数(就是字符串中含1个数),\(same[i][j]\)表示与i,j都直接相连的点的个数(就是两个字符串对应位都为1的位数)。

那么上面的符合条件的对数{\(p1,p4\)}就是\((cnt[p2]-1)*(cnt[p3]-1)-same[p2][p3]\)。都减一是因为\(p2,p3\)互相相连,新选的\(p1,p4\)不能跟这两个重了。

上面的枚举是\(O(N^2)\)的,预处理\(same[][]\)是\(O(N^3)\)的。

100pts

主要瓶颈在于\(same[][]\)的预处理,其实预处理的时候就马上想到用\(Bitset\)去优化常数,快速得到这个值,但是考试的时候觉得应该有\(N^2\)解法,结果Claris的正解就是这东西???。

所以利用\(Bitset\)二进制存储,计算两者与运算结果中1的个数。

复杂度为\(O(\frac{n^3}{64})\),对于n<=1500的数据没问题。

#include<bits/stdc++.h>
using namespace std;
const int N=1510;
int n,cnt[N];
bitset<N>a[N];
int main(){
scanf("%d",&n);
register int i,j;char c;
for(i=1;i<=n;i++)for(j=1;j<=n;j++){
c=getchar();
while(c!='0'&&c!='1')c=getchar();
a[i][j]=c-'0';
cnt[i]+=c-'0';
}
long long ans=0;
for(i=1;i<=n;i++)for(j=i+1;j<=n;j++)if(a[i][j]==1){
ans+=1ll*(cnt[i]-1)*(cnt[j]-1)-1ll*(a[i]&a[j]).count();
}
printf("%lld\n",ans<<1);
}

END

整理一下\(Bitset\)的用法。参考博客->

定义/初始化

<>中填的类似数组大小,后面可以开成单个变量,也可以开成一个数组。

bitset<LEN>a;
bitset<2333>b[N];

初始化大概有如下几种方式。

 #include<bits/stdc++.h>
using namespace std;
int main(){
freopen("test.out","w",stdout);
//用string(似乎只能包含01,不然运行时会报错)
bitset<10>a (string("11011"));
cout<<"#1:"<<a<<endl; //用整数(转为二进制)
a=123;
cout<<"#2:"<<a<<endl; //直接像数组那样赋值(下标从0开始,长度为10)
for(int i=0;i<=9;i++){
int o;scanf("%d",&o);//测试时输入1 0 1 0 0 0 1 1 0 1
a[i]=o;
}
cout<<"#3:"<<a<<endl;
}

输出结果

#1:0000011011
#2:0001111011
#3:1011000101

运算操作

\(Bitset\)支持所有位运算。包括异或^、或|、与&、左移<<、右移>>等。

常用函数

查询类

1.返回1的个数

a.count();

2.返回是否有1

a.any();

操作类

3.全部变成1

a.set();

4.将右数第\(i+1\)位变成1(实际上就是将二进制的第i位变成1,下标从0开始)

a.set(i);
//例: a.set(2) 0000000100

5.全部变为0(()中间填数字时指定某一位,同上)

a.reset();

6.取反(()中间填数字时指定某一位,同上)

a.flip();

至于常数优化是多少,好像跟机器位数有关(32/64)。

比特镇旅游(Tourist Attractions)【暴力+Bitset 附Bitset用法】的更多相关文章

  1. [CSP-S模拟测试]:Tourist Attractions(简单图论+bitset)

    题目描述 在美丽的比特镇一共有$n$个景区,编号依次为$1$到$n$,它们之间通过若干条双向道路连接.$Byteasar$慕名来到了比特镇旅游,不过由于昂贵的门票费,他只能负担起$4$个景区的门票费. ...

  2. csp-s模拟48,49 Tourist Attractions,养花,画作题解

    题面:https://www.cnblogs.com/Juve/articles/11569010.html Tourist Attractions: 暴力当然是dfs四层 优化一下,固定两个点,答案 ...

  3. [JSOI2010]连通数 (dfs或tarjan或bitset)+bitset学习

    题目描述 输入格式 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i行第j列的1表示顶点i到j有边,0则表示无边. 输出格式 输出一行一个整数,表示该图的连通数. 样例 样 ...

  4. 【JZOJ4857】Tourist Attractions(Bitset)

    题意:给定一个n个点的无向图,求这个图中有多少条长度为4的简单路径. n<=1500 思路: #include<map> #include<set> #include&l ...

  5. D. 旅游景点 Tourist Attractions 状压DP

    题目描述 FGD想从成都去上海旅游.在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情.经过这些城市的顺序不是完全随意的,比如说FGD 不希望在刚吃过一顿大餐之后立刻去下一 ...

  6. 旅游景点 Tourist Attractions 题解

    题面在这里 再次破了纪录,连做了3天... 让我们从头来一点一点分析 1.预处理 先看题面,乍一看貌似是个图论题,有n个点m条边,给定一些必须经过的点和强制经过顺序,求一条最短路 我们发现n和m都比较 ...

  7. 牛客网提高组模拟赛第七场 T3 洞穴(附bitset介绍)

    就是DP. 我们可以很简单的想到要枚举中间点,进行边数的转移. 但是因为边长数据范围很大,所以我们考虑log的倍增. 状态设计为\(dp[i][j][k]\),为从节点\(i\)走\(2^k\)步能否 ...

  8. 比特镇步行(Walk)【虚点+bfs+dfs】

    Online Judge:NOIP2016十连测第一场 T3 Label:虚点,bfs,dfs 题目描述 说明/提示 对于100%数据,\(n<=200000\),\(m<=300000\ ...

  9. LYDSY模拟赛day1 Tourist Attractions

    /* 假设路径是 a − b − c − d,考虑枚举中间这条边 b − c,计 算有多少可行的 a 和 d. 设 degx 表示点 x 的度数,那么边 b − c 对答案的贡献为 (degb − 1 ...

随机推荐

  1. 关于OpenLiveWriter出错的修补方法

    OpenLiveWriter使用一段时间后可能会打不开,提示错误如下: 这是只需要把电脑的.net更新到4.6以上版本就可以了.

  2. Windows taskkill

    TASKKILL [/S system [/U username [/P [password]]]]         { [/FI filter] [/PID processid | /IM imag ...

  3. Bootstrap FileInput.js + springmvc uploadFile

    下载FileInput.js          http://plugins.krajee.com/file-input/demo     https://github.com/kartik-v/bo ...

  4. spring 家族

    spring家族:spring.springMVC .springBoots springCloud

  5. iOS开发之SceneKit框架--SCNNode.h

    1.SCNNode简介 SCNNode是场景图的结构元素,表示3D坐标空间中的位置和变换,您可以将模型,灯光,相机或其他可显示内容附加到该元素.也可以对其做动画. 2.相关API简介 初始化方法 // ...

  6. LGP5495 Dirichlet 前缀和

    题目 不是很明白为什么要叫做模板 考虑到\(a_i\)能对\(b_j\)产生贡献,当且仅当\(a_i=\prod p_k^{a_k},b_j=\prod p_k^{b_k},\forall k \ a ...

  7. C#窗体代码相关笔记

    获取ComboBox下拉列表的所有选项值 ArrayList al = new ArrayList(); foreach (string item in this.comboBox2.Items) { ...

  8. 2019-6-23-天河2-程序-version-GLIBCXX_3.4.21-not-found-解决方法

    title author date CreateTime categories 天河2 程序 version GLIBCXX_3.4.21 not found 解决方法 lindexi 2019-06 ...

  9. Kill- Linux必学的60个命令

    1.作用 kill命令用来中止一个进程. 2.格式 kill [ -s signal | -p ] [ -a ] pid ... kill -l [ signal ] 3.参数 -s:指定发送的信号. ...

  10. BZOJ1096 [ZJOI2007]仓库建设——斜率优化

    方程: $\Large f(i)=min(f(j)+\sum\limits_{k=j+1}^{i}(x_i-x_k)*p_k)+c_i$ 显然这样的方程复杂度为$O(n^3)$极限爆炸,所以我们要换一 ...