感觉现在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)的更多相关文章

  1. Educational Codeforces Round 63 (Rated for Div. 2) 题解

    Educational Codeforces Round 63 (Rated for Div. 2)题解 题目链接 A. Reverse a Substring 给出一个字符串,现在可以对这个字符串进 ...

  2. Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array (简单DP)

    题目:https://codeforces.com/contest/1155/problem/D 题意:给你n,x,一个n个数的序列,你可以选择一段区间,区间的数都乘以x,然后求出最大字段和 思路: ...

  3. 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 ...

  4. Educational Codeforces Round 63 (Rated for Div. 2) D dp(最大连续子序列)

    https://codeforces.com/contest/1155/problem/D 题意 一个n个数的数组\(a[i]\),可以选择连续的一段乘x,求最大连续子序列的值 题解 错误思路:贪心, ...

  5. Educational Codeforces Round 63 (Rated for Div. 2) B. Game with Telephone Numbers 博弈思维+模拟+贪心思维

    题意:博弈题面  给出一个数字序列 (>=11)  有两个人任意删除数字 直到 数字只剩下11位 如果删除后的数字串开头是8那么就是第一个赢 否则就是第二个人赢 第一个人先手  数字序列一定是奇 ...

  6. Educational Codeforces Round 63 (Rated for Div. 2) C. Alarm Clocks Everywhere gcd

    题意:给出一个递增的时间序列a  给出另外一个序列b  (都是整数) 以b中任选一个数字作为间隔  自己从1开始任选一个时间当成开始时间 输出选择的数字标号以及 开始时间 思路  直接求间隔的公共gc ...

  7. Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array 分类讨论连续递推dp

    题意:给出一个 数列 和一个x 可以对数列一个连续的部分 每个数乘以x  问该序列可以达到的最大连续序列和是多少 思路: 不是所有区间题目都是线段树!!!!!! 这题其实是一个很简单的dp 使用的是分 ...

  8. Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array(动态规划.递推)

    传送门 题意: 给你一个包含 n 个元素的序列 a[]: 定义序列 a[] 的 beauty 为序列 a[] 的连续区间的加和最大值,如果全为负数,则 beauty = 0: 例如: a[] = {1 ...

  9. Educational Codeforces Round 63 (Rated for Div. 2)

    传送门 A. Reverse a Substring 题意: 给你一串 s,让你判断能否通过反转区间[l,r]的元素,使得反转后的串的字典序小于 s: 如果能,输出 "YES",并 ...

随机推荐

  1. 【Java入门提高篇】Day23 Java容器类详解(六)HashMap源码分析(中)

    上一篇中对HashMap中的基本内容做了详细的介绍,解析了其中的get和put方法,想必大家对于HashMap也有了更好的认识,本篇将从了算法的角度,来分析HashMap中的那些函数. HashCod ...

  2. C#委托之我见

    委托的使用方式很简单,了解一下基本语法就可以开撸了.但是使用委托的真正难题是不知道应用场景,就像习得了一门新功夫,但是却找不到任何施展拳脚的地方.这个难题一直困然着我,直到最近仿佛有所领悟,所以赶紧记 ...

  3. cmder个人配置文件,做个记录

    以下附件是自己的cmder配置文件: https://app.yinxiang.com/shard/s13/res/30e84035-5f0f-4baf-b18c-a84ce45ec8b9/wkkcm ...

  4. January 20th, 2018 Week 3rd Saturday

    We may encounter many defeats but we must not be defeated. 我们可能会失败很多次,但决不能被打败. As long as we are con ...

  5. git clone 遇到的坑

    问题描述: 使用git clone 拉代码遇到了需要输入密码的情况,但是我输入密码输入不了还有怎么都拉取不下代码 很郁闷的说~ 于是,我去问其他人,配置了我的SSH公匙,但是还是不行,我又去百度,果然 ...

  6. cf C. Finite or not? 数论

    You are given several queries. Each query consists of three integers pp, qq and bb. You need to answ ...

  7. 利用Apache AXIS 1 发布WebService

    首先,AXIS 是apache的作品. 1.到apache去下载相关的包,包括axis.jar.axis-ant.jar.commons-discovery-0.2.jar等.将jar包放到WEB-I ...

  8. Intellij Idea免费激活方法(转)

    文章转自  http://blog.csdn.net/u013772876/article/details/70763759 1.填入下面的license server: http://intelli ...

  9. css学习之样式层级和权重

    第一种情况 当选择器相同的情况下,引入方式的前后,决定页面最后的效果 ---------外部在最后面显示 ---------内部在最后面显示 第二种情况 引入方式相同时候,则是按照权重取最大(取权重最 ...

  10. mybatis基础系列(二)——基础语法、别名、输入映射、输出映射

    增删改查 mapper根节点及其子节点 mybatis框架需要读取映射文件创建会话工厂,映射文件是以<mapper>作为根节点,在根节点中支持9个元素,分别为insert.update.d ...