气泡图

两两判断关系,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的更多相关文章

  1. hihocoder [Offer收割]编程练习赛4

    描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...

  2. hihocoder [Offer收割]编程练习赛61

    [Offer收割]编程练习赛61 A:最小排列 给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列. 贪心即可,b是A的子序列,把不在b中的元素, ...

  3. [Offer收割]编程练习赛46

    [Offer收割]编程练习赛46赛后题解 A.AEIOU 分析

  4. hihoCoder[Offer收割]编程练习赛1题目解析

    题目1 : 九宫 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 小Hi近期在教邻居家的小朋友小学奥数.而近期正好讲述到了三阶幻方这个部分,三阶幻方指的是将1~9不反 ...

  5. ACM学习历程—Hihocoder [Offer收割]编程练习赛1

    比赛链接:http://hihocoder.com/contest/hihointerview3/problem/1 大概有一个月没怎么打算法了.这一场的前一场BC,也打的不是很好.本来Div1的A和 ...

  6. HihoCoder1670 : 比赛日程安排([Offer收割]编程练习赛41)(模拟)

    描述 H国编程联赛中有N只队伍,编号1~N. 他们计划在2018年一共进行M场一(队)对一(队)的比赛. 为了让参赛队员能得到充分的休息,联赛组委会决定:每支队伍连续两场比赛之间至少间隔一天.也就是如 ...

  7. [Offer收割]编程练习赛48

    题目1 : 折线中点 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定平面上N个点P1, P2, ... PN,将他们按顺序连起来,形成一条折线. 请你求出这条折线的 ...

  8. [Offer收割]编程练习赛3 - 题目3 : 智力竞赛

    智力竞赛 Problem's Link ---------------------------------------------------------------------------- Mea ...

  9. [Offer收割]编程练习赛5-1 小Ho的防护盾

    #1357 : 小Ho的防护盾 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho的虚拟城市正在遭受小Hi的攻击,小Hi用来攻击小Ho城市的武器是一艘歼星舰,这艘歼星 ...

随机推荐

  1. promise原理及使用方法

    Promise 的含义 所谓Promise ,简单说就是一个容器,里面保存着某个未来才回结束的事件(通常是一个异步操作)的结果.从语法上说,Promise是一个对象,从它可以获取异步操作的消息. re ...

  2. 【剑指Offer】32、把数组排成最小的数

      题目描述:   输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323.   ...

  3. 简单说基于JWT和appkey、sercurtyKey的SSO、身份认证方案

    环境介绍, 一个大的系统由多个子系统组成.典型地,假设有一个平台,其上接入了多个应用.则有几个常见的问题需要处理, 1.SSO(包括单个应用退出时,需要处理为整个系统退出): 2.平台跳转到应用.及应 ...

  4. Golang Gin实践 番外 请入门 Makefile

    Golang Gin实践 番外 请入门 Makefile 原文地址:Golang Gin实践 番外 请入门 Makefile 前言 含一定复杂度的软件工程,基本上都是先编译 A,再依赖 B,再编译 C ...

  5. Q&A to prepare interview of HSBC

    1.How do you keep updating lastest IT knowledge? 1).keep an eye on current project technology evetho ...

  6. 通用 mapper

    一.为什么需要通用 mapper 插件 通用 mapper 插件可以自动的生成 sql 语句. 虽然 mybatis 有逆向工程,可以直接生成 XxxMapper.xml 文件,但是这种生成的方式存在 ...

  7. 洛谷 P2483 BZOJ 1975 [SDOI2010]魔法猪学院

    题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...

  8. ACDream - Crayon

    题目: Description There are only one case in each input file, the first line is a integer N (N ≤ 1,000 ...

  9. HDU - 1043 - Eight / POJ - 1077 - Eight

    先上题目: Eight Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  10. Mycat连接数据库之后导致表名全小写的问题分析研究

    初步研究:通过部署发现在Mycat中部署逻辑表表名大小写混合时,在Mycat连接后出现全变小.容易造成错误逻辑表(按混合表名创建物理表): 可能拯救的方法: 1.Linux下部署安装MySQL,默认不 ...