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+ ...
随机推荐
- ionic ui框架及creator使用帮助
UI框架使用方法:http://ionicframework.com/docs/api/ PS:路由之类的其他js代码示例建议用 官方的app 生成器弄一个简单的页面,然后下载回来看 https:// ...
- Java信号量 Semaphore 介绍
一.介绍 Semaphore当前在多线程环境下被扩放使用,操作系统的信号量是个很重要的概念,在进程控制方面都有应用.Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore ...
- php学习一:语法规则
1.书写规则 在html中嵌入php的时候,需要有结束语,即<?php ...?>,在靠近结束符号的最后一个语句可以不用写分号: 但是在单独的php中,最后可以不用以?>来结尾; 2 ...
- stl中的map经验
如果想使用一个map临时变量装载参数map,不需要使用new创建一个对象. 声明一个变量,直接赋值就可以.map内部自己重载了=操作符,会自己分配内存.
- 程序启动-Runloop
0 从程序启动开始到view显示: start->(加载framework,动态静态链接库,启动图片,Info.plist,pch等)->main函数->UIApplicationM ...
- 在定时任务中慎用pause,否则造成弹窗没关闭,下一次任务不会成功执行
在定时任务中慎用pause,否则造成弹窗没关闭,下一次任务不会成功执行. 错误提示为:任务计划程序未启动任务“\php测试”,因为相同任务的实例“{07be63e6-af3f-4339-bc30-f1 ...
- 开源的PaaS方案:在OpenStack上部署CloudFoundry (二)部署OpenStack
硬件要求 安装OpenStack 1 安装CentOS 65系统并清空iptables防火墙规则 2 安装系统需要的工具包包括Openstack依赖的和CloudFoundry依赖的 3 安装EPEL ...
- 图论之最短路径(1)——Floyd Warshall & Dijkstra算法
开始图论学习的第二部分:最短路径. 由于知识储备还不充足,暂时不使用邻接表的方法来计算. 最短路径主要分为两部分:多源最短路径和单源最短路径问题 多源最短路径: 介绍最简单的Floyd Warshal ...
- 【BZOJ4337】BJOI2015 树的同构 括号序列
[BZOJ4337]BJOI2015 树的同构 Description 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱 ...
- Eclipse初体验
Eclipse有很多个版本: 这里我们下载Eclipse for javaEE版,既可以写javaSE代码又可以写web代码,省去了很多插件配置的时间.官网下载地址:http://www.eclips ...