题目链接  Problems

HDOJ上的题目顺序可能和现场比赛的题目顺序不一样,

我这里的是按照HDOJ的题目顺序来写的。

Problem 1001

签到

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)

typedef long long LL;

LL n, f[31];
int ans; int main(){ f[1] = 1LL;
for (LL i = 2; i <= 15; ++i){
f[i] = 1LL;
rep(j, 1, i) f[i] *= i;
} while (~scanf("%lld", &n)){
ans = 0;
rep(i, 1, 15) if (f[i] <= n) ans = max(ans, i);
printf("%d\n", ans);
} return 0;
}

Problem 1002

这道题的话,其实一个点上是可以有多种颜色的

因为最多只有51种颜色,所以我们维护51棵线段树即可。

我们对y坐标建立线段树,对于每个y,我们只需要知道最小的x在哪里即可。

因为他的询问的x坐标下界总是1,那么我们只要看看y1到y2的最小值是否小于等于给定的x即可。

询问的时候做51次子询问就可以了。

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) typedef long long LL; const int N = 2e6 + 10; int X, c, d, x, y, op, ans, ret, cnt;
int root[53];
int l[N], r[N], v[N]; void update(int &i, int L, int R, int x, int val){
if (i == 0){
i = ++cnt;
v[i] = val;
} v[i] = min(v[i], val);
if (L == R) return; int mid = (L + R) >> 1;
if (x <= mid) update(l[i], L, mid, x, val);
else update(r[i], mid + 1, R, x, val);
} void query(int i, int L, int R){
if (ret || i == 0) return;
if (c <= L && R <= d){
if (v[i] <= X) ret = 1;
return;
} int mid = (L + R) >> 1;
if (c <= mid) query(l[i], L, mid);
if (d > mid) query(r[i], mid + 1, R);
} int main(){ while (true){
scanf("%d", &op);
if (op == 3) break;
if (op == 0){
rep(i, 1, cnt) l[i] = r[i] = 0;
memset(root, 0, sizeof root);
cnt = 0;
} if (op == 1){
scanf("%d%d%d", &x, &y, &c);
update(root[c], 1, 1000000, y, x);
} if (op == 2){
scanf("%d%d%d", &X, &c, &d);
ans = 0;
rep(i, 0, 50){
ret = 0;
query(root[i], 1, 1000000);
ans += ret;
}
printf("%d\n", ans);
}
} return 0;
}

Problem 1003

我们对于每一条边,找到所有包含这条边的三元环,个数计为x

然后这对答案的贡献就是$C_{x}^{2}$

判断两点之间是否有边的时候要手写哈希才能过

#include <bits/stdc++.h>

const int N = 2e5 + 10;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) namespace Hashmap{
const int P = 1000007, seed = 2333;
int u[N << 2], v[N << 2], nt[N << 2];
int head[P], inum;
inline void init(){
inum = 0;
memset(u, 0, sizeof u);
memset(v, 0, sizeof v);
memset(nt, 0, sizeof nt);
memset(head, 0, sizeof head);
} inline void add(int _u, int _v){
int t = (_u * seed + _v) % P;
u[++inum] = _u, v[inum] = _v, nt[inum] = head[t], head[t] = inum;
} inline bool query(int _u, int _v){
int t = (_u * seed + _v) % P;
for (int p = head[t]; p; p = nt[p])
if (u[p] == _u && v[p] == _v) return 1;
return 0;
}
} using namespace std;
using namespace Hashmap; typedef long long LL; vector<int> a[N]; struct ss{ int x, y; } e[N]; int n, m; int main(){ while (~scanf("%d%d",&n, &m)){
init();
rep(i, 1, n) a[i].clear();
rep(i, 1, m){
int x, y;
scanf("%d%d", &x, &y);
e[i].x = x;
e[i].y = y;
a[x].push_back(y);
a[y].push_back(x);
add(x, y);
add(y, x);
} LL ans = 0;
rep(i, 1, m){
int x = e[i].x, y = e[i].y;
if (a[e[i].y].size() < a[e[i].x].size()) swap(x, y);
LL tot = 0;
for (auto u: a[x]) if (query(u, y)) tot++;
ans += tot * (tot - 1) / 2;
} printf("%lld\n", ans);
}
return 0;
}

Problem 1004

这题规律找了半天……

$f[n] = f[n - 1] + 5f[n - 2] + f[n - 3] - f[n - 4]$

然后矩阵加速下就可以了

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define MP make_pair
#define fi first
#define se second typedef long long LL; const LL mod = 1e9 + 7; struct Matrix{
LL arr[6][6];
} f, unit, a; LL m, k;
int n; Matrix Add(Matrix a, Matrix b){
Matrix c;
rep(i, 1, n) rep(j, 1, n){
c.arr[i][j] = (a.arr[i][j] + b.arr[i][j]) % mod;
}
return c;
} Matrix Mul(Matrix a, Matrix b){
Matrix c;
rep(i, 1, n) rep(j, 1, n){
c.arr[i][j] = 0;
rep(k, 1, n) (c.arr[i][j] += (a.arr[i][k] * b.arr[k][j] % mod)) %= mod;
}
return c;
} Matrix Pow(Matrix a, LL k){
Matrix ret(unit); for (; k; k >>= 1, a = Mul(a, a)) if (k & 1) ret = Mul(ret, a); return ret;
} int main(){ n = 4; memset(f.arr, 0, sizeof f.arr);
memset(a.arr, 0, sizeof a.arr);
memset(unit.arr, 0, sizeof unit.arr); rep(i, 1, n) unit.arr[i][i] = 1;
f.arr[1][1] = 1;
f.arr[1][2] = 5;
f.arr[1][3] = 1;
f.arr[1][4] = 1000000006;
f.arr[2][1] = 1;
f.arr[3][2] = 1;
f.arr[4][3] = 1; a.arr[1][1] = 36;
a.arr[2][1] = 11;
a.arr[3][1] = 5;
a.arr[4][1] = 1; while (~scanf("%lld", &m)){
if (m == 1LL){ puts("1"); continue;}
if (m == 2LL){ puts("5"); continue;}
if (m == 3LL){ puts("11"); continue;}
if (m == 4LL){ puts("36"); continue;}
if (m == 5LL){ puts("95"); continue;} k = m - 4; Matrix b = Pow(f, k);
Matrix c = Mul(b, a);
printf("%lld\n", c.arr[1][1]);
} return 0;
}

Problem 1010

这道题的话先转DFS序,然后求出以每个点为根的子树的对应区间,

于是就转化成了求区间里选一个数和x异或后的最大值。

可持久化trie即可。

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) typedef long long LL; const int N = 1e5 + 10;
const int M = 1e7 + 10; int n, m, tot = 0;
int rt[N], id[M], t[M][2];
int l, r, x;
int a[N], c[N], L[N], R[N], g[N];
int ti;
int u; vector <int> v[N]; inline void insert(int pre, int x, int k){ int now = rt[k] = ++tot; id[tot] = k; dec(i, 30, 0){
int j = (x >> i) & 1;
t[now][j ^ 1] = t[pre][j ^ 1];
t[now][j] = ++tot;
id[tot] = k;
now = t[now][j];
pre = t[pre][j];
}
} inline int query(int l, int r, int x){ int ans = 0, tmp = rt[r]; dec(i, 30, 0){
if (id[tmp] < l) break;
int j = ((x >> i) & 1) ^ 1;
if (id[t[tmp][j]] >= l) ans |= (1 << i);
else j ^= 1;
tmp = t[tmp][j];
} return ans;
} void dfs(int x){
L[x] = ++ti;
g[ti] = a[x];
for (auto u : v[x]){
dfs(u);
}
R[x] = ti;
} int main(){ while (~scanf("%d%d", &n, &m)){
memset(id, 0, sizeof id);
memset(rt, 0, sizeof rt);
memset(t, 0, sizeof t);
memset(L, 0, sizeof L);
memset(R, 0, sizeof R); tot = 0;
ti = 0; rep(i, 0, n + 1) v[i].clear();
rep(i, 1, n) scanf("%d", a + i);
rep(i, 2, n){
scanf("%d", &x);
v[x].push_back(i);
} dfs(1); id[0] = -1;
insert(0, 0, 0); rep(i, 1, n) insert(rt[i - 1], g[i], i); rep(i, 1, m){
scanf("%d%d", &u, &x);
printf("%d\n", query(L[u], R[u], x));
} }
return 0;
}

2017 ACM/ICPC 广西邀请赛 题解的更多相关文章

  1. 2017 ICPC 广西邀请赛1004 Covering

    Covering Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  2. 2017 ACM/ICPC Asia Regional Shenyang Online spfa+最长路

    transaction transaction transaction Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 132768/1 ...

  3. 2017 ACM ICPC Asia Regional - Daejeon

    2017 ACM ICPC Asia Regional - Daejeon Problem A Broadcast Stations 题目描述:给出一棵树,每一个点有一个辐射距离\(p_i\)(待确定 ...

  4. 2017 ACM - ICPC Asia Ho Chi Minh City Regional Contest

    2017 ACM - ICPC Asia Ho Chi Minh City Regional Contest A - Arranging Wine 题目描述:有\(R\)个红箱和\(W\)个白箱,将这 ...

  5. 2017 ACM/ICPC Shenyang Online SPFA+无向图最长路

    transaction transaction transaction Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 132768/1 ...

  6. 2017 ACM/ICPC Asia Regional Qingdao Online

    Apple Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submi ...

  7. 2014 ACM/ICPC 北京邀请赛 部分 题解

    题目链接:http://acm.bnu.edu.cn/bnuoj/problem.php?search=2014+ACM-ICPC+Beijing+Invitational+Programming+C ...

  8. 2017 ICPC 广西邀请赛1005 CS Course

    CS Course Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  9. 2017 ACM/ICPC Asia Regional Shenyang Online(部分题解)

    HDU 6197 array array array 题意 输入n和k,表示输入n个整数和可以擦除的次数k,如果至多擦除k次能是的数组中的序列是不上升或者是不下降序列,就是魔力数组,否则不是. 解题思 ...

随机推荐

  1. VM虚拟机下的Linux不能上网

    虚拟机linux上网配置 图解教程 首先查看window7主机下的网络配置VMNet1或VMNet8是否开启,其实linux系统的网络连接跟linux系统一致 在虚拟机界面将桥接改为NAT连接 点虚拟 ...

  2. javascript基本数据类型问题汇总

    isNaN()检测是否是NaN: 比较浮点相等,用绝对值,是否小于某一个阈值 Math.abs(1/3 - (1-2/3))<0.0000001: 字符串多行显示\n,ES6中使用反引号``: ...

  3. Luogu P2123 皇后游戏(贪心)

    题目链接:P2123 皇后游戏 如果证明这个题为什么是贪心的话,我是不会的,但是一看这个题目就是一个贪心,然后满足贪心的性质: 都能从两个人(东西)扩展到n个人(东西) 一定能从相邻状态扩展到不相邻的 ...

  4. GIMP的Path的import和export

    点击Path栏中的小三角,选择Paths Menu,然后点击Export Path Import Path自然不必多说:

  5. centos7系统优化

    优化说明: 一.关闭selinux 二.更改为阿里yum源 三.提权dm用户可以使用sudo 四.优化ssh远程登录配置 五.设置中文字符集 六.设置时间同步 七.历史记录数及登录超时环境变量设置 八 ...

  6. python--第一类对象,函数名,变量名

    一 . 第一类对象 函数对象可以像变量一样进行赋值 , 还可以作为列表的元素进行使用 可以作为返回值返回 , 可以作为参数进行传递 def func(): def people(): print('金 ...

  7. LCD驱动分析(二)帧缓冲设备作为平台设备

    参考:S3C2440 LCD驱动(FrameBuffer)实例开发<一>   S3C2440 LCD驱动(FrameBuffer)实例开发<二> 1.平台设备注册 1.1在li ...

  8. django的rest framework框架——安装及基本使用

    一.django的FBV 和 CBV 1.FBV(基于函数的视图): urlpatterns = [ url(r'^users/', views.users), ] def users(request ...

  9. centos 部署 自定义(succes)

    安装前先检查一下有没有安装好了的JDK,Tomcat,MySQL,不过一般都没有. 1.安装JDK 1.1 下载jdk,可以到官网查看不同版本的下载地址 wget --no-check-certifi ...

  10. Leetcode 388.文件的最长绝对路径

    文件的最长绝对路径 假设我们以下述方式将我们的文件系统抽象成一个字符串: 字符串 "dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext" 表示: dir ...