A - Always Online

Unsolved.

B - Beautiful Now

Solved.

题意:

给出一个n, k  每次可以将n这个数字上的某两位交换,最多交换k次,求交换后的最大和最小值

思路:

很明显有一种思路,对于最小值,尽可能把小的放前面, 对于最大值,尽可能把打的放前面。但是如果有多个最小数字或者最大数字会无法得出放哪个好,因此BFS一下即可

 #include<bits/stdc++.h>

 using namespace std;

 const int INF = 0x3f3f3f3f;
const int maxn = 1e5 + ; struct node{
int num, idx, step;
node(){}
node(int num, int idx, int step) :num(num), idx(idx), step(step){}
}; int n, k;
int cnt;
int arr[maxn]; int BFS1()
{
queue<node>q;
q.push(node(n, cnt, ));
int ans = INF;
while(!q.empty())
{
node now = q.front();
q.pop();
ans = min(ans, now.num);
if(now.step == k) continue;
if(now.idx == ) continue;
int tmp = now.num;
cnt = ;
while(tmp)
{
arr[++cnt] = tmp % ;
tmp /= ;
}
int Min = now.idx;
for(int i = now.idx - ; i >= ; --i)
{
if(arr[i] == arr[now.idx]) continue;
if(arr[i] == && now.idx == cnt) continue;
if(arr[i] < arr[Min]) Min = i;
}
if(Min == now.idx)
{
q.push(node(now.num, now.idx - , now.step));
}
else
{
for(int i = now.idx - ; i >= ; --i)
{
if(arr[i] == arr[Min])
{
swap(arr[i], arr[now.idx]);
tmp = ;
for(int j = cnt; j >= ; --j)
{
tmp = tmp * + arr[j];
}
q.push(node(tmp, now.idx - , now.step + ));
swap(arr[i], arr[now.idx]);
}
}
}
}
return ans;
} int BFS2()
{
queue<node>q;
q.push(node(n, cnt, ));
int ans = -INF;
while(!q.empty())
{
node now = q.front();
q.pop();
ans = max(ans, now.num);
if(now.step == k) continue;
if(now.idx == ) continue;
int tmp = now.num;
cnt = ;
while(tmp)
{
arr[++cnt] = tmp % ;
tmp /= ;
}
int Max = now.idx;
for(int i = now.idx - ; i >= ; --i)
{
if(arr[i] == arr[now.idx]) continue;
if(arr[i] > arr[Max]) Max = i;
}
if(Max == now.idx)
{
q.push(node(now.num, now.idx - , now.step));
}
else
{
for(int i = now.idx - ; i >= ; --i)
{
if(arr[i] == arr[Max])
{
swap(arr[i], arr[now.idx]);
tmp = ;
for(int j = cnt; j >= ; --j)
{
tmp = tmp * + arr[j];
}
q.push(node(tmp, now.idx - , now.step + ));
swap(arr[i], arr[now.idx]);
}
}
}
}
return ans;
} int main()
{
int t;
scanf("%d", &t);
while(t--)
{
scanf("%d %d", &n ,&k);
int tmp = n;
cnt = ;
while(tmp)
{
cnt++;
tmp /= ;
}
k = min(k, cnt - );
int ans1 = BFS1();
int ans2 = BFS2();
printf("%d %d\n", ans1, ans2);
}
return ;
}

C - Call It What You Want

Unsolved.

D - Daylight

Unsolved.

E - Everything Has Changed

Solved.

题意:

求多个圆的周长并

思路:

对于不想交和内含的直接continue,相切的直接相加。对于相交的可以减去大圆上的弧长,加上小圆的弧长

 #include<bits/stdc++.h>

 using namespace std;

 const double PI = acos(-1.0);
const double eps = 1e-; int sgn(double x)
{
if(fabs(x) < eps) return ;
else return x > ? : -;
} struct Point{
double x, y;
Point(){}
Point(double _x, double _y)
{
x = _x;
y = _y;
} double distance(Point p)
{
return hypot(x - p.x, y - p.y);
}
}P; int n;
double R, r; int main()
{
int t;
scanf("%d", &t);
while(t--)
{
scanf("%d %lf", &n, &R);
double ans = * R * PI;
for(int i = ; i <= n; ++i)
{
scanf("%lf %lf %lf", &P.x, &P.y, &r);
double dis = P.distance(Point(0.0, 0.0));
if(sgn(dis - (r + R)) >= ) continue;
else if(sgn(dis - (R - r)) < ) continue;
else if(sgn(dis - (R - r)) == )
{
ans += * PI * r;
continue;
}
double arc1 = (R * R + dis * dis - r * r) / (2.0 * R * dis);
arc1 = * acos(arc1);
double arc2 = (r * r + dis * dis - R * R) / (2.0 * r * dis);
arc2 = * acos(arc2);
ans -= R * arc1;
ans += r * arc2;
}
printf("%.10f\n", ans);
}
return ;
}

F - Fireflies

Unsolved.

G - Glad You Came

Upsolved.

题意:

m个区间操作,每次给$[L, R]区间内小于v 的数变为v$

思路:

线段树,维护最大最小值+剪枝,因为数据随机才可以这样做。

 #include <bits/stdc++.h>
using namespace std; #define N 5000010
#define M 100010
#define ui unsigned int
#define ll long long
int t, n, m;
ui x, y, z, w;
ui f[N << ];
ui MOD = (ui) << ; ui rng61()
{
x = x ^ (x << );
x = x ^ (x >> );
x = x ^ (x << );
x = x ^ (x >> );
w = x ^ y ^ z;
x = y;
y = z;
z = w;
return z;
} struct SEG
{
ui lazy[M << ], Max[M << ], Min[M << ];
void Init()
{
memset(lazy, , sizeof lazy);
memset(Max, , sizeof Max);
memset(Min, , sizeof Min);
}
void pushup(int id)
{
Max[id] = max(Max[id << ], Max[id << | ]);
Min[id] = min(Min[id << ], Min[id << | ]);
}
void pushdown(int id)
{
if (!lazy[id]) return;
lazy[id << ] = lazy[id];
Max[id << ] = lazy[id];
Min[id << ] = lazy[id];
lazy[id << | ] = lazy[id];
Max[id << | ] = lazy[id];
Min[id << | ] = lazy[id];
lazy[id] = ;
}
void update(int id, int l, int r, int ql, int qr, ui val)
{
if (Min[id] >= val) return;
if (l >= ql && r <= qr && Max[id] < val)
{
lazy[id] = Max[id] = val;
return;
}
pushdown(id);
int mid = (l + r) >> ;
if (ql <= mid) update(id << , l, mid, ql, qr, val);
if (qr > mid) update(id << | , mid + , r, ql, qr, val);
pushup(id);
}
int query(int id, int l, int r, int pos)
{
if (l == r) return Max[id];
pushdown(id);
int mid = (l + r) >> ;
if (pos <= mid) return query(id << , l, mid, pos);
else return query(id << | , mid + , r, pos);
}
}seg; int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d%d%u%u%u", &n, &m, &x, &y, &z);
for (int i = ; i <= * m; ++i) f[i] = rng61();
seg.Init();
for (int i = , l, r, v; i <= m; ++i)
{
l = f[ * i - ] % n + ;
r = f[ * i - ] % n + ;
v = f[ * i] % MOD;
if (l > r) swap(l, r);
seg.update(, , n, l, r, v);
}
ll res = ;
for (int i = ; i <= n; ++i)
res ^= (ll)seg.query(, , n, i) * (ll)i;
printf("%lld\n", res);
}
return ;
}

H - Hills And Valleys

Upsolved,

题意:

给出一个长为n的数字串,每一位范围是$[0, 9]$,可以翻转其中一段,使得最长非下降子序列最长

思路:

也就是说 可以存在这样一段

$0, 1, 2....., x, (x - 1) , y, (y - 1).... x, y + 1, y + 2..$

我们知道,如果不可以翻转,求最长上升子序列的话,我们可以将原串 和模式串$0123456789$ 求最长公共子序列

那么翻转的话,我们通过枚举翻转的区间$C(2, 10)$ 构造出上述的模式串,再求最长公共子序列

 #include <bits/stdc++.h>
using namespace std; #define N 100010
#define INF 0x3f3f3f3f
int t, n, m, a[N], b[];
int dp[N][], tl[N][], tr[N][], res, l, r, ql, qr; void solve()
{
for (int i = ; i <= m; ++i) dp[][i] = , tl[][i] = -, tr[][i] = -;
for (int i = ; i <= n; ++i) for (int j = ; j <= m; ++j)
{
dp[i][j] = dp[i - ][j];
tl[i][j] = tl[i - ][j];
tr[i][j] = tr[i - ][j];
if (a[i] == b[j])
{
++dp[i][j];
if (j == ql && tl[i][j] == -) tl[i][j] = i;
if (j == qr) tr[i][j] = i;
}
if (j > && dp[i][j - ] > dp[i][j])
{
dp[i][j] = dp[i][j - ];
tl[i][j] = tl[i][j - ];
tr[i][j] = tr[i][j - ];
}
}
if (ql == && qr == )
{
res = dp[n][m];
l = ;
r = ;
}
else if (dp[n][m] > res && tl[n][m] != - && tr[n][m] != -)
{
res = dp[n][m];
l = tl[n][m];
r = tr[n][m];
}
} int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
res = , l = , r = ;
for (int i = ; i <= n; ++i) scanf("%1d", a + i);
for (int i = ; i <= ; ++i) b[i] = i - ; m = ; ql = , qr = ;
solve();
for (int i = ; i < m; ++i) for (int j = i + ; j <= ; ++j)
{
m = ;
for (int pos = ; pos <= i; ++pos) b[++m] = pos - ;
ql = m + ;
for (int pos = j; pos >= i; --pos) b[++m] = pos - ;
qr = m;
for (int pos = j; pos <= ; ++pos) b[++m] = pos - ;
solve();
//for (int i = 1; i <= m; ++i) printf("%d%c", b[i], " \n"[i == m]);
}
printf("%d %d %d\n", res, l, r);
}
return ;
}

I - Innocence

Unsolved.

J - Just So You Know

Unsolved.

K - Kaleidoscope

Unsolved.

L - Lost In The Echo

Unsolved.

2018 Multi-University Training Contest 5 Solution的更多相关文章

  1. 2018 Multi-University Training Contest 1 Solution

    A - Maximum Multiple 题意:给出一个n 找x, y, z 使得$n = x + y +z$ 并且 $n \equiv 0 \pmod x, n \equiv 0 \pmod y, ...

  2. 2018 Multi-University Training Contest 2 Solution

    A - Absolute 留坑. B - Counting Permutations 留坑. C - Cover 留坑. D - Game puts("Yes") #include ...

  3. 2018 Multi-University Training Contest 3 Solution

    A - Problem A. Ascending Rating 题意:给出n个数,给出区间长度m.对于每个区间,初始值的max为0,cnt为0.遇到一个a[i] > ans, 更新ans并且cn ...

  4. 2018 Multi-University Training Contest 4 Solution

    A - Problem A. Integers Exhibition 留坑. B - Problem B. Harvest of Apples 题意:计算$\sum_{i = 0}^{i = m}C( ...

  5. 2018 Multi-University Training Contest 6 Solution

    A - oval-and-rectangle 题意:给出一个椭圆的a 和 b,在$[0, b]中随机选择c$ 使得四个顶点在椭圆上构成一个矩形,求矩形周长期望 思路:求出每种矩形的周长,除以b(积分) ...

  6. 2018 Multi-University Training Contest 7 Solution

    A - Age of Moyu 题意:给出一张图,从1走到n,如果相邻两次走的边的权值不同,花费+1, 否则花费相同,求最小花费 思路:用set记录有当前点的最小花费有多少种方案到达,然后最短路 #i ...

  7. 2018 Multi-University Training Contest 8 Solution

    A - Character Encoding 题意:用m个$0-n-1$的数去构成k,求方案数 思路:当没有0-n-1这个条件是答案为C(k+m-1, m-1),减去有大于的关于n的情况,当有i个n时 ...

  8. 2018 Multi-University Training Contest 9 Solution

    A - Rikka with Nash Equilibrium 题意:构造一个$n * m$的矩阵,使得$[1, n * m]$ 中每个数只出现一次,并且纳什均衡只出现一次. 思路:从大到小的放置,每 ...

  9. 2018 Multi-University Training Contest 10 Solution

    A - Problem A.Alkane 留坑. B - Problem B. Beads 留坑. C - Problem C. Calculate 留坑. D - Problem D. Permut ...

随机推荐

  1. Spring中通过构造方法传参数

    1.实体类 package com.xbq.bean;import java.util.Timer; /** * @ClassName: Student * @Description: TODO 学生 ...

  2. 第二篇:一个经典的比喻( 关于TCP连接API )

    前言 编程是对现实世界的模拟,网络通信自然也是对现实世界通信的模拟.可以将网络通信中使用的各种API和对现实世界中的各种通信设备进行通讯的操作进行对比以加深理解. 对比 socket() 函数 vs ...

  3. PHP-CGI 进程 CPU 100% 与 file_get_contents 函数的关系

    [文章作者:张宴 本文版本:v1.0 最后修改:2011.08.05 转载请注明原文链接:http://blog.s135.com/file_get_contents/] 有时候,运行 Nginx.P ...

  4. Oracle分页查询sql语句

    1. select * from ( select  t.*, rownum RN from TABLE_NAME  t ) where RN > 0 and RN <= 15 2. se ...

  5. SNMP信息泄露漏洞

    SNMP协议简介 名称:SNMP(Simple Network Management Protocol)简单网络管理协议 端口:161 协议:UDP 用途:SNMP代理者以变量呈现管理资料.管理系统透 ...

  6. FlipClock.js时钟,计数,3D翻转插件

    1.FlipClock.js能够自动定义计数,时钟的翻牌效果,调用简单,下面简单记录下用法 2.官网地址:http://www.flipclockjs.com/ 3.调用2个文件 <link h ...

  7. 【BZOJ1645】[Usaco2007 Open]City Horizon 城市地平线 离散化+线段树

    [BZOJ1645][Usaco2007 Open]City Horizon 城市地平线 Description Farmer John has taken his cows on a trip to ...

  8. mysql数据类型及存储过程

    转自:http://www.cnblogs.com/mark-chan/p/5384139.html 存储过程简介 SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为 ...

  9. 优雅的go语言--入门篇

    1.特点 1.静态类型,编译型的开源语言 2.脚本华的语法,支持多种编程范式(函数式&面向对象) 3.原生,给力的并发编程的支持 2.优势 1.脚本化的语法 2.静态类型+编译型,程序运行速度 ...

  10. zeptojs使用及介绍,手机端为什么一定要用zeptojs?

    zepto是和jQuery和类似的框架,由于jQuery内置了很多解决浏览器兼容性的代码,导致jQuery过于臃肿,对于移动端来说,不需要太过于考虑浏览器的兼容,所以就诞生zeptojs. 总的来说: ...