[Offer收割]编程练习赛32
气泡图
两两判断关系,dfs。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
double x[], y[], r[];
int f[][];
const double eps = 1e-;
#include<vector>
using namespace std;
vector<int> G[];
int p[], father[];
void dfs(int x, int fa) {
father[x] = fa;
for (int i = ; i < G[x].size(); i++) {
p[G[x][i]]--;
}
for (int i = ; i < G[x].size(); i++) {
int v = G[x][i];
if (p[v] == && father[v]==) {
dfs(v, x);
}
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
int n;
scanf("%d", &n);
for (int i = ; i <= n; i++) {
scanf("%lf%lf%lf", &x[i], &y[i], &r[i]);
}
memset(f, , sizeof(f));
memset(p, , sizeof(p));
memset(father, , sizeof(father));
for (int i = ; i <= n; i++) {
for (int j = i + ; j <= n; j++) {
if (i != j) {
double d = sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]));
if (r[i] - r[j] >= d) {
f[i][j] = ;
G[i].push_back(j);
f[j][i] = -;
p[j]++;
}
if (r[j] - r[i] >= d) {
f[i][j] = -;
f[j][i] = ;
G[j].push_back(i);
p[i]++;
}
}
}
}
for (int i = ; i <= n; i++) {
if (p[i] == ) {
dfs(i, );
break;
}
}
for (int i = ; i <= n; i++) {
printf("%d\n", father[i]);
}
return ;
}
候选人追踪
维护S集合中的最小值和其余候选人中的最大值
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
template <class T> class SegmentTree {
public:
T dat, lazy;
int leftBorder, rightBorder, mid;
SegmentTree * leftSon, * rightSon;
T(* lazyfunc)(T, T);
T(* mergefunc)(T, T);
SegmentTree() {
leftBorder = rightBorder = -;
leftSon = rightSon = NULL;
}
void pushdown();
void pushup();
void Build(T *, int, int, T(*)(T, T), T(*)(T, T));
void Modify(int, int, T);
T Query(int, int);
void Free();
};
template<class T> void SegmentTree<T>::pushdown() {
if (lazy && leftBorder != rightBorder) {
leftSon->dat = lazyfunc(leftSon->dat, lazy);
rightSon->dat = lazyfunc(rightSon->dat, lazy);
leftSon->lazy = lazyfunc(leftSon->lazy, lazy);
rightSon->lazy = lazyfunc(rightSon->lazy, lazy);
}
lazy = (T);
}
template<class T> void SegmentTree<T>::pushup() {
dat = mergefunc(leftSon->dat, rightSon->dat);
}
template<class T> void SegmentTree<T>::Build(T * S, int l, int r, T(* lfunc)(T, T), T(* mfunc)(T, T)) {
if (l > r) {
return;
}
lazy = (T);
leftBorder = l;
rightBorder = r;
mid = (leftBorder + rightBorder) >> ;
lazyfunc = lfunc;
mergefunc = mfunc;
if (l == r) {
dat = S[l];
return;
}
leftSon = new SegmentTree;
leftSon->Build(S, l, mid, lfunc, mfunc);
rightSon = new SegmentTree;
rightSon->Build(S, mid + , r, lfunc, mfunc);
pushup();
}
template<class T> void SegmentTree<T>::Modify(int l, int r, T NewDat) {
if (l > r || l < leftBorder || rightBorder < r) {
return;
}
if (leftBorder == l && rightBorder == r) {
dat = lazyfunc(dat, NewDat);
lazy = lazyfunc(lazy, NewDat);
return;
}
pushdown();
if (r <= mid) {
leftSon->Modify(l, r, NewDat);
} else if (mid < l) {
rightSon->Modify(l, r, NewDat);
} else {
leftSon->Modify(l, mid, NewDat);
rightSon->Modify(mid + , r, NewDat);
}
pushup();
}
template<class T> T SegmentTree<T>::Query(int l, int r) {
if (l > r || l < leftBorder || rightBorder < r) {
return dat;
}
pushdown();
if (l == leftBorder && r == rightBorder) {
return dat;
}
if (r <= mid) {
return leftSon->Query(l, r);
} else if (mid < l) {
return rightSon->Query(l, r);
} else {
return mergefunc(leftSon->Query(l, mid), rightSon->Query(mid + , r));
}
}
template<class T> void SegmentTree<T>::Free() {
if (leftSon != NULL) {
leftSon->Free();
}
if (rightSon != NULL) {
rightSon->Free();
}
delete leftSon;
delete rightSon;
}
int lazyfunc(int a, int b) {
return a + b;
}
int mergefunc(int a, int b) {
return a > b ? b : a;
}
int n, k;
bool f[];
class tick {
public:
int t, c;
};
int cmp(const void *x, const void *y) {
tick * tx = (tick *)x;
tick * ty = (tick *)y;
return tx->t > ty->t ? : -;
}
tick p[];
int index_____[], a[];
SegmentTree<int> st;
int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
memset(a, , sizeof(a));
scanf("%d%d", &n, &k);
for (int i = ; i < n; i++) {
scanf("%d%d", &p[i].t, &p[i].c);
}
memset(f, false, sizeof(f));
for (int i = ; i < k; i++) {
int s;
scanf("%d", &s);
f[s] = true;
}
int cnt = ;
for (int i = ; i < ; i++) {
if (f[i]) {
index_____[i] = cnt++;
}
}
qsort(p, n, sizeof(tick), cmp);
int ptr = , ans = , max = , time = p[].t, s = -;
st.Build(a, , k - , lazyfunc, mergefunc);
while (ptr < n) {
do {
if (f[p[ptr].c]) {
st.Modify(index_____[p[ptr].c], index_____[p[ptr].c], );
} else {
a[p[ptr].c]++;
if (a[p[ptr].c] > max) {
max = a[p[ptr].c];
}
}
ptr++;
} while (p[ptr].t == p[ptr - ].t && ptr < n);
int q = st.Query(, k - );
if (s == ) {
ans += p[ptr - ].t - time;
}
time = p[ptr - ].t;
if (q > max) {
s = ;
} else {
s = -;
}
}
printf("%d\n", ans);
return ;
}
墨水滴
bfs,优先扩展队列中颜色最深的点。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
class ink {
public:
int x, y;
};
int n, k;
int a[][];
bool f[][];
const int dx[] = {-, , , }, dy[] = {, , , -};
ink heap[];
int len;
void adjust_down(int p) {
if (p * <= len && a[heap[p].x][heap[p].y] < a[heap[p * ].x][heap[p * ].y]) {
ink tmp = heap[p];
heap[p] = heap[p * ];
heap[p * ] = tmp;
adjust_down(p * );
}
if (p * + <= len && a[heap[p].x][heap[p].y] < a[heap[p * + ].x][heap[p * + ].y]) {
ink tmp = heap[p];
heap[p] = heap[p * + ];
heap[p * + ] = tmp;
adjust_down(p * + );
}
}
void adjust_up(int p) {
if (p <= ) {
return;
}
if (a[heap[p].x][heap[p].y] > a[heap[p / ].x][heap[p / ].y]) {
ink tmp = heap[p];
heap[p] = heap[p / ];
heap[p / ] = tmp;
adjust_up(p / );
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
scanf("%d%d", &n, &k);
memset(f, false, sizeof(f));
memset(a, , sizeof(a));
len = ;
for (int i = ; i < k; i++) {
ink t;
int g;
scanf("%d%d%d", &t.x, &t.y, &g);
if (g > a[t.x][t.y]) {
a[t.x][t.y] = g;
if (!f[t.x][t.y]) {
heap[++len] = t;
adjust_up(len);
f[t.x][t.y] = true;
}
}
}
while (len > ) {
ink head = heap[];
heap[] = heap[len];
len--;
adjust_down();
f[head.x][head.y] = false;
for (int i = ; i < ; i++) {
int x = head.x + dx[i], y = head.y + dy[i];
if (x < || x >= n || y < || y >= n) {
continue;
}
if (a[x][y] < a[head.x][head.y] - ) {
a[x][y] = a[head.x][head.y] - ;
if (!f[x][y]) {
f[x][y] = true;
ink p;
p.x = x, p.y = y;
heap[++len] = p;
adjust_up(len);
}
}
}
}
for (int i = ; i < n; i++) {
for (int j = ; j < n; j++) {
printf("%d ", a[i][j]);
}
printf("\n");
}
return ;
}
鱼形子图计数
先枚举A点,再从A点能到的点中枚举D点,计算AD都能到的点的数量tmp,则鱼身部分p1=tmp*(tmp-1)种构造;D点度数减3为鱼尾的可选集合,共p2=(d(D)-3)*(d(D)-4)/2种构造;则以A点为鱼头的子图个数为p1*p2。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
#include<algorithm>
using namespace std;
const long long M = ;
vector<int> G[];
int n, m;
long long common(int u, int v) {
int iu = , iv = ;
long long ret = ;
while (iu < G[u].size() && iv < G[v].size()) {
if (G[u][iu] == G[v][iv]) {
iu++, iv++, ret++;
} else if (G[u][iu] < G[v][iv]) {
iu++;
} else {
iv++;
}
}
return ret;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
long long ans;
while (scanf("%d%d", &n, &m) != EOF) {
ans = ;
for (int i = ; i <= n; i++) {
G[i].clear();
}
for (int i = ; i < m; i++) {
int u, v;
scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
for (int i = ; i <= n; i++) {
sort(G[i].begin(), G[i].end());
}
int A, B, C, D, E, F;
for (A = ; A <= n; A++) {
if (G[A].size() < ) {
continue;
}
for (int i = ; i < G[A].size(); i++) {
long long p1 = , p2 = , tmp;
D = G[A][i];
if (G[D].size() < ) {
continue;
}
tmp = common(A, D);
if (tmp >= ) {
p1 = tmp * (tmp - ) / % M;
}
tmp = G[D].size() - ;
if (tmp >= ) {
p2 = tmp * (tmp - ) / % M;
}
ans = (ans + p1 * p2) % M;
}
}
printf("%lld\n", ans);
}
return ;
}
[Offer收割]编程练习赛32的更多相关文章
- hihocoder [Offer收割]编程练习赛4
描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...
- hihocoder [Offer收割]编程练习赛61
[Offer收割]编程练习赛61 A:最小排列 给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列. 贪心即可,b是A的子序列,把不在b中的元素, ...
- [Offer收割]编程练习赛46
[Offer收割]编程练习赛46赛后题解 A.AEIOU 分析
- hihoCoder[Offer收割]编程练习赛1题目解析
题目1 : 九宫 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 小Hi近期在教邻居家的小朋友小学奥数.而近期正好讲述到了三阶幻方这个部分,三阶幻方指的是将1~9不反 ...
- ACM学习历程—Hihocoder [Offer收割]编程练习赛1
比赛链接:http://hihocoder.com/contest/hihointerview3/problem/1 大概有一个月没怎么打算法了.这一场的前一场BC,也打的不是很好.本来Div1的A和 ...
- HihoCoder1670 : 比赛日程安排([Offer收割]编程练习赛41)(模拟)
描述 H国编程联赛中有N只队伍,编号1~N. 他们计划在2018年一共进行M场一(队)对一(队)的比赛. 为了让参赛队员能得到充分的休息,联赛组委会决定:每支队伍连续两场比赛之间至少间隔一天.也就是如 ...
- [Offer收割]编程练习赛48
题目1 : 折线中点 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定平面上N个点P1, P2, ... PN,将他们按顺序连起来,形成一条折线. 请你求出这条折线的 ...
- [Offer收割]编程练习赛3 - 题目3 : 智力竞赛
智力竞赛 Problem's Link ---------------------------------------------------------------------------- Mea ...
- [Offer收割]编程练习赛5-1 小Ho的防护盾
#1357 : 小Ho的防护盾 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho的虚拟城市正在遭受小Hi的攻击,小Hi用来攻击小Ho城市的武器是一艘歼星舰,这艘歼星 ...
随机推荐
- Metadata
元数据是关于数据的组织.数据域及其关系的信息,简言之,元数据就是关于数据的数据. Metadata is "data [information] that provides informat ...
- webpack学习(六)—webpack+react+es6(第3篇)
接上篇 : webpack学习(六)—webpack+react+es6(第2篇) 上篇其实是有问题的,问题在取服务器数据这块.this.props 表示那些一旦定义,就不再改变的特性,而 this. ...
- 深度遍历DFS---树
一.二叉树的深度 题目: 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,nul ...
- eas快捷键
ctrl+shift+c 获取分录行的id ctrl+alt+[ 获取任意界面操作的信息
- win10环境下配置django+Apache2.4.38+python3.6项目
1.)Apache-2.4.38-win64-vc15下载地址: https://www.apachelounge.com/download/VC14/ 解压httpd-2.4.38-win64-VC ...
- js对比for、forEach、map遍历数组速度
function a() { var arr = new Array(1000000); for(var i = 0; i < arr.length;i ++) { arr[i] = i; } ...
- [POI2012]OKR-A Horrible Poem
正解:对于一个区间l,r,它的循环节长度一定是它的因数. 然后如果循环节是这个长度,那么[l+len,r]一定等于[l,r-len]. 然后每次询问的时候就把它的长度的最小质因子提出来. BZOJ上都 ...
- 继续聊WPF——Expander控件(1)
这个控件最实用的地方,就是做导航栏. <StackPanel Margin="20,20" Width="100" Height="460&qu ...
- Oracle关联查询-数据类型不一致问题 ORA-01722: 无效数字
一.存在表A和表B,都包含字段user_no,但数据类型不一致,如下: create table A ( user_id varchar2(20), user_no number(12,0), xxx ...
- Selenium Webdriver——操作隐藏的元素display属性
有时候我们会碰到一些元素不可见,这个时候selenium就无法对这些元素进行操作了.例如,下面的情况: 页面主要通过“display:none”来控制整个下拉框不可见.这个时候如果直接操作这个下拉框, ...