Test链接:https://cn.vjudge.net/contest/231849

选自hihoCoder太阁最新面经算法竞赛1

更多Test:传送门

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 )的更多相关文章

  1. Hihocoder 太阁最新面经算法竞赛18

    Hihocoder 太阁最新面经算法竞赛18 source: https://hihocoder.com/contest/hihointerview27/problems 题目1 : Big Plus ...

  2. hihoCoder太阁最新面经算法竞赛15

    hihoCoder太阁最新面经算法竞赛15 Link: http://hihocoder.com/contest/hihointerview24 题目1 : Boarding Passes 时间限制: ...

  3. hihoCoder太阁最新面经算法竞赛19

    比赛链接:http://hihocoder.com/contest/hihointerview28/problems A. 固定一个方向,两两相邻的点顺时针或逆时针构造三个向量,判断这个点在这个向量的 ...

  4. hihoCoder太阁最新面经算法竞赛18

    比赛链接:http://hihocoder.com/contest/hihointerview27/problems A.Big Plus 模拟水 #include <bits/stdc++.h ...

  5. hihoCoder太阁最新面经算法竞赛17

    比赛链接:http://hihocoder.com/contest/hihointerview26 A.排序后枚举两个点,确定一个矩形后二分剩下两个点. #include <bits/stdc+ ...

  6. [HIHO]hihoCoder太阁最新面经算法竞赛7

    题目链接:http://hihocoder.com/contest/hihointerview12 期末完事了,终于有时间成套刷题了.这套题比较简单,难度上感觉和上一套差不多.除了最后一个题是看了讨论 ...

  7. zz 圣诞丨太阁所有的免费算法视频资料整理

    首发于 太阁实验室 关注专栏   写文章     圣诞丨太阁所有的免费算法视频资料整理 Ray Cao· 12 小时前 感谢大家一年以来对太阁实验室的支持,我们特地整理了在过去一年中我们所有的原创算法 ...

  8. hihoCoder 1467 2-SAT·hihoCoder音乐节(2-SAT模版)

    #1467 : 2-SAT·hihoCoder音乐节 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 hihoCoder音乐节由hihoCoder赞助商大力主办,邀请了众 ...

  9. 【hihocoder 1122】二分图二•二分图最大匹配之匈牙利算法

    [Link]:https://hihocoder.com/problemset/problem/1122 [Description] [Solution] 二分图匹配,匈牙利算法模板题; 这里我先把染 ...

随机推荐

  1. Mvc Moq HttpContext

    1: public class MockMvcHttpContext 2: { 3: public Moq.Mock<System.Web.HttpContextBase> Context ...

  2. java基础之java的基本数据类型

    java分为基本数据类型和引用数据类型.基本数据类型主演分为四类八种,引用数据类型分为接口,类,数组,String. 基本数据类型的四类八种是: 整数类型:byte,short,int,long 数据 ...

  3. @Value失效的问题

    @Value 会在@Controller中失效,失效原因涉及源码问题就不一一叙述了,一般加上@Service,@Component就能解决.如果是在Controller中使用建议新建一个配置类,然后在 ...

  4. Java一个汉字占几个字节(详解与原理)(转载)

    1.先说重点: 不同的编码格式占字节数是不同的,UTF-8编码下一个中文所占字节也是不确定的,可能是2个.3个.4个字节: 2.以下是源码: 1 @Test 2 public void test1() ...

  5. 对io进行分流

    package org.richin.io.Stream.util;     import java.io.BufferedInputStream;     import java.io.Buffer ...

  6. Implementation:Dijkstra

    #include <iostream> #include <cstdlib> #include <utility> #include <queue> u ...

  7. elastic job will never fire

    1. 描述 2018-08-20 18:11:01.912 [Thread-8] INFO  org.quartz.impl.StdSchedulerFactory - Using default i ...

  8. HTML5 MutationObserver检测页面劫持

    好久没写博客了,业务一直在变化,陆陆续续的做了很多web app,被业务流淹没就很少有机会去反思,前端技术发展如此之快,常常有种不学则退的恐慌,一种技术还没吃透就涌出新的技术,然后一波人又打着各种旗帜 ...

  9. egg.js-基于koa2的node.js入门

    一.Egg.JS 简介 Egg.JS是阿里开发的一套node.JS的框架,主要以下几个特点: Egg 的插件机制有很高的可扩展性,一个插件只做一件事,Egg 通过框架聚合这些插件,并根据自己的业务场景 ...

  10. opencv3.2.0图像对比度与亮度调整

    ##名称:图像对象度与对比度调整(由轨迹条分别控制对比度和亮度值) ##平台:QT5.7.1+opencv3.2.0 ##时间:2017年12月13日 /***********建立QT控制台程序*** ...