小w的魔术扑克(树状数组+并查集)
时间:2019-10-30
本文章向大家介绍小w的魔术扑克(树状数组+并查集),主要包括小w的魔术扑克(树状数组+并查集)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目链接:(https://ac.nowcoder.com/acm/contest/1100/C)
满分做法:
将正反两面连边,发现如果一个连通块的变数>=n条时,那么这个连通块一定能满足保证每个面值都能够被提供至少一次。如果它是一棵树,无论怎么调整,都会漏掉一个面值无法打出。
于是最后询问的就是一个线段中是否包含一个完整的限制线段(他的起点为一棵树中编号最小的,终点为最大的),这个可以用离线树状数组解决,把询问线段和限制线段按照右端点从小到大排序。
一次处理询问,把右端点小于此询问线段右端点的限制线段加到树状数组中(在左端点+1),当区间和为0时可以满足条件,不为0则不能打出。
#include<queue>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxm=1e5+7;
int n,k,q;
int f[maxm],bian[maxm],dian[maxm],maxx[maxm],minn[maxm];
int c[maxm];
bool ans[maxm];
int find(int x)
{
if(x!=f[x])
f[x]=find(f[x]);
return f[x];
}
int lowbit(int x)
{
return x&(-x);
}
void add(int x)
{
for(;x<=n;x+=lowbit(x))
c[x]+=1;
}
int ask(int x)
{
int ans=0;
for(;x;x-=lowbit(x))
ans+=c[x];
return ans;
}
struct node
{
int l,r,id;
bool operator <(const node &s) const
{
return r<s.r;
}
}qwq[maxm],qaq[maxm];
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
f[i]=i;
bian[i]=0;
dian[i]=1;
maxx[i]=i;
minn[i]=i;
}
for(int i=1;i<=k;i++)
{
int x,y;
scanf("%d%d",&x,&y);
int fx=find(x);
int fy=find(y);
if(fx==fy)
{
bian[fx]++;
continue;
}
if(fx!=fy)
{
f[fx]=fy;
dian[fy]+=dian[fx];
bian[fy]+=bian[fx]+1;
dian[fx]=bian[fx]=0;
maxx[fy]=max(maxx[fy],maxx[fx]);
minn[fy]=min(minn[fy],minn[fx]);
}
}
int tot=0;
for(int i=1;i<=n;i++)
{
if(dian[i]==bian[i]+1)//一个点也是一棵树
{
qwq[++tot].l=minn[i];
qwq[tot].r=maxx[i];
}
}
scanf("%d",&q);
for(int i=1;i<=q;i++)
{
int x,y;
scanf("%d%d",&x,&y);
qaq[i].l=x,qaq[i].r=y,qaq[i].id=i;
}
sort(qwq+1,qwq+tot+1);
sort(qaq+1,qaq+q+1);
int top=1;
for(int i=1;i<=q;i++)
{
while(top<=tot&&qwq[top].r<=qaq[i].r)
{
add(qwq[top].l);
top++;
}
if(ask(qaq[i].r)-ask(qaq[i].l-1))//有完整线段
ans[qaq[i].id]=1;
}
for(int i=1;i<=q;i++)
{
if(ans[i])
printf("No\n");
else
printf("Yes\n");
}
return 0;
}
原文地址:https://www.cnblogs.com/lihan123/p/11764764.html
- android之service
- aFinal框架
- 朴素贝叶斯模型(NBM)详解与在Matlab和Python里的具体应用
- android客户端和服务端js交互
- 【实验手册】使用Visual Studio Code 开发.NET Core应用程序
- android调用服务端的js
- 保存数据返回后可以继续编辑
- 深度学习Matlab工具箱代码详解概览
- android读取sd卡图片并进行缩放操作
- 深度学习Matlab工具箱代码注释之cnnapplygrads.m
- android异步操作
- 深度学习Matlab工具箱代码注释之cnnbp.m
- 仿大众点评悬浮购买框效果
- 深度学习Matlab工具箱代码注释之cnnff.m
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- linux socket通讯获取本地的源端口号的实现方法
- 初识centos7与centos6的区别整理(内核、命令等)
- Apache下通过shell脚本提交网站404死链的方法
- centos查找已安装的jdk路径的方法
- CentOS7+apache+php7+mysql5.7配置教程详解
- 如何利用SystemTap统计函数执行耗时详解
- 关于安装linux redhat后无法使用yum命令安装gcc-c++问题的解决过程
- 基于代码的自动化和无代码自动化
- Java Stream中map和flatMap方法
- 关于Apache shiro实现一个账户同一时刻只有一个人登录(shiro 单点登录)
- 视频上云安防视频云服务平台EasyCVR通过海康sdk协议接入多路设备拉流时出现部分设备拉流不稳定是什么原因?
- Centos6.x服务器配置jdk+tomcat+mysql环境(jsp+mysql)
- Linux的压缩和解压缩的方法总结
- RTSP/GB28181/HIKSDK/Ehome协议视频融合平台EasyCVR编译C++报参见“XXX”的声明错误
- 详解 Linux 常用目录的作用