A - Move and Win

题解

看两个人相遇的时候谁先手即可,相遇之后第一个移动的人必输

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define mo 974711
#define MAXN 2005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
int N,A,B; int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
read(N);read(A);read(B);
int t = abs(B - A - 1);
if(t & 1) puts("Alice");
else puts("Borys");
return 0;
}

B - Ice Rink Game

题解

二分直接判断即可

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define mo 974711
#define MAXN 100005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
int K;
int64 A[MAXN];
int64 check(int64 x) {
for(int i = 1 ; i <= K ; ++i) {
x -= x % A[i];
}
return x;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
read(K);
for(int i = 1 ; i <= K ; ++i) read(A[i]);
int64 L = 2,R = 1e18;
while(L < R) {
int64 mid = (L + R) >> 1;
if(check(mid) >= 2) R = mid;
else L = mid + 1;
}
if(check(R) != 2) {puts("-1");return 0;}
out(R);space;
R = 1e18;
while(L < R) {
int64 mid = (L + R + 1) >> 1;
if(check(mid) <= 2) L = mid;
else R = mid - 1;
}
out(R);enter;
}

C - Median Sum

题解

我们把子序列两两配对

也就是一个子序列选了其中的k个,另一个子序列选了其中的n - k个,进行配对

显然我们一个对内的子序列,肯定一个小于等于\(\frac{sum[n]}{2}\)

另一个大于等于\(\frac{sum[n]}{2}\)

由于全集没有配对,所以肯定中位数就是大于等于\(\frac{sum[n]}{2}\)的第一个

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define mo 974711
#define MAXN 200005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
int N,a[MAXN],s,cur;
bitset<4000005> dp[2];
void Solve() {
read(N);
for(int i = 1 ; i <= N ; ++i) {read(a[i]);s += a[i];}
dp[cur].reset();
dp[cur][0] = 1;
for(int i = 1 ; i <= N ; ++i) {
dp[cur ^ 1] = (dp[cur] << a[i]) | dp[cur];
cur ^= 1;
}
for(int i = (s - 1) / 2 + 1; i <= s ; ++i) {
if(dp[cur][i]) {
out(i);enter;return;
}
}
} int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}

D - Min Max Repetition

题解

过于恶心的分类讨论题

首先我们用二分求出最小的k满足题意

求法可以是默认把A尽可能按k分块然后往能放的空隙里放B,之后默认把B尽可能按k分块然后能放的空隙里放A

之后呢,我们特判掉A和B分的段数不相等的情况

也就是A是1 1 1 1,B尽可能按k分块

B是1 1 1 1,A尽可能按k分块

之后A和B的段数就相等了

前面肯定是A有k个B有1个A有k个B有1个

后面肯定是A有1个B有k个A有1个B有k个

我们二分一个两者的段数

要求A第一个不为k的地方不可以在B第一个不为k之前两个

且长度最大

可以二分

然后我们把A的每段长度求出来,相同长度的记录一个重复次数

B同理

之后我们拿两个指针每段合并

合并的时候同时求一下这段如果要输出某一部分是哪里

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define pll pair<int64,int64>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define mo 974711
#define MAXN 200005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
} int64 A,B,C,D,ML;
vector<pll > vA,vB;
bool check(int64 a,int64 b,int64 k) {
int64 t = (a - 1) / k;
if(b < t) return false;
t += 2;
if(b > t * k) return false;
return true;
}
void Process(int64 l,int64 r) {
int p = 0,q = 0;
int64 len = 1;
int64 c = 0;
while(len <= ML) {
int64 t = min(vA[p].se,vB[q].se);
vA[p].se -= t;vB[q].se -= t;
if(len >= l) {
int64 k = t;
while(k--) {
for(int64 i = 1 ; i <= vA[p].fi ; ++i) {
putchar('A');++c;
if(c == r - l + 1) return;
}
for(int64 i = 1 ; i <= vB[q].fi ; ++i) {
putchar('B');++c;
if(c == r - l + 1) return;
}
}
}
else if(len + t * (vA[p].fi + vB[q].fi) - 1 >= l){
int64 k = (l - len) % (vA[p].fi + vB[q].fi) + 1;
int64 h = t - (l - len) / (vA[p].fi + vB[q].fi);
--h;
if(k <= vA[p].fi) {
for(int64 i = k ; i <= vA[p].fi ; ++i) {
putchar('A');++c;
if(c == r - l + 1) return;
}
for(int64 i = 1 ; i <= vB[q].fi ; ++i) {
putchar('B');++c;
if(c == r - l + 1) return;
}
}
else {
k -= vA[p].fi;
for(int64 i = k ; i <= vB[q].fi ; ++i) {
putchar('B');++c;
if(c == r - l + 1) return;
}
}
while(h--) {
for(int64 i = 1 ; i <= vA[p].fi ; ++i) {
putchar('A');++c;
if(c == r - l + 1) return;
}
for(int64 i = 1 ; i <= vB[q].fi ; ++i) {
putchar('B');++c;
if(c == r - l + 1) return;
}
}
}
len += t * (vA[p].fi + vB[q].fi);
if(vA[p].se == 0) ++p;
if(vB[q].se == 0) ++q;
}
}
void Solve() {
read(A);read(B);read(C);read(D);
int64 L = 1,R = max(A,B);
ML = (A + B);
while(L < R) {
int64 mid = (L + R) >> 1;
if(check(A,B,mid) || check(B,A,mid)) R = mid;
else L = mid + 1;
}
vA.clear();vB.clear();
if(A == ((B - 1) / L)) {
int64 t = B / L;
int64 rem = B - L * t;
vA.pb(mp(0,1));
vA.pb(mp(1,A));
if(rem) vB.pb(mp(rem,1));
vB.pb(mp(L,t));
}
else if(B == (A - 1) / L){
int64 t = A / L;
int64 rem = A - t * L;
vA.pb(mp(L,t));
if(rem) vA.pb(mp(rem,1));
vB.pb(mp(1,B));vB.pb(mp(0,1));
}
else {
int64 l = max((A - 1) / L + 1,(B - 1) / L + 1),r = min(A,B);
while(l < r) {
int64 m = (l + r + 1) >> 1;
int64 ta = (A - m) / (L - 1);
int64 tb = (B - m) / (L - 1);
ta = ta * 2 + 1;
tb = 2 * m - (tb * 2);
if(ta + 1 < tb) r = m - 1;
else l = m;
}
if(A > l) {
int64 ka = (A - l - 1) / (L - 1);
int64 rem = A - l - ka * (L - 1);
vA.pb(mp(L,ka));vA.pb(mp(1 + rem,1));vA.pb(mp(1,l - ka - 1));
}
else vA.pb(mp(1,l));
if(B > l) {
int64 kb = (B - l - 1) / (L - 1);
int64 rem = B - l - kb * (L - 1);
vB.pb(mp(1,l - kb - 1));vB.pb(mp(1 + rem,1));vB.pb(mp(L,kb));
}
else vB.pb(mp(1,l));
}
Process(C,D);
enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
int Q;
read(Q);
while(Q--) {
Solve();
}
}

E - Encoding Subsets

题解

这题很迷,复杂度很迷

记录\(f(S)\)表示\(S\)字符串的答案

然后要么第一个字符不要\(f(S) += (s[0] + 1)f(2...|S|)\)

要么就是我枚举一个长度,枚举一个压缩次数

每段都取一个按位且的值,然后计算这个字符串压缩方案数,之后再加上后面的字符串压缩方法

写起来容易一点可以写成记搜,然后用map记录每个string的答案

跑了不到2s,复杂度超级迷

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define pll pair<int64,int64>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define mo 974711
#define MAXN 200005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
const int MOD = 998244353; int inc(int a,int b) {
return a + b >= MOD ? a + b - MOD : a + b;
}
int mul(int a,int b) {
return 1LL * a * b % MOD;
}
void update(int &x,int y) {
x = inc(x,y);
}
map<string,int> mm;
string operator & (const string &a,const string &b) {
int l = a.length();
string c(l,'0');
for(int i = 0 ; i < l ; ++i) {
if(a[i] == '1' && b[i] == '1') c[i] = '1';
}
return c;
}
int dfs(string s) {
if(s.empty()) return 1;
if(s.length() == 1) return s[0] == '0' ? 1 : 2;
if(mm.count(s)) return mm[s];
int res = 0;
res = mul(s[0] == '1' ? 2 : 1,dfs(s.substr(1)));
int l = s.length();
for(int d = 1 ; d <= l ; ++d) {
string t = s.substr(0,d);
for(int k = d ; k <= l ; k += d) {
if(k + d - 1 >= l) break;
t = t & s.substr(k,d);
update(res,mul(dfs(t),dfs(s.substr(k + d))));
}
}
mm[s] = res;
return res;
}
void Solve() {
string s;
cin >> s;
out(dfs(s));enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}

F - Arcs on a Circle

题解

把最长的一段挑出来,一个端点作为0

然后把剩下\(N - 1\)放置的点的位置分成整数部分和小数部分

我们枚举一个排列,是N - 1个点小数的排列顺序,可以认为排列互不相同

然后可以抽象出\(C * N\)个点,第\(i\)行第\(j\)列表示整数部分是\(i\)小数部分排行为\(j\)

记录一个dp[a][b][S]表示当前在\(a\)点,最远能到b点,选了点状态为S

答案就是dp[C * N][C * N][2^{N - 1} - 1]

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define pll pair<int64,int64>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define mo 974711
#define MAXN 200005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
int a[15],L[15],N,C;
bool vis[15];
int64 f[2][305][(1 << 5) + 5];
db ans,pw;
void Process() {
memset(f,0,sizeof(f));
int cur = 0;
f[cur][min(C * N,L[N] * N)][0] = 1;
for(int i = 1 ; i < C * N ; ++i) {
if(i % N == 0) continue;
memset(f[cur ^ 1],0,sizeof(f[cur ^ 1]));
int t = i % N - 1;
for(int j = i ; j <= C * N ; ++j) {
for(int k = 0 ; k < (1 << N - 1) ; ++k) {
if(!f[cur][j][k]) continue;
f[cur ^ 1][j][k] += f[cur][j][k];
if(k & (1 << t)) continue;
f[cur ^ 1][min(C * N,max(j,i + L[a[t + 1]] * N))][k ^ (1 << t)] += f[cur][j][k];
}
}
cur ^= 1;
}
ans += f[cur][C * N][(1 << N - 1) - 1];
}
void dfs(int dep) {
if(dep >= N) {
Process();return;
}
for(int i = 1 ; i < N ; ++i) {
if(!vis[i]) {
a[dep] = i;
vis[i] = 1;
dfs(dep + 1);
vis[i] = 0;
}
}
}
void Solve() {
read(N);read(C);
for(int i = 1 ; i <= N ; ++i) read(L[i]);
sort(L + 1,L + N + 1);
pw = 1;
for(int i = 1 ; i < N ; ++i) pw = pw * C;
dfs(1);
ans *= 1.0 / pw;
pw = 1.0;
for(int i = 2 ; i < N ; ++i) pw = pw * i;
ans *= 1.0 / pw;
printf("%.11lf\n",ans);
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}

【AtCoder】AGC020的更多相关文章

  1. 【AtCoder】ARC092 D - Two Sequences

    [题目]AtCoder Regular Contest 092 D - Two Sequences [题意]给定n个数的数组A和数组B,求所有A[i]+B[j]的异或和(1<=i,j<=n ...

  2. 【Atcoder】CODE FESTIVAL 2017 qual A D - Four Coloring

    [题意]给定h,w,d,要求构造矩阵h*w满足任意两个曼哈顿距离为d的点都不同色,染四色. [算法]结论+矩阵变换 [题解] 曼哈顿距离是一个立着的正方形,不方便处理.d=|xi-xj|+|yi-yj ...

  3. 【AtCoder】ARC 081 E - Don't Be a Subsequence

    [题意]给定长度为n(<=2*10^5)的字符串,求最短的字典序最小的非子序列字符串. http://arc081.contest.atcoder.jp/tasks/arc081_c [算法]字 ...

  4. 【AtCoder】AGC022 F - Leftmost Ball 计数DP

    [题目]F - Leftmost Ball [题意]给定n种颜色的球各k个,每次以任意顺序排列所有球并将每种颜色最左端的球染成颜色0,求有多少种不同的颜色排列.n,k<=2000. [算法]计数 ...

  5. 【AtCoder】AGC005 F - Many Easy Problems 排列组合+NTT

    [题目]F - Many Easy Problems [题意]给定n个点的树,定义S为大小为k的点集,则f(S)为最小的包含点集S的连通块大小,求k=1~n时的所有点集f(S)的和取模92484403 ...

  6. 【AtCoder】ARC067 F - Yakiniku Restaurants 单调栈+矩阵差分

    [题目]F - Yakiniku Restaurants [题意]给定n和m,有n个饭店和m张票,给出Ai表示从饭店i到i+1的距离,给出矩阵B(i,j)表示在第i家饭店使用票j的收益,求任选起点和终 ...

  7. 【AtCoder】ARC095 E - Symmetric Grid 模拟

    [题目]E - Symmetric Grid [题意]给定n*m的小写字母矩阵,求是否能通过若干行互换和列互换使得矩阵中心对称.n,m<=12. [算法]模拟 [题解]首先行列操作独立,如果已确 ...

  8. 【Atcoder】AGC022 C - Remainder Game 搜索

    [题目]C - Remainder Game [题意]给定n个数字的序列A,每次可以选择一个数字k并选择一些数字对k取模,花费2^k的代价.要求最终变成序列B,求最小代价或无解.n<=50,0& ...

  9. 【Atcoder】AGC 020 B - Ice Rink Game 递推

    [题意]n个人进行游戏,每轮只保留最大的a[i]倍数的人,最后一轮过后剩余2人,求最小和最大的n,或-1.n<=10^5. [算法]递推||二分 [题解]令L(i),R(i)表示第i轮过后的最小 ...

随机推荐

  1. Docker中Spring boot+VueJS+MongoDB的前后端分离哲学摔跤

    此文献给对数据有热情,想长期从事此行业的年轻人,希望对你们有所启发,并快速调整思路和方向,让自己的职业生涯有更好的发展. 根据数据应用的不同阶段,本文将从数据底层到最后应用,来谈谈那些数据人的必备技能 ...

  2. POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / SCU 1132 Invitation Cards / ZOJ 2008 Invitation Cards / HDU 1535 (图论,最短路径)

    POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / ...

  3. ASP.NET MVC验证框架中关于属性标记的通用扩展方法

    http://www.cnblogs.com/wlb/archive/2009/12/01/1614209.html 之前写过一篇文章<ASP.NET MVC中的验证>,唯一的遗憾就是在使 ...

  4. python装饰器中@wraps作用--修复被装饰后的函数名等属性的改变

    Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的de ...

  5. saltstack主机管理项目【day23】:主机管理项目需求分析-设计

    本节内容 一. 主机管理项目需求分析 二 .主机管理项目架构设计 三.主机管理项目初始构建 四. 主机管理项目编主机分发器 一. 主机管理项目需求分析 场景:我现在又一台裸机要实现一下人物 配置管理: ...

  6. 写一个Windows服务

    做了两个和Windows服务有关的项目了,最开始的时候没做过,不懂,现在明白了许多.需要注意的是,如果不想登录什么的,最后在添加安装程序的那里选择那个字长的右键属性,把启动方式改为local syst ...

  7. Spark记录-spark与storm比对与选型(转载)

    大数据实时处理平台市场上产品众多,本文着重讨论spark与storm的比对,最后结合适用场景进行选型. 一.spark与storm的比较 比较点 Storm Spark Streaming 实时计算模 ...

  8. 数学:莫比乌斯反演-GCD计数

    Luogu3455:莫比乌斯反演进行GCD计数 莫比乌斯反演就是用来解决这一类问题的,通常f函数是要求的那个,F函数是显然的 这样利用F的结果就可以推出来f的结果 在计算结果的时候整除分快儿一下就可以 ...

  9. javascript构造函数模块

    var Person = (function(){ var Constr; Constr = function(){ this.name = 'carl'; } Constr.prototype = ...

  10. jquery的clone方法bug的修复select,textarea的值丢失

    项目中多次使用了iframe,但是操作起来是比较麻烦,项目中的现实情况是最外面是一个form,里面嵌套一个iframe,下面是一个其他的数据,在form提交的时候将iframe的数据和其他的数据一块提 ...