BZOJ3346 : Ural1811 Dual Sim Phone
首先将边进行去重,那么有$n\geq\sqrt{m}$。
然后二分答案,转化为判定是否存在两个点它们的出边集合的并集为全集。
那么这两个点必然满足$deg_x+deg_y\geq n$。
不妨设$deg_x\geq deg_y$,那么有$deg_x\times 2\geq n$。
考虑枚举$x$,最多只会有$O(\frac{m}{n})$个$x$。
再枚举$y$,有两种判定算法:
$1.$设$f[i][j]$表示$i$是否没有指向$j$,那么只要存在$f[x][j]\ and\ f[y][j]=true$即不可行。
可以压位计算,时间复杂度$O(\frac{nm}{32})$。
$2.$枚举$y$的所有出边,通过时间戳判定是否出现在$x$中。
时间复杂度$O(\frac{m^2}{n})$。
设$S$为阈值,当$n\leq S$时用算法1,否则用算法2,则有$\frac{Sm}{32}\leq\frac{m^2}{S}$。
当$S$取$\sqrt{32m}$时,取得最优复杂度$O(m\sqrt{\frac{m}{32}})$。
总时间复杂度$O(m\log m\sqrt{\frac{m}{32}})$。
#include<cstdio>
#include<algorithm>
const int N=10005,M=100010;
int n,m,U,i,j,k,a[M],st[N],en[N],d[N],v[N],t,l,r,mid,ans;
unsigned int f[2048][64];
struct E{int x,y,z;}e[M];
inline bool cmp(const E&a,const E&b){
if(a.x!=b.x)return a.x<b.x;
if(a.y!=b.y)return a.y<b.y;
return a.z<b.z;
}
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
bool check(int mid){
if(n>2048){
for(i=0;i<n;i++){
d[i]=0;
for(j=st[i];j<en[i];j++)if(e[j].z<=mid)d[i]++;
}
for(i=0;i<n;i++)v[i]=-1;
for(i=0;i<n;i++)if(d[i]*2>=n){
for(k=st[i];k<en[i];k++)if(e[k].z<=mid)v[e[k].y]=i;
for(j=0;j<n;j++)if(d[i]+d[j]>=n&&d[i]>=d[j]){
t=d[i];
for(k=st[j];k<en[j];k++)if(e[k].z<=mid&&v[e[k].y]<i)t++;
if(t==n)return 1;
}
}
}else{
for(i=0;i<n;i++){
for(j=0;j<U;j++)f[i][j]=~0U;
f[i][U]=0;
for(j=U<<5;j<n;j++)f[i][j>>5]|=1U<<(j&31);
}
for(i=0;i<n;i++){
d[i]=0;
for(j=st[i];j<en[i];j++)if(e[j].z<=mid)d[i]++,f[i][e[j].y>>5]^=1U<<(e[j].y&31);
}
for(i=0;i<n;i++)if(d[i]*2>=n){
for(j=0;j<n;j++)if(d[i]+d[j]>=n&&d[i]>=d[j]){
t=1;
for(k=0;k<=U;k++)if(f[i][k]&f[j][k]){t=0;break;}
if(t)return 1;
}
}
}
return 0;
}
int main(){
read(n),read(m);U=(n-1)>>5;
for(i=1;i<=m;i++){
read(e[i].x),read(e[i].y),read(e[i].z);
e[i].x--,e[i].y--;
}
std::sort(e+1,e+m+1,cmp);
for(i=1;i<=m;i++)if(i==1||e[i].x!=e[i-1].x||e[i].y!=e[i-1].y)e[++j]=e[i];
for(m=j,i=1;i<=m;i++)a[i]=e[i].z;
std::sort(a+1,a+m+1);
for(i=0,j=1;i<n;i++){
st[i]=j;
while(j<=m&&e[j].x==i)j++;
en[i]=j;
}
l=1,r=m;
while(l<=r)if(check(a[mid=(l+r)>>1]))r=(ans=mid)-1;else l=mid+1;
if(!ans)puts("No solution");else printf("%d",a[ans]);
return 0;
}
BZOJ3346 : Ural1811 Dual Sim Phone的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- android双待手机获取每一张SIM卡的imei
/** * create a TelephonyInfo.java class */import java.lang.reflect.Method; import android.content.Co ...
- 重度使用示波器进行优化分析——一个DSDA项目回顾
这是若干年前一个项目,最近有时间整理一下.回忆起来,印象最深刻的就是重度使用示波器辅助分析,进行优化. 项目背景是在原有项目3G+项目基础上,增加一颗2G+ Modem,使支持DSDA功能. 在介绍D ...
- 腾讯优测干货精选|Android双卡双待适配——隐藏在数据库中的那些秘密
腾讯优测是专业的app自动化测试平台,除了提供兼容性测试,远程真机租用等多维度的测试服务,还有优分享-腾讯内部的移动研发测试干货精选~ 许多APP都希望获取用户通讯录联系人,利用通讯录关系链信息来丰富 ...
- 将helps.php或者functions.php直接进行了加载
TP3系列中functions.php文件默认其实是空文件,很好找.我们可以直接封装代码. Laravel5系列中的path/vendor/laravel/framework/src/Illumina ...
- 一个简单的appium脚本
这是一个简单的appium脚本,测试amazon购物过程的,过程包括搜索商品,然后从结果列表中选取中意的商品,然后加入购物车,等等. 它是一个最原始的脚本,对测试元素.数据.报告等未作任何的封装,后面 ...
- ZEN_CART_如何添加自定义页面
按照下面的路径,添加自己的文件,就OK了 以about us页面为例, 默认模板 \includes\templates\template_default\templates\tpl_about_us ...
- Ultimate Guide to WhatsApp for Business 2019
By Iaroslav Kudritskiy (Source: https://rocketbots.io/blog/the-ultimate-guide-to-whatsapp-business-a ...
- 重度使用示波器进行优化分析——一个DSDA项目回顾
这是若干年前一个项目,最近有时间整理一下.回忆起来,印象最深刻的就是重度使用示波器辅助分析,进行优化. 项目背景是在原有项目3G+项目基础上,增加一颗2G+ Modem,使支持DSDA功能. 在介绍D ...
随机推荐
- 比较 http连接 vs socket连接
http连接 :短连接,客户端,服务器三次握手建立连接,服务器响应返回信息,连接关闭,一次性的socket连接:长连接,客户端,服务器三次握手建立连接不中断(通过ip地址端口号定位进程)及时通讯,客户 ...
- ios添加百度地图方法
Hello BaiduMapiOS SDK 引入头文件 引入静态库文件 引入系统framework 引入mapapi.bundle资源文件 初始化BMKMapManager 创建BMKMapView ...
- Linux C程序内存空间
linux下内存空间布置: 一个典型的Linux C程序内存空间由如下几部分组成: 代码段(.text).这里存放的是CPU要执行的指令.代码段是可共享的,相同的代码在内存中只会有一个拷贝,同时这个段 ...
- CocoaPods安装和使用教程(转摘)
Code4App 原创文章.转载请注明出处:http://code4app.com/article/cocoapods-install-usage 目录 CocoaPods是什么? 如何下载和安装Co ...
- golang exec Command
package mainimport ( "fmt" "log" "os/exec")func main() { out, err := e ...
- [译] EXTENDING JQUERY – 2.2 A simple plugin
2.2 一个简单的插件示例 jQuery 插件能做任何事情,这个已经由浩如烟海的各类第三方插件如证明.小到只影响一个元素,大到改变多个元素的外观和行为,jQuery 的各种功能等你来扩展. 2.2.1 ...
- hdu 1404 找sg ***
HDU 1404 Digital Deletions 一串由0~9组成的数字,可以进行两个操作:1.把其中一个数变为比它小的数:2.把其中一个数字0及其右边的所以数字删除. 两人轮流进行操作,最后把 ...
- 【rqnoj39】 饮食问题
题目描述 Bessie 正在减肥,所以她规定每天不能吃超过 C (10 <= C <= 35,000)卡路里的食物.农民 John 在戏弄她,在她面前放了B (1 <= B < ...
- ubuntu14使用qemu调试linux内核
# 下载内核源代码编译内核 cd ~/LinuxKernel/ wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.x ...
- Java学习随笔1:Java是值传递还是引用传递?
Java always passes arguments by value NOT by reference. Let me explain this through an example: publ ...