Codeforces Edu Round 63(Rated for Div. 2)
感觉现在Edu场比以前的难多了……
A:
温暖人心
/* basic header */
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <cstring>
#include <cmath>
#include <cstdint>
#include <climits>
#include <float.h>
/* STL */
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <array>
#include <iterator>
/* define */
#define ll long long
#define dou double
#define pb emplace_back
#define mp make_pair
#define fir first
#define sec second
#define init(a,b) fill(begin(a),end(a),b)
#define sot(a,b) sort(a+1,a+1+b)
#define rep1(i,a,b) for(int i=a;i<=b;++i)
#define rep0(i,a,b) for(int i=a;i<b;++i)
#define repa(i,a) for(auto &i:a)
#define eps 1e-8
#define int_inf 0x3f3f3f3f
#define ll_inf 0x7f7f7f7f7f7f7f7f
#define lson curPos<<1
#define rson curPos<<1|1
/* namespace */
using namespace std;
/* header end */ const int maxn = 3e5 + ;
int n;
char s[maxn]; int main()
{
scanf("%d", &n);
scanf("%s", s + );
rep0(i, , n)
{
if (s[i] > s[i + ])
return cout << "YES" << endl << i << " " << i + , ;
}
puts("NO");
return ;
}
B:
数前n-10个数里几个8几个非8就完事了,正确性显然
/* basic header */
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <cstring>
#include <cmath>
#include <cstdint>
#include <climits>
#include <float.h>
/* STL */
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <array>
#include <iterator>
/* define */
#define ll long long
#define dou double
#define pb emplace_back
#define mp make_pair
#define fir first
#define sec second
#define init(a,b) fill(begin(a),end(a),b)
#define sot(a,b) sort(a+1,a+1+b)
#define rep1(i,a,b) for(int i=a;i<=b;++i)
#define rep0(i,a,b) for(int i=a;i<b;++i)
#define repa(i,a) for(auto &i:a)
#define eps 1e-8
#define int_inf 0x3f3f3f3f
#define ll_inf 0x7f7f7f7f7f7f7f7f
#define lson curPos<<1
#define rson curPos<<1|1
/* namespace */
using namespace std;
/* header end */ const int maxn = 1e5 + ;
char s[maxn];
int n, numOfEight = , re = ; int main()
{
scanf("%d", &n);
scanf("%s", s + );
rep1(i, , n - )
if (s[i] == '') numOfEight++; else re++;
if (numOfEight > re) puts("YES"); else puts("NO");
return ;
}
C:
计算所有时间区间gcd,找是否存在p能整除gcd,正确性显然
/* basic header */
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <cstring>
#include <cmath>
#include <cstdint>
#include <climits>
#include <float.h>
/* STL */
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <array>
#include <iterator>
/* define */
#define ll long long
#define dou double
#define pb emplace_back
#define mp make_pair
#define fir first
#define sec second
#define init(a,b) fill(begin(a),end(a),b)
#define sot(a,b) sort(a+1,a+1+b)
#define rep1(i,a,b) for(int i=a;i<=b;++i)
#define rep0(i,a,b) for(int i=a;i<b;++i)
#define repa(i,a) for(auto &i:a)
#define eps 1e-8
#define int_inf 0x3f3f3f3f
#define ll_inf 0x7f7f7f7f7f7f7f7f
#define lson curPos<<1
#define rson curPos<<1|1
/* namespace */
using namespace std;
/* header end */ const int maxn = 3e5 + ;
int n, m;
ll s, currX, lastX, currP, ansPos = , gcd; int main()
{
scanf("%d%d", &n, &m);
rep1(i, , n)
{
scanf("%lld", &currX);
if (i == ) s = currX;
else if (i == ) gcd = currX - lastX;
else gcd = __gcd(gcd, currX - lastX);
lastX = currX;
}
rep1(i, , m)
{
scanf("%lld", &currP);
if (!(gcd % currP)) ansPos = i;
}
if (!ansPos) puts("NO");
else printf("YES\n%lld %lld\n", s, ansPos);
return ;
}
D:
dp,然而我想的是数据结构……
dp做法是:定义一维数组f[maxn],f[i]代表从当前位置往后取能取到的最大区间和;定义二维数组dp[2][maxn],dp[0][i]表示从当前位置往前取能取到的最大区间和,dp[1][i]表示在乘x的情况下,从当前位置能取到的最大区间和。转移显而易见。
有个坑点是ans初始化应该是0而不是LONG_LONG_MIN
/* basic header */
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <cstring>
#include <cmath>
#include <cstdint>
#include <climits>
#include <float.h>
/* STL */
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <array>
#include <iterator>
/* define */
#define ll long long
#define dou double
#define pb emplace_back
#define mp make_pair
#define fir first
#define sec second
#define init(a,b) fill(begin(a),end(a),b)
#define sot(a,b) sort(a+1,a+1+b)
#define rep1(i,a,b) for(int i=a;i<=b;++i)
#define rep0(i,a,b) for(int i=a;i<b;++i)
#define repa(i,a) for(auto &i:a)
#define eps 1e-8
#define int_inf 0x3f3f3f3f
#define ll_inf 0x7f7f7f7f7f7f7f7f
#define lson curPos<<1
#define rson curPos<<1|1
/* namespace */
using namespace std;
/* header end */ const int maxn = 3e5 + ;
ll a[maxn], f[maxn], dp[][maxn], x, ans = ;
int n; int main()
{
scanf("%d%lld", &n, &x);
rep1(i, , n) scanf("%lld", &a[i]);
f[n + ] = ;
for (int i = n; i >= ; i--)
f[i] = max(a[i], f[i + ] + a[i]);
rep1(i, , n)
{
dp[][i] = max(a[i], dp[][i - ] + a[i]);
dp[][i] = a[i] * x;
if (max(dp[][i - ], dp[][i - ]) > )
dp[][i] += max(dp[][i - ], dp[][i - ]);
ans = max(ans, max(dp[][i], dp[][i] + f[i + ]));
ans = max(ans, dp[][i]);
}
printf("%lld\n", ans);
return ;
}
E:
edu都有交互了,简直丧心病狂。看到形如a0+a1*x+a2*x^2+...+an*x^n的多项式就很自然会想到拉格朗日插值法。
/* basic header */
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <cstring>
#include <cmath>
#include <cstdint>
#include <climits>
#include <float.h>
#include <complex>
/* STL */
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <array>
#include <iterator>
/* define */
#define ll long long
#define dou double
#define pb emplace_back
#define mp make_pair
#define fir first
#define sec second
#define init(a,b) fill(begin(a),end(a),b)
#define sot(a,b) sort(a+1,a+1+b)
#define rep1(i,a,b) for(int i=a;i<=b;++i)
#define rep0(i,a,b) for(int i=a;i<b;++i)
#define repa(i,a) for(auto &i:a)
#define eps 1e-8
#define int_inf 0x3f3f3f3f
#define ll_inf 0x7f7f7f7f7f7f7f7f
#define lson curPos<<1
#define rson curPos<<1|1
/* namespace */
using namespace std;
/* header end */ const int MOD = 1e6 + ; //定义mod P意义下的运算
#include <unordered_map>
struct Mod
{
const ll mod, sqrtMod;
Mod(ll p): mod(p), sqrtMod(sqrt(p) + 0.5) {} ll add(ll a, ll b)const
{
return ((a + b) % mod + mod) % mod;
} ll mul(ll a, ll b)const
{
while (a < ) a += mod; while (b < ) b += mod;
return a * b % mod;
} ll pow(ll a, ll b)const
{
ll ret = ;
for (a %= mod; b; b >>= , a = mul(a, a))
if (b & )
ret = mul(ret, a);
return ret;
} //乘法逆元
ll inv(ll a)const
{
while (a < ) a += mod;
return pow(a, mod - );
} ll log(ll a, ll b)const
{
unordered_map<ll, ll>x;
for (ll i = , e = ; i <= sqrtMod; i++, e = mul(e, a))
{
if (!x.count(e))
x[e] = i;
}
for (ll i = , v = inv(pow(a, sqrtMod)); i <= sqrtMod; i++, b = mul(b, v))
{
if (x.count(b))
return i * sqrtMod + x[b];
}
return -;
}
} m(MOD); //拉格朗日插值法
#define X real()
#define Y imag()
class Lagrange
{
public:
static vector<ll> solve(vector<complex<ll>> p)
{
vector<ll> ret(p.size()), sum(p.size());
ret[] = p[].Y, sum[] = ;
rep0(i, , p.size())
{
for (int j = p.size() - ; j >= i; j--)
p[j].imag(m.mul(p[j].Y - p[j - ].Y, m.inv(p[j].X - p[j - i].X)));
for (int j = i; ~j; j--)
{
sum[j] = m.add(j ? sum[j - ] : , -m.mul(sum[j], p[i - ].X));
ret[j] = m.add(ret[j], m.mul(sum[j], p[i].Y));
}
}
return ret;
}
}; int main()
{
vector<complex<ll>>v;
for (ll i = , x; i < ; i++)
{
printf("? %lld\n", i);
fflush(stdout);
scanf("%lld", &x);
if (!x)
return printf("! %lld\n", i), ;
v.push_back({i, x % m.mod});
}
vector<ll> ret = Lagrange().solve(v);
for (ll i = ; i < m.mod; i++)
{
ll sum = ;
for (ll j = , x = ; j < ret.size(); j++, x = m.mul(x, i))
sum = m.add(sum, m.mul(x, ret[j]));
if (sum == )
return printf("! %lld\n", i), ;
}
puts("! -1");
return ;
}
F:
给定一个无向图,满足边双联通。要求删去尽量多的边,使得剩下的子图在包含原图所有节点的情况下仍然满足边双。输出子图。
这里给个神仙用tarjan的做法,从67行开始就有点玄幻了……
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std; const int MAXN = ; struct node
{
int v, next, use;
} edge[MAXN << ]; bool bridge[MAXN];
int low[MAXN], dfn[MAXN], vis[MAXN];
int head[MAXN], pre[MAXN], ip, sol, Count, u[MAXN], v[MAXN], n, m, p[MAXN], i, viss[MAXN], s, ans = -, j, t[MAXN]; void init(void)
{
memset(head, -, sizeof(head));
memset(vis, false, sizeof(vis));
memset(bridge, false, sizeof(bridge));
Count = sol = ip = ;
} void addEdge(int u, int v)
{
edge[ip].v = v;
edge[ip].use = ;
edge[ip].next = head[u];
head[u] = ip++;
}
bool flag;
void tarjan(int u)
{
vis[u] = ;
dfn[u] = low[u] = Count++;
for (int i = head[u]; i != -; i = edge[i].next)
{
if (!edge[i].use)
{
edge[i].use = edge[i ^ ].use = ;
int v = edge[i].v;
if (!vis[v])
{
pre[v] = u;
tarjan(v);
low[u] = min(low[u], low[v]);
if (dfn[u] < low[v])
{
sol++;
flag = ;
}
}
else if (vis[v] == )
{
low[u] = min(low[u], dfn[v]);
}
}
}
vis[u] = ;
}
int main(void)
{
scanf("%d %d", &n, &m);
for (i = ; i <= m; i++) scanf("%d %d", &u[i], &v[i]);
for (i = ; i <= m; i++) p[i] = i;
for (int jo = ; jo <= ; jo++)
{
//随机建图
for (i = ; i <= ; i++)
{
int x = rand() % m + , y = rand() % m + ;
swap(p[x], p[y]);
}
memset(viss, , sizeof(viss));
for (i = ; i <= m; i++)
{
init();
viss[i] = ;
for (j = ; j <= m; j++)
if (!viss[j])
{
addEdge(u[p[j]], v[p[j]]);
addEdge(v[p[j]], u[p[j]]);
}
flag = ;
tarjan();
for (j = ; j <= n; j++)
if (vis[j] == )
flag = ;
if (!flag)
viss[i] = ;
}
s = ;
for (i = ; i <= m; i++)
if (viss[i] == )
s++;
if (ans < s)
{
ans = s;
int y = ;
for (i = ; i <= m; i++)
if (viss[i] == )
t[++y] = p[i];
}
}
cout << m - ans << endl;
for (i = ; i <= m - ans; i++)
printf("%d %d\n", u[t[i]], v[t[i]]);
return ;
}
Codeforces Edu Round 63(Rated for Div. 2)的更多相关文章
- Educational Codeforces Round 63 (Rated for Div. 2) 题解
Educational Codeforces Round 63 (Rated for Div. 2)题解 题目链接 A. Reverse a Substring 给出一个字符串,现在可以对这个字符串进 ...
- Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array (简单DP)
题目:https://codeforces.com/contest/1155/problem/D 题意:给你n,x,一个n个数的序列,你可以选择一段区间,区间的数都乘以x,然后求出最大字段和 思路: ...
- Educational Codeforces Round 63 (Rated for Div. 2) E 带模高斯消元
https://codeforces.com/contest/1155/problem/E 题意 \(f(x)=a_0+a_1x+a_2x^2+...+a_kx^k,k \leq 10,0 \leq ...
- Educational Codeforces Round 63 (Rated for Div. 2) D dp(最大连续子序列)
https://codeforces.com/contest/1155/problem/D 题意 一个n个数的数组\(a[i]\),可以选择连续的一段乘x,求最大连续子序列的值 题解 错误思路:贪心, ...
- Educational Codeforces Round 63 (Rated for Div. 2) B. Game with Telephone Numbers 博弈思维+模拟+贪心思维
题意:博弈题面 给出一个数字序列 (>=11) 有两个人任意删除数字 直到 数字只剩下11位 如果删除后的数字串开头是8那么就是第一个赢 否则就是第二个人赢 第一个人先手 数字序列一定是奇 ...
- Educational Codeforces Round 63 (Rated for Div. 2) C. Alarm Clocks Everywhere gcd
题意:给出一个递增的时间序列a 给出另外一个序列b (都是整数) 以b中任选一个数字作为间隔 自己从1开始任选一个时间当成开始时间 输出选择的数字标号以及 开始时间 思路 直接求间隔的公共gc ...
- Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array 分类讨论连续递推dp
题意:给出一个 数列 和一个x 可以对数列一个连续的部分 每个数乘以x 问该序列可以达到的最大连续序列和是多少 思路: 不是所有区间题目都是线段树!!!!!! 这题其实是一个很简单的dp 使用的是分 ...
- Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array(动态规划.递推)
传送门 题意: 给你一个包含 n 个元素的序列 a[]: 定义序列 a[] 的 beauty 为序列 a[] 的连续区间的加和最大值,如果全为负数,则 beauty = 0: 例如: a[] = {1 ...
- Educational Codeforces Round 63 (Rated for Div. 2)
传送门 A. Reverse a Substring 题意: 给你一串 s,让你判断能否通过反转区间[l,r]的元素,使得反转后的串的字典序小于 s: 如果能,输出 "YES",并 ...
随机推荐
- 二层协议--MPLS协议总结
1.MPLS是介于2层和3层之间的协议,主要应用在城域网中,作为集客专线.基站等承载VPN技术的关键技术. 2.MPLS利用MPLS标签进行转发,先通过IP单播路由的方式沿途分配好MPLS标签,分配完 ...
- iOS开发NSDate、NSString、时间戳之间的转化
//将UTCDate(世界标准时间)转化为当地时区的标准Date(钟表显示的时间) //NSDate *date = [NSDate date]; 2018-03-27 06:54:41 +0000 ...
- 安卓界面之Viewpager和Tablayout实现滑动界面
摘要:六部实现选项卡界面 一. 在gradle文件添加以下代码: implementation 'com.android.support:design:28.0.0' 在gradle文件添加以上代码后 ...
- linux网络 skb_buff
sbk_buff中的data_len指的是尾部带的page数据的长度,len指的是总共的data的长度,len-data_len是第一个线性buf的数据长度. sk_buff->len:表示当前 ...
- 在td中的输入英文为什么不自动换行???
在表格中如果输入纯汉字,表格中的内容会根据表格大小进行换行,若果一个老外不会写汉字,写了一堆英文,表格的宽度会拉的很长,超过规定宽度 解决方法是在table中加上style="table-l ...
- Linux下mysql5.7数据库root登录的问题
本文最后修改时间:20180313 root默认为空密码,默认远程无法登录. mysql5.7更新了user表,网上的方法试了很多,都有点问题 #先停止MySQL服务 $ sudo service m ...
- 不使用JS实现表单验证
我们可以给表单元素添加required,pattern属性,还有根据具体元素类型决定的Measureable属性,如:min,max等. required:表示必填. pattern:一般用于type ...
- CSS| 框模型-定位及相關屬性
CSS 定位 (Positioning) 属性允许你对元素进行定位. CSS 定位和浮动 CSS 为定位和浮动提供了一些属性,利用这些属性,可以建立列式布局,将布局的一部分与另一部分重叠,还可以完成多 ...
- macOS平台安装metasploit
1 在Github上克隆Metasploit git clone https://github.com/rapid7/metasploit-framework.git /usr/local/shar ...
- Orcale日期函数to_date(),to_char()
日期转换的两个函数分别是to_date()和to_char(),to_date() 作用将字符类型按一定格式转化为日期类型, to_char() 将日期转按一定格式换成字符类型 其中当时间需要精确的时 ...