A. Architecture

如果行最大值中的最大值和列最大值中的最大值不同的话,那么一定会产生矛盾,可以手模一个样例看看。

当满足行列最大值相同条件的时候,就可以判定了。

因为其余的地方一定可以构造出来符合条件的值,行列是很多的,填0就好了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll; int main()
{
int n, m; cin >> n >> m;
int t1, t2;
t1 = t2 = 0;
for(int i = 1, x; i <= n; i++)
{
scanf("%d", &x);
t1 = max(t1, x);
}
for(int i = 1, x; i <= m; i++)
{
scanf("%d", &x);
t2 = max(t2, x);
}
if(t1 == t2) puts("possible");
else puts("impossible");
return 0;
}

B. Bracket Sequence

用栈模拟即可,注意要取模

const int N = 300000 + 5;
const int mod = 1e9 + 7;
ll st[N], top, cnt;
int n;
char op[20];
ll get(char *s){
int len = strlen(s);
ll x = 0;
for(int i=0;i<len;i++) x = x * 10 + s[i] - '0';
return x;
}
int main() {
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%s",op);
if(op[0] == '(') {
cnt ++;
st[++top] = -1;
continue;
}
else if(op[0] == ')'){
if(st[top] == -1) {
top --;
continue;
}
ll x = st[top];
while(top >= 2 && st[top-1] != -1){
if(cnt % 2 == 0)x = (st[top-1] + x)%mod;
else x = st[top-1] * x % mod;
top--;
}
cnt --;
top -= 2;
st[++top] = x;
}
else{
ll x = get(op);
st[++top] = x;
}
}
ll res = 0;
while(top) res = (res + st[top--]) % mod;
printf("%lld\n", res);
return 0;
}

C. Canyon Crossing

二分一下最低高度,然后整个图变成了 n*m 个点,边权为0或1的图,第一排为起点,最后一排为终点,跑最短路即可,由于边权只有0和1,所以用双端队列维护即可

const int N = 1000 + 5;
#define mk make_pair
int n, m, k, a[N][N];
int d[N][N],c[N][N];
int dx[4] = {1,-1,0,0}, dy[4] = {0,0,1,-1};
pair<int,int> q[2000010];
bool check(int mid){
memset(d, 0x3f, sizeof d);
int l = 1000005,r = 1000004;
for(int j=1;j<=m;j++)q[++r] = mk(0,j), d[0][j] = 0;
while(l<=r){
auto t = q[l++];
int x = t.first, y = t.second;
for(int i=0;i<4;i++){
int nx = x + dx[i], ny = y + dy[i];
if(nx < 1 || nx > n || ny < 1 || ny > m)continue;
if(a[nx][ny] >= mid){
if(d[nx][ny] > d[x][y]){
d[nx][ny] = d[x][y];
q[--l] = mk(nx,ny);
}
}else{
if(d[nx][ny] > d[x][y] + 1){
d[nx][ny] = d[x][y] + 1;
q[++r] = mk(nx,ny);
}
}
}
}
for(int i=1;i<=m;i++)if(d[n][i] <= k) return true;
return false;
}
int main() {
scanf("%d%d%d",&n,&m,&k);
int l = inf, r = 0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);
l = min(l, a[i][j]);
r = max(r, a[i][j]);
}
}
while(l < r){
int mid = l + r + 1 >> 1;
if(check(mid))l = mid;
else r = mid - 1;
}
printf("%d\n",l);
return 0;
}

D. Deceptive Dice

\(ans\) 为 \(i-1\) 轮的期望,设 \(t = \lfloor ans \rfloor\) ,那么第 \(i\) 轮的期望是

\[\frac{t}{n} * ans + \frac{\sum_{t+1}^{n}i}{n}
\]

前面的表示有 \(t/n\) 的概率小于等于ans,那么第 i 次就不再掷色子。后面的就是取 [i+1, n] 的期望

const int N = 100 + 5;
int n, m;
double ans;
int get(int x){return x*(x+1) / 2;}
int main() {
scanf("%d%d",&n,&m);
ans = 1.0 * get(n) / n;
for(int i=2;i<=m;i++){
int t = ans;
ans = 1.0 * t / n * ans + 1.0 * (get(n) - get(t)) / n;
}
printf("%.7f\n",ans);
return 0;
}

E. Exits in Excess

这个题有个关键的性质在于无自环。

设两个集合\(S,T\)。

考虑一条边\(<x,y>\),如果\(x<y\),将这条边插入\(S\);否则插入\(T\)。

输出边集大小较小的集合。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<int> t1, t2;
int n, m;
int main()
{
cin >> n >> m;
for(int i = 1, x, y; i <= m; i++)
{
scanf("%d%d", &x, &y);
if(x < y) t1.push_back(i);
else t2.push_back(i);
}
if(t1.size()>t2.size()) t1 = t2;
cout << t1.size() << endl;
for(auto x : t1)
printf("%d\n", x);
return 0;
}

F. Floor Plan

int n;
int main() {
cin >> n;
int flag = false;
for(int i=2;i*i<=n;i++){
if(n % i == 0){
int res = n / i;
if((res + i)%2 == 0){
flag = true;
int a = (res + i) / 2;
int b = res - a;
printf("%d %d\n",b, a);
break;
}
}
}
if(!flag) puts("impossible");
return 0;
}

G. Greetings!

const int N = 100000 + 5;
char s[N];
int main() {
cin >> s;
int n = strlen(s);
printf("h");
for(int i=0;i<2*(n-2);i++)printf("e");
printf("y");
return 0;
}

H. Hexagonal Rooks

从起点走两步走到终点,枚举中间的那个点,判断它与起点和终点是否可以一步达到即可,判断细节比较重要,把大于纵坐标大于 'f' 的对称往上翻即可,用几种case找找规律即可。

char x, x2;
int y, y2;
bool check(int x, int y, int x2, int y2){
if(x == x2 && y == y2) return false;
if(x == x2) return true;
if(x > 6) y += x - 6;
if(x2 > 6) y2 += x2 - 6;
if(y == y2 || y - x == y2 - x2) return true;
return false;
}
int main() {
cin >> x >> y >> x2 >> y2;
int res = 0;
for(int i=1;i<=11;i++){
int cnt = 11 - abs(6 - i);
for(int j=1;j<=cnt;j++){
if(check(i, j, x-'a'+1, y) && check(i, j, x2-'a'+1, y2)) res++;
}
}
cout << res << endl;
return 0;
}

I. Inquiry I

const int N = 1000000 + 5;
ll a[N], b[N], sa[N], sb[N];
int n; int main() {
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]),b[i] = a[i]*a[i];
ll res = 0;
for(int i=1;i<=n;i++) sa[i] = sa[i-1] + a[i], sb[i] = sb[i-1] + b[i];
for(int i=0;i<=n;i++){
res = max(res, sb[i] * (sa[n] - sa[i]));
}
printf("%lld\n",res);
return 0;
}

K. Knapsack Packing

首先排个序,最小的一定是0(空集产生的和),然后次小的就是集合中最小的数了。之后每次找到一个新的数字(即最终答案集合中的数字),都用它与之前所有组合出来的数字进行求和,将这些新的数字填入到一个集合中,再接下来的扫描过程中,如果发现有该集合的数字,则一定不是答案集合中的数字,将其从集合中删除即可。

const int N = 300000 + 5;
int n, m, a[N];
multiset<int> st, tmp;
map<int,int> mp;
vector<int> res;
int main() {
scanf("%d",&n);
m = 1 << n;
for(int i=1;i<=m;i++)scanf("%d",&a[i]);
sort(a+1,a+1+m);
if(a[1] != 0){
puts("impossible");
return 0;
}
int cnt = 0;
for(int i=2;i<=m;i++){
if(mp[a[i]]){
mp[a[i]] --;
continue;
}else{
cnt ++;
res.push_back(a[i]);
for(auto x:st){
tmp.insert(x + a[i]);
}
for(auto x : tmp) {
st.insert(x);
mp[x] ++;
}
st.insert(a[i]);
tmp.clear();
}
if(cnt > n){
puts("impossible");
return 0;
}
}
sort(res.begin(),res.end());
for(auto x : res)printf("%d\n",x);
return 0;
}

L. Lifeguards

将点按照坐标轴排序,找到中间的点,对于n的奇偶进行分别处理。

n 为奇数则构造一个几乎平行于y轴且通过中间点的直线,可以想到做这条直线的垂直平分线可以将所有点分成两半

n 为偶数则构造一个几乎平行于y轴且不通过中间点的直线,这样的直线的垂直平分线也同样会把所有点分成两半

const int N = 100000 + 5;
pair<ll,ll> a[N];
int n;
int main() {
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%lld%lld",&a[i].first, &a[i].second);
sort(a + 1, a + 1 + n);
int mid = (n + 1) / 2;
ll Len = 1000000000000ll;
ll x = a[mid].first, y = a[mid].second;
if(n & 1){
printf("%lld %lld\n", x - Len, y-1);
printf("%lld %lld\n", x + Len, y+1);
}else{
printf("%lld %lld\n", x - Len, y);
printf("%lld %lld\n", x + Len, y+1);
}
return 0;
}

Preliminaries for Benelux Algorithm Programming Contest 2019的更多相关文章

  1. 2020.3.14--训练联盟周赛 Preliminaries for Benelux Algorithm Programming Contest 2019

    1.A题 题意:给定第一行的值表示m列的最大值,第m行的值表示n行的最大值,问是否会行列冲突 思路:挺简单的,不过我在一开始理解题意上用了些时间,按我的理解是输入两组数组,找出每组最大数,若相等则输出 ...

  2. ICPC训练联盟周赛Preliminaries for Benelux Algorithm Programming Contest 2019

    I题 求 a 数组平方的前缀和和求 a 数组后缀和,遍历一遍即可 AC代码 #include<iostream>#include<cmath>using namespace s ...

  3. 03.14 ICPC训练联盟周赛,Preliminaries for Benelux Algorithm Programming Contest 2019

    A .Architecture 题意:其实就是想让你找到两行数的最大值,然后比较是否相同,如果相同输出'possible',不同则输出'impossible' 思路:直接遍历寻找最大值,然后比较即可 ...

  4. ICPC训练周赛 Benelux Algorithm Programming Contest 2019

    D. Wildest Dreams 这道题的意思是Ayna和Arup两人会同时在车上一段时间,在Ayna在的时候,必须单曲循环Ayna喜欢的歌,偶数段Ayna下车,若此时已经放了她喜欢的那首歌,就要将 ...

  5. Benelux Algorithm Programming Contest 2019

    J. Jazz it Up!题目要求,n*m的因子中不能含有平方形式,且题目中已经说明n是一个无平方因子的数, 那么只要m是无平方因子的数,并且n和m没有共同的因子即可.要注意时间复杂度!代码:#in ...

  6. 2020.3.21--ICPC训练联盟周赛Benelux Algorithm Programming Contest 2019

    A Appeal to the Audience 要想使得总和最大,就要使最大值被计算的次数最多.要想某个数被计算的多,就要使得它经过尽量多的节点.于是我们的目标就是找到 k 条从长到短的链,这些链互 ...

  7. Benelux Algorithm Programming Contest 2014 Final(第二场)

    B:Button Bashing You recently acquired a new microwave, and noticed that it provides a large number ...

  8. 2014 Benelux Algorithm Programming Contest (BAPC 14)E

    题目链接:https://vjudge.net/contest/187496#problem/E E Excellent Engineers You are working for an agency ...

  9. 计蒜客 28319.Interesting Integers-类似斐波那契数列-递推思维题 (Benelux Algorithm Programming Contest 2014 Final ACM-ICPC Asia Training League 暑假第一阶段第二场 I)

    I. Interesting Integers 传送门 应该是叫思维题吧,反正敲一下脑壳才知道自己哪里写错了.要敢于暴力. 这个题的题意就是给你一个数,让你逆推出递推的最开始的两个数(假设一开始的两个 ...

随机推荐

  1. 【转载】一种git commit前自动格式化的方式

    查看原文 简介 这个系列为了解决一个问题:自动化的去管理代码风格和格式 前提:Linux,C语言,Clang 如何在每次commit的时候,将代码风格自动格式化后再提交commit,且格式化的内容必须 ...

  2. 转载 - Ubuntu源改国内源 与 批量更改ubuntu机器apt源

    change_apt_source.sh # !/bin/bash # 备份原来的源文件 cp /etc/apt/sources.list /etc/apt/sources.list.bak # 获取 ...

  3. Js中函数式编程的理解

    函数式编程的理解 函数式编程是一种编程范式,可以理解为是利用函数把运算过程封装起来,通过组合各种函数来计算结果.函数式编程与命令式编程最大的不同其实在于,函数式编程关心数据的映射,命令式编程关心解决问 ...

  4. win10/windows 安装Pytorch

    https://pytorch.org/get-started/locally/ 去官网,选择你需要的版本. 把 pip install torch==1.5.0+cu101 torchvision= ...

  5. 【EXP】比较大的dmp文件导入的时候可以将界面关掉

    有一个需求,将一个dmp文件导入到数据库中,但是这个crt的回话有timeout,3分钟,所以一到三分钟就掉线,导入就失败了,这让人很头疼,关闭界面,imp也就终止了 最后想到了几招,分享一下: 1. ...

  6. 【Oracle】查看oracle用户相关权限

    系统权限 SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'CHAXUN' UNION ALL SELECT * FROM DBA_SYS_PRIVS WHER ...

  7. Ubuntu Terminal命令行新建仓库并推送到远程仓库

    通常情况下,在本地新建一个仓库之后,需要在远端网页端也新建一个空的同名仓库,然后将两者进行关联才能推送. 那有没有办法直接在命令行就完成从新建到推送的过程而不需要中间在网页端也操作一番呢?办法当然是有 ...

  8. SAP 技术设置(technical setting)

    在创建数据库表的时候,需要设置它的技术参数:这样才能使用. 在技术设置里,有个数据类(data class),如APPL0,等等. 有好多值可以供我们选择.这些值保存在表DDART中,表的描述:DD: ...

  9. Spring Bean详解

    Spring Bean 在Spring的应用中,Spring IoC容器可以创建.装配和配置应用组件对象,这里的组件对象称为Bean. Bean的配置 Spring可以看作一个大型工厂,用于生产和管理 ...

  10. javascript判断浏览器访问,刷新,返回

    话不多说,直接上 if (window.performance.navigation.type === 0/* 正常访问 */) { // 你要干的事 } else if (window.perfor ...