hihocoder Round #c1(hihoCoder太阁最新面经算法竞赛1 )
Test链接:https://cn.vjudge.net/contest/231849
A:区间求差
给一组区间集合A和区间集合B,求A-B的长度
思路:
首先进行离散化,对每个点进行标号处理,对于A中的每个区间,用树状数组把离散化后的A中的每个区域标记。
对于B的每个区间,用另一个树状数组标记。
这里对点i标记,等价于标记线段[i-1, i](i为离散化后的标号)
之后对每个点查询是否在A中标记,在B中未标记,那就是A-B的子区间,加上这个点表示的线段长度即可。
时间复杂度O(nlog(n))
#include<bits/stdc++.h>
#define lowbit(x) ((x)&(-x))
using namespace std;
typedef long long ll;
const int maxn = 1e6 + ;
int a[maxn], b[maxn];
int tree_a[maxn], tree_b[maxn];
bool vis[maxn];
int tot2;
int sum(int x, int a[])
{
int ret = ;
while(x <= tot2)
{
ret += a[x];
x += lowbit(x);
}
return ret;
}
//向前修改[0, x]整个区间加上d
void add(int x, int d, int a[])
{
while(x > )
{
a[x] += d;
x -= lowbit(x);
}
} int main()
{
int n, m;
scanf("%d%d", &n, &m);
int tot = * n + * m, tot1 = * n;
for(int i = ; i <= tot1; i++)scanf("%d", &a[i]);
for(int i = tot1 + ; i <= tot; i++)scanf("%d", &a[i]);
memcpy(b, a, sizeof(a));
sort(b + , b + tot + );
tot2 = unique(b + , b + tot + ) - (b + );
//for(int i = 1; i <= tot2)
for(int i = ; i <= tot1; i += )
{
int x = lower_bound(b + , b + tot2 + , a[i]) - b;
int y = lower_bound(b + , b + tot2 + , a[i + ]) - b;
add(x, -, tree_a);
add(y, , tree_a);
}
for(int i = tot1 + ; i <= tot; i += )
{
int x = lower_bound(b + , b + tot2 + , a[i]) - b;
int y = lower_bound(b + , b + tot2 + , a[i + ]) - b;
add(x, -, tree_b);
add(y, , tree_b);
}
ll ans = ;
for(int i = ; i <= tot2; i++)
{
if(sum(i, tree_a) > && sum(i, tree_b) == )
{
//cout<<i<<endl;
ans += b[i] - b[i - ];
}
}
cout<<ans<<endl;
return ;
}
B:股票价格
动态模拟下列操作
P x y x时刻股票价格为y
R x 清除x之前的所有股票价格信息
Q 输出目前已知的最大 最小 最近股票价格(不包括删除的股票)
保证P x y中的时刻x为升序
思路:
用queue动态保存x和y,每次入队更新最大值,最小值,最新值,在Q操作时直接输出即可
对于删除操作,由于给的x是升序,所以可以直接利用队列的pop操作。
但是,删除之后,要更新最大值最小值,所以用set和map存储目前在队列中的x值,以及出现的次数,每加入和删除一个数字的时候更新set和map,删除操作完成后,更新最大值最小值(此时要保证队列中还有数字,如果没有,要将这两个数重新初始化)
#include<bits/stdc++.h>
#define lowbit(x) ((x)&(-x))
using namespace std;
typedef long long ll;
struct node
{
int a, b;
node(){}
node(int a, int b):a(a), b(b){}
};
set<int>s;
map<int, int>Map;
queue<node>q;
int main()
{
int n, x, y;
cin >> n;
int Max = -, Min = 1e9+, last;
char a[];
while(n--)
{
scanf("%s", a);
if(a[] == 'P')
{
scanf("%d%d", &x, &y);
q.push(node(x, y));
Max = max(Max, y);
Min = min(Min, y);
last = y;
Map[y]++;
s.insert(y);
}
else if(a[] == 'Q')
{
printf("%d %d %d\n", Max, Min, last);
}
else if(a[] == 'R')
{
scanf("%d", &x);
while(q.front().a <= x)
{
y = q.front().b;
q.pop();
Map[y]--;
if(Map[y] == )s.erase(s.find(y));
}
if(s.size())
{
Min = *s.begin();
set<int>::iterator it = s.end();
it--;
Max = *it;
}
else
{
Max = -, Min = 1e9 + ;
}
}
}
return ;
}
C:穿越禁区
给出一个矩形区域,以及多个圆的信息(圆心在矩形内),判断能否从矩形左侧到达矩形右侧,不和圆进行接触。
思路:
如果不能到达右侧,说明中间被一群圆挡住了,过不去。
此时肯定有圆和矩形底端接触,也有圆和矩形顶部接触。(如果没有,就可以沿着矩形边缘到达右侧,所以一定存在)
如果中间被一群圆档住了过不去,等价于和底部接触的圆通过中间的圆连接,可以和顶部接触的圆接触。
在输入时记录与底部接触的圆的下标和顶部接触的圆的下标。
之后对每两个圆进行连接,如果两圆相交,这两个圆就连通,用并查集加入连通分量。
最后判断是否存在一个底部的圆和顶部的某个圆在同一个连通分量内,如果存在,就说明不可以通过,否则就可以通过。
在判断圆相交的时候注意long long,这里用平方判断的,需要long long
#include<bits/stdc++.h>
#define lowbit(x) ((x)&(-x))
using namespace std;
typedef long long ll;
struct node
{
ll x, y, r;
}a[];
ll low[], high[];
ll p[];
ll Find(ll x)
{
return p[x] == x ? x : p[x] = Find(p[x]);
}
bool judge(ll i, ll j)
{
ll t = (a[i].x - a[j].x) * (a[i].x - a[j].x) + (a[i].y - a[j].y) * (a[i].y - a[j].y);
ll c = a[i].r + a[j].r;
return c * c >= t;
}
int main()
{
ll T, w, h, n;
cin >> T;
while(T--)
{
cin >> w >> h >> n;
ll tot1 = , tot2 = , flag = ;
for(int i = ; i <= n; i++)p[i] = i;
for(int i = ; i < n; i++)
{
scanf("%lld%lld%lld", &a[i].x, &a[i].y, &a[i].r);
if(a[i].y <= a[i].r)
{
low[tot1++] = i;
}
if(h - a[i].y <= a[i].r)
{
high[tot2++] = i;
}
if(tot1 && tot2 && low[tot1 - ] == high[tot2 - ])
{
flag = ;
}
}
if(!flag)
{
for(int i = ; i < n; i++)
{
for(int j = i + ; j < n; j++)
{
if(judge(i, j))
{
//cout<<i<<" "<<j<<endl;
ll x = Find(i), y = Find(j);
p[x] = y;
}
}
}
for(int i = ; i < tot1; i++)
{
for(int j = ; j < tot2; j++)
{
if(Find(low[i]) == Find(high[j]))
{
flag = ;
break;
}
}
if(flag)break;
}
}
if(flag)cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
return ;
}
hihocoder Round #c1(hihoCoder太阁最新面经算法竞赛1 )的更多相关文章
- Hihocoder 太阁最新面经算法竞赛18
Hihocoder 太阁最新面经算法竞赛18 source: https://hihocoder.com/contest/hihointerview27/problems 题目1 : Big Plus ...
- hihoCoder太阁最新面经算法竞赛15
hihoCoder太阁最新面经算法竞赛15 Link: http://hihocoder.com/contest/hihointerview24 题目1 : Boarding Passes 时间限制: ...
- hihoCoder太阁最新面经算法竞赛19
比赛链接:http://hihocoder.com/contest/hihointerview28/problems A. 固定一个方向,两两相邻的点顺时针或逆时针构造三个向量,判断这个点在这个向量的 ...
- hihoCoder太阁最新面经算法竞赛18
比赛链接:http://hihocoder.com/contest/hihointerview27/problems A.Big Plus 模拟水 #include <bits/stdc++.h ...
- hihoCoder太阁最新面经算法竞赛17
比赛链接:http://hihocoder.com/contest/hihointerview26 A.排序后枚举两个点,确定一个矩形后二分剩下两个点. #include <bits/stdc+ ...
- [HIHO]hihoCoder太阁最新面经算法竞赛7
题目链接:http://hihocoder.com/contest/hihointerview12 期末完事了,终于有时间成套刷题了.这套题比较简单,难度上感觉和上一套差不多.除了最后一个题是看了讨论 ...
- zz 圣诞丨太阁所有的免费算法视频资料整理
首发于 太阁实验室 关注专栏 写文章 圣诞丨太阁所有的免费算法视频资料整理 Ray Cao· 12 小时前 感谢大家一年以来对太阁实验室的支持,我们特地整理了在过去一年中我们所有的原创算法 ...
- hihoCoder 1467 2-SAT·hihoCoder音乐节(2-SAT模版)
#1467 : 2-SAT·hihoCoder音乐节 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 hihoCoder音乐节由hihoCoder赞助商大力主办,邀请了众 ...
- 【hihocoder 1122】二分图二•二分图最大匹配之匈牙利算法
[Link]:https://hihocoder.com/problemset/problem/1122 [Description] [Solution] 二分图匹配,匈牙利算法模板题; 这里我先把染 ...
随机推荐
- 结合after使用content
结合after或before伪类,在元素的开头或结尾附加上一定的内容,content:""的引号中即是添加的内容,比如说我们这么写: <div>学而时习之不亦说乎< ...
- WinForm通过操作注册表实现限制软件使用次数的方法
1.创建注册表文件: 打开记事本,输入一些内容: ? 1 2 3 REGEDIT4 [HKEY_CURRENT_USER/Software/MyRegDataApp] "UseTime&qu ...
- 使用jQuery和CSS3制作数字时钟(jQuery篇) 附源码下载
HTML 和上一篇文章:使用jQuery和CSS3制作数字时钟(CSS3篇)一样的HTML结构,只是多了个>date用来展示日期和星期的. <div id="clock" ...
- 撩课-Web大前端每天5道面试题-Day23
1.为什么用Nodejs,它有哪些优缺点? 优点: 事件驱动,通过闭包很容易实现客户端的生命活期. 不用担心多线程,锁,并行计算的问题 V8引擎速度非常快 对于游戏来说,写一遍游戏逻辑代码,前端后端通 ...
- Session和Cookie的区别与联系
一. 概念理解 你可能有留意到当你浏览网页时,会有一些推送消息,大多数是你最近留意过的同类东西,比如你想买桌子,上淘宝搜了一下,结果连着几天会有各种各样的桌子的链接.这是因为 你浏览某个网页的时候,W ...
- 求N的因子之和。
理论依据: 代码: /* 显然,数据够大的时候,数组要用 __int64 */ #include<iostream> #include<map> #include<cst ...
- C#设计模式--代理模式(学习Learning hard 设计模式笔记)
class Program { static void Main(string[] args) { //创建一个代理对象 并发出请求 Person proxy = new Friend(); prox ...
- autofac初识
在开始autofac时,有必要先了解两个关键词:“控制反转(IoC/Inverse Of Control)”与“依赖注入(DI/Dependence injection)”. 控制反转(IoC):它把 ...
- Vue如何使用动态刷新Echarts组件
这次给大家带来Vue如何使用动态刷新Echarts组件,Vue使用动态刷新Echarts组件的注意事项有哪些,下面就是实战案例,一起来看一下. 需求背景:dashboard作为目前企业中后台产品的“门 ...
- PHPCMS V9 fsockopen 函数被禁用解决方案
PHPCMS V9 fsockopen 禁用解决方案, 把fsockopen 替换成 pfsockopen 替换文件:phpsso_server/api/uc_client_1_5/client.ph ...