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{\frac{m}{32}}$时,取得最优复杂度$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;
}

  

时间: 2024-10-11 22:54:53

BZOJ3346 : Ural1811 Dual Sim Phone的相关文章

android - 单双SIM卡设置

[问题] 状态栏中显示双卡卡槽图标,但实际机器只是单卡卡槽. DSDS:Dual SIM dual standy,即双卡双待; DSDA:Dual SIM dual active,即双卡双通 [解决过程] 在Android目录下全局搜索 persist.radio.multisim.config $grep -r "persist.radio.multisim.config" 找到default.prop文件,找到persist.radio.multisim.config的定义 #se

android双待手机获取每一张SIM卡的imei

/** * create a TelephonyInfo.java class */import java.lang.reflect.Method; import android.content.Context;import android.telephony.TelephonyManager; public final class TelephonyInfo { private static TelephonyInfo telephonyInfo;private String imeiSIM1

腾讯优测优分享干货精选| Android双卡双待适配——隐藏在数据库中的那些秘密

腾讯优测是专业的app自动化测试平台,除了提供兼容性测试,远程真机租用等多维度的测试服务,还有优分享-腾讯内部的移动研发测试干货精选~ 许多APP都希望获取用户通讯录联系人,利用通讯录关系链信息来丰富产品功能.在读取系统联系人数据库的ContentProvider时,对于双卡双待手机,电话和短信数据都需要标识来自哪张卡. Android 5.0开始加入Dual Sim支持,Android 官方方案和mtk的方案十分类似,感兴趣的小伙伴可以直接移步mtk方案实现方式. 双卡数据库适配流程 根据系统

一个简单的appium脚本

这是一个简单的appium脚本,测试amazon购物过程的,过程包括搜索商品,然后从结果列表中选取中意的商品,然后加入购物车,等等. 它是一个最原始的脚本,对测试元素.数据.报告等未作任何的封装,后面计划把它合并到现有的webdriver的web测试框架里去. 运行中终于到的问题: 1.genymotion模拟器上执行有点延迟,脚本命令发出后大概3秒模拟器上才有反应: 2.在输入搜索条件后,执行回车命令,执行的效果是退格键(backspace),百撕不得骑姐啊: 3.再就是非原生对象的识别了,比

【phonearena】来自亚洲的怪兽:便宜得不可思议的魅族M1 Note

Monsters from Asia: the incomprehensibly cheap Meizu Blue Charm Note (M1 Note) 来自亚洲的怪兽:便宜得不可思议的魅族M1 Note A month from now it'll be a full year since the first entry in our fortnightly Monsters from Asia column, but, so far, we've been mainly focused 

Android 4.4 Kitkat Phone工作流程浅析(九)__状态通知流程分析

本文来自http://blog.csdn.net/yihongyuelan 转载请务必注明出处 本文代码以MTK平台Android 4.4为分析对象,与Google原生AOSP有些许差异,请读者知悉. 前置文章: <Android 4.4 Kitkat Phone工作流程浅析(一)__概要和学习计划> <Android 4.4 Kitkat Phone工作流程浅析(二)__UI结构分析> <Android 4.4 Kitkat Phone工作流程浅析(三)__MO(去电)流程

Qualcomm NV配置

Modifications to the hardware MBN might be necessary to match the specific hardware design. The hardware MBN contains NV 4398(UIM Select Default USIM Application) and NV 70210 (UIM HW Config), which configure many GPIO mappings.Verify that they are s

sendBroadcastAsUser——Calling a method in the system process

4.2中Android加入了多用户 改换这几种调用方式 public void startActivityAsUser(Intent intent, UserHandle user); public void sendBroadcastAsUser(Intent intent, UserHandle user); public ComponentName startServiceAsUser(Intent service, UserHandle user); public boolean sto

oracle 中的dual表

Dual表是每个数据库创建时默认生成的,该表仅有一列一行. 1)分析dual表执行,如下: 2)应用: 在oracle数据库中,dual表作为一个虚表存在的,因为oracle的查询操作语句必须满足格式:select columnname from tablename,其中的from所指向的表示必须的,所以某些非查询操作可以通过dual表来实现,如: --查看当前日期: Select sysdate from dual ; --计算等式: Select 3*3 – 3 as result, 8-9