2018-2019 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 2018) Solution
A. Numbers
Unsolved.
B. Broken Watch
Solved.
题意:
一个圆盘上,有等分的n块区域,有三根指针,当三根指针分别位于两块区域的交界处时
指针的三点相连会形成一个三角形,求有多少个三角包含三指针的起点(即交汇处)
思路:
#include<bits/stdc++.h> using namespace std; typedef unsigned long long ull;
typedef long long ll; ll A, B, C, n; int main()
{
while(~scanf("%lld %lld %lld %lld" ,&A, &B, &C, &n))
{
ull tmp = (n + ) / ;
tmp -= ;
ull a = n, b = n - , c = n - ;
if(a % == ) a /= ;
else if(b % == ) b /= ;
else if(c % == ) c /= ; if(a % == ) a /= ;
else if(b % == ) b /= ;
else if(c % == ) c /= ; ull ans = a * b * c; ans -= n * (tmp * (tmp + ) / ); if(A != B && B != C && C != A) ans = ans * ;
else if(A != B || B != C || C != A) ans = ans * ; printf("%llu\n", ans);
}
return ;
}
C. Tree
Solved.
题意:
一棵树中,有些点是黑点,有些点是白点,求恰选择m个黑点
使得黑点中任意两点的最长距离最短
思路:
#include<bits/stdc++.h>
using namespace std;
const int maxn = ;
struct Edge{
int to, nxt;
Edge(){}
Edge(int to, int nxt): to(to), nxt(nxt){}
}edge[maxn << ];
int n, m;
int p[maxn];
int vis[maxn];
int head[maxn], tot;
void Init(int n)
{
tot = ;
for(int i = ; i <= n; ++i) head[i] = -;
}
void addedge(int u,int v)
{
edge[tot] = Edge(v, head[u]); head[u] = tot++;
edge[tot] = Edge(u, head[v]); head[v] = tot++;
}
int DFS(int u,int fa, int limit, int dis)
{
int res = p[u];
if(dis == limit) return res;
for(int i = head[u]; ~i; i = edge[i].nxt)
{
int v = edge[i].to;
if(!vis[v] || v == fa) continue;
res += DFS(v, u, limit, dis + );
}
return res;
}
bool check(int mid)
{
for(int i = ; i <= n; ++i) vis[i] = ;
queue<int>q;
q.push();
while(!q.empty())
{
int u = q.front();
q.pop();
vis[u] = ;
if(DFS(u, -, mid, ) >= m) return true;
for(int i = head[u]; ~i; i = edge[i].nxt)
{
int v = edge[i].to;
if(vis[v]) continue;
q.push(v);
}
}
return false;
}
int main()
{
while(~scanf("%d %d", &n, &m))
{
Init(n);
for(int i = ; i <= n; ++i) scanf("%d", p + i);
for(int i = , u, v; i < n; ++i)
{
scanf("%d %d", &u, &v);
addedge(u, v);
}
int l = , r = n;
int res = ;
while(r - l >= )
{
int mid = (l + r) >> ;
if(check(mid))
{
r = mid - ;
res = mid;
}
else l = mid + ;
}
printf("%d\n", res);
}
return ;
}
D. Space Station
Unsolved.
E. Fishermen
Solved.
题意:
在一个二维平面,有有一些鱼,也有一些渔民,每个渔民有一个钓竿
渔民都在$x轴上,渔民可以钓到那条鱼的条件是它和鱼的曼哈顿距离小于等于钓竿长度$
思路:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + ;
struct node{
int l, r;
node(){}
node(int l,int r): l(l), r(r){}
bool operator < (const node &b) const
{
if(l == b.l) return r < b.r;
else return l < b.l;
}
}arr[maxn];
struct qnode{
int pos, idx;
qnode(){}
qnode(int pos, int idx): pos(pos), idx(idx){}
bool operator < (const qnode &b) const
{
return pos < b.pos;
}
}brr[maxn];
int n, m, l;
int ans[maxn];
int main()
{
while(~scanf("%d %d %d", &n, &m, &l))
{
int pos = ;
for(int i = ; i <= n; ++i)
{
int x, y;
scanf("%d %d", &x ,&y);
if(y > l) continue;
int tmp = l - y;
arr[++pos] = node(x - tmp, x + tmp);
}
sort(arr + , arr + + pos);
for(int i = ; i <= m; ++i)
{
scanf("%d", &brr[i].pos);
brr[i].idx = i;
}
sort(brr + , brr + + m);
priority_queue<int, vector<int>, greater<int> >q;
int cnt = ;
for(int i = ; i <= m; ++i)
{
while(cnt <= pos && brr[i].pos >= arr[cnt].l)
{
q.push(arr[cnt++].r);
}
while(!q.empty() && q.top() < brr[i].pos)
{
q.pop();
}
ans[brr[i].idx] = q.size();
}
for(int i = ; i <= m; ++i) printf("%d\n", ans[i]);
}
return ;
}
F. Min Max Convert
Unsolved.
题意:
每一次可以将一段区间的所有值变成它原先的最大或最小值
求有没有一种操作方案使得序列A 变成 序列B 如果有输出操作方案
否则输出-1
G. Matrix Queries
Unsolved.
题意:
在一个$2^n \cdot 2^n 的矩形里面,刚开始都是白色,每一次可以把一行或者一列的颜色翻转$
求每次操作后矩阵的值
这样定义矩阵的值:
如果当前矩阵的所有颜色都相同,那么该矩阵的值为1
否则将当前矩阵等分为四个,当前矩阵的值就是四个小矩阵的值+1
H. Modern Djinn
Unsolved.
I. Inversion
Solved.
题意:
在一张图中,求有多少个点集,使得这个点集里面的任意两点没有边
不在点集里面的点至少有一条边连向点集中一点
思路:
我们考虑一条边 $(i, j) 那么定义在一个序列中(i, j) 为一个逆序对$
那么就是找上升子序列的个数
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1e2 + ; ll dp[maxn];
int G[maxn][maxn];
int n, m; int main()
{
while(~scanf("%d %d", &n, &m))
{
memset(dp, , sizeof dp);
memset(G, , sizeof G);
for(int i = , u, v; i <= m; ++i)
{
scanf("%d %d", &u, &v);
G[u][v]++;
G[v][u]++;
}
dp[] = ;
for(int i = ; i <= n + ; ++i)
{
for(int j = ; j < i; ++j)
{
if(G[i][j]) continue;
int flag = ;
for(int k = j + ; k < i; ++k)
{
if(G[i][k] || G[j][k]) continue;
else
{
flag = ;
break;
}
}
dp[i] += flag * dp[j];
}
}
printf("%lld\n", dp[n + ]);
}
return ;
}
J. Rabbit vs Turtle
Unsolved.
K. Points and Rectangles
Solved.
题意:
两种操作
一种是往一个二维平面加入一个点
还有一种是加入一个矩阵
询问每次操作后有多少个$pair(x, R)$
$pair(x, R) 表示 点x 在 矩形R 内$
思路:
考虑CDQ分治
对于每个矩阵,可以拆成四个点分治
对于每个点,我们可以把矩形的四个角赋上权值
左上角 1
左下角 -1
右上角-1
右下角1
然后把矩阵往左和网上拓宽一个单位
那么对于每个点来说就是查询右下角的值
#include <bits/stdc++.h>
using namespace std; #define ll long long
#define N 100010
struct qnode
{
int tp, x, y, id; bool isleft;
qnode () {}
qnode (int tp, int x, int y, int id) : tp(tp), x(x), y(y), id(id) {}
bool operator < (const qnode &other) const { return x < other.x || x == other.x && id < other.id; }
}que[N << ], tque[N << ];
int n, m, q, brr[N << ];
ll ans[N]; void Hash()
{
sort(brr + , brr + + m);
m = unique(brr + , brr + + m) - brr - ;
for (int i = ; i <= n; ++i) que[i].y = lower_bound(brr + , brr + + m, que[i].y) - brr;
} namespace BIT
{
int a[N << ];
void init() { memset(a, , sizeof a); }
void update(int x, int val)
{
for (; x <= m; x += x & -x)
{
if (val == ) a[x] = ;
else a[x] += val;
}
}
ll query(int x)
{
ll res = ;
for (; x; x -= x & -x)
res += a[x];
return res;
}
} void CDQ1(int l, int r)
{
if (l == r) return;
int mid = (l + r) >> ;
for (int i = l; i <= r; ++i)
{
tque[i] = que[i];
if (i <= mid) tque[i].isleft = true;
else tque[i].isleft = false;
}
sort(tque + l, tque + + r);
for (int i = l; i <= r; ++i)
{
if (tque[i].tp == && tque[i].isleft == true) BIT::update(tque[i].y, );
else if (tque[i].tp && tque[i].isleft == false)ans[tque[i].id] += BIT::query(tque[i].y) * tque[i].tp;
}
for (int i = l; i <= r; ++i) if (tque[i].tp == && tque[i].isleft == true) BIT::update(tque[i].y, );
CDQ1(l, mid), CDQ1(mid + , r);
} void CDQ2(int l, int r)
{
if (l == r) return;
int mid = (l + r) >> ;
for (int i = l; i <= r; ++i)
{
tque[i] = que[i];
if (i <= mid) tque[i].isleft = true;
else tque[i].isleft = false;
}
sort(tque + l, tque + + r, [](qnode a, qnode b) { return a.x > b.x || a.x == b.x && a.id < b.id; });
for (int i = l; i <= r; ++i)
{
if (tque[i].tp != && tque[i].isleft == true) BIT::update(tque[i].y, tque[i].tp);
else if (tque[i].tp == && tque[i].isleft == false) ans[tque[i].id] += BIT::query(m) - BIT::query(tque[i].y - );
}
for (int i = l; i <= r; ++i) if (tque[i].tp && tque[i].isleft == true) BIT::update(tque[i].y, );
CDQ2(l, mid); CDQ2(mid + , r);
} int main()
{
while (scanf("%d", &q) != EOF)
{
n = ; ans[] = ; m = ;
memset(ans, , sizeof ans);
for (int i = , op, x[], y[]; i <= q; ++i)
{
scanf("%d%d%d", &op, x, y);
brr[++m] = y[]; brr[++m] = y[] - ;
if (op == ) que[++n] = qnode(, x[], y[], i);
else
{
scanf("%d%d", x + , y + );
brr[++m] = y[]; brr[++m] = y[] - ;
que[++n] = qnode(, x[] - , y[] - , i);
que[++n] = qnode(, x[], y[], i);
que[++n] = qnode(-, x[] - , y[], i);
que[++n] = qnode(-, x[], y[] - , i);
}
}
Hash(); BIT::init();
CDQ1(, n); CDQ2(, n);
for (int i = ; i <= q; ++i) printf("%lld\n", ans[i] += ans[i - ]);
}
return ;
}
2018-2019 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 2018) Solution的更多相关文章
- 2018-2019 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 2018)
layout: post title: 2018-2019 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 201 ...
- 2017-2018 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 2017) Solution
A:Concerts 题意:给出一个串T, 一个串S,求串S中有多少个串T,可以重复,但是两个字符间的距离要满足给出的数据要求 思路:先顺序统计第一个T中的字符在S中有多少个,然后对于第二位的以及后面 ...
- 2017-2018 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 2017)
2017-2018 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 2017) 全靠 wxh的博客 补完这套.wx ...
- Gym 2009-2010 ACM ICPC Southwestern European Regional Programming Contest (SWERC 2009) A. Trick or Treat (三分)
题意:在二维坐标轴上给你一堆点,在x轴上找一个点,使得该点到其他点的最大距离最小. 题解:随便找几个点画个图,不难发现,答案具有凹凸性,有极小值,所以我们直接三分来找即可. 代码: int n; lo ...
- 2016-2017 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 2016)
题目链接 Codefores_Gym_101164 Solved 6/11 Penalty Problem A Problem B Problem C Problem D Problem E Pr ...
- Southeastern European Regional Programming Contest 2019
easy: I medium-easy: BDEGJ medium: F medium-hard: A A. B. 按 x 排序,\(dp[i][j][k]\) 表示考虑前 \(i\) 个物品,lev ...
- ACM ICPC, Damascus University Collegiate Programming Contest(2018) Solution
A:Martadella Stikes Again 水. #include <bits/stdc++.h> using namespace std; #define ll long lon ...
- 2016-2017 ACM-ICPC Southwestern European Regional Programming Contest (SWERC 2016)
A. Within Arm's Reach 留坑. B. Bribing Eve 枚举经过$1$号点的所有直线,统计直线右侧的点数,旋转卡壳即可. 时间复杂度$O(n\log n)$. #includ ...
- 2016-2017 ACM-ICPC Northwestern European Regional Programming Contest (NWERC 2016)
A. Arranging Hat $f[i][j]$表示保证前$i$个数字有序,修改了$j$次时第$i$个数字的最小值. 时间复杂度$O(n^3m)$. #include <bits/stdc+ ...
随机推荐
- 如何才能知道外线是FSK还是DTMF制式?
在直线上接上来电显示话机,然后用手机或其他电话拨接电话的外线号码. 1.如果是先振铃后来显,就是FSK制式. 2.如果先送来显,再振铃或来显和振铃同时响应,就是DTMF制式 交换机默认配置是FSK制式 ...
- ftp简单命令
1.连接ftp ftp 192.168.10.15 进去后输入用户名 ,然后再输入密码,就这样登陆成功了,你会看到 ftp> 2.进入ftp后,你对目录需要切换操作.和linux一样的命令.cd ...
- Dubbo源码导入Eclipse遇到的问题
1.怎么将Dubbo源码导入到Eclipse 方法一: 打开Eclipse,File-->Import-->maven-->Exsting Maven Projects,选择dubb ...
- 复习前面一个月的学习C#感觉道路好艰难啊
今天是复习前面学习的内容,感觉这一个月来真的学习了很多,但是掌握的不好,好多都是在老师讲完课后做起来练习感觉这知识用起来蛮轻松地,但是经过昨天和今天的复习发现好多还是给忘记啦,甚是失落啊,刚开始就知道 ...
- C++说明符和限定符
有些被称为存储说明符(storage class specifier)或cv-限定符(cv-qualifier)的C++关键字提供了一些有关存储的信息.下面是存储所说明符:* auto (在C++11 ...
- PHP学习记录数组中的数组的指针
unshift在数组头增加一个元素,push在数组尾增加一个元素,shift删除数组的第一个元素,pop删除数组的最后一个元素: <?php $item=array('苹果'); //在数组最前 ...
- LNMP 配置二级域名
准备: 已备案的主域名,例如:www.test.com 拥有自己的服务器 服务器环境 LNMP 目标: 配置一个二级域名: bbs.test.com 1 登录域名后台(阿里为例) 记录类型: A 主机 ...
- IT English Collection(20) of Object modeling
1 前言 本节简单的介绍了对象建模,以及需要注意的事项. 2 详述 2.1 原文 Objectmodeling is the process of designing the objects or c ...
- MQTT的学习研究(八)基于HTTP DELETE MQTT 订阅消息服务端使用
HTTP DELETE 订阅主题请求协议和响应协议http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0/topic/com.ibm.mq.csqzau ...
- [SQL] 理解SQL SERVER中的逻辑读,预读和物理读
SQL SERVER数据存储的形式 在谈到几种不同的读取方式之前,首先要理解SQL SERVER数据存储的方式.SQL SERVER存储的最小单位为页(Page).每一页大小为8k,SQL SERVE ...