A. Adrien and Austin

大意: $n$个石子, 编号$1$到$n$, 两人轮流操作, 每次删除$1$到$k$个编号连续的石子, 不能操作则输, 求最后胜负情况.

删除一段后变成两堆, 可以用$sg$函数打表找规律

#include <iostream>
#include <cstdio>
using namespace std; int main() {
int n,k;
cin>>n>>k;
if (!n) return puts("Austin"),;
if (k!=) return puts("Adrien"),;
return puts(n&?"Adrien":"Austin");
}

D. Country Meow

大意: 给定空间$n$个点, 求构造一个点到$n$个点距离和最小.

等价于求一个最小的球覆盖所有的点, 可以三分套三分

E. Eva and Euro coins

大意: 给定$01$串$s$和$t$, 每次操作在$s$中选择一段连续相同的长为$k$的区间翻转, 求$s$是否能变为$t$

观察$1$: 操作可逆. 观察$2$: 长度为$k$的连续相同区间可以任意移动.

注意特判$k=1$

#include <iostream>
#include <sstream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <cstring>
#include <bitset>
#include <functional>
#include <random>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define PER(i,a,n) for(int i=n;i>=a;--i)
#define hr putchar(10)
#define pb push_back
#define lc (o<<1)
#define rc (lc|1)
#define mid ((l+r)>>1)
#define ls lc,l,mid
#define rs rc,mid+1,r
#define x first
#define y second
#define io std::ios::sync_with_stdio(false)
#define endl '\n'
#define DB(a) ({REP(__i,1,n) cout<<a[__i]<<',';hr;})
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int P = 1e9+, INF = 0x3f3f3f3f;
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
ll qpow(ll a,ll n) {ll r=%P;for (a%=P;n;a=a*a%P,n>>=)if(n&)r=r*a%P;return r;}
ll inv(ll x){return x<=?:inv(P%x)*(P-P/x)%P;}
inline int rd() {int x=;char p=getchar();while(p<''||p>'')p=getchar();while(p>=''&&p<='')x=x*+p-'',p=getchar();return x;}
//head const int N = 1e6+;
int n,k;
char s[N],t[N];
pii a[N]; void trans(char s[], int n) {
int top = ;
REP(i,,n) {
if (!top||a[top].x!=s[i]) a[++top]=pii(s[i],);
else if (++a[top].y==k) --top;
}
int cnt = ;
REP(i,,top) while (a[i].y--) s[++cnt] = a[i].x;
REP(i,cnt+,n) s[i] = '';
} int main() {
scanf("%d%d%s%s",&n,&k,s+,t+);
if (k==) return puts("Yes"),;
trans(s,n),trans(t,n);
puts(strcmp(s+,t+)?"No":"Yes");
}

G. Pyramid

大意: 求$n$层等边三角形中等边三角形的个数.

打表然后插值求系数, 答案为$\frac{n}{4}+\frac{11n^2}{24}+\frac{n^3}{4}+\frac{n^4}{24}$

#include <iostream>
#include <set>
#include <queue>
#define x first
#define y second
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define PER(i,a,n) for(int i=n;i>=a;--i)
using namespace std;
typedef pair<int,int> pii;
int n;
set<pii> s; void dfs(int d, int x, int y) {
if (d>n) return;
if (s.count(pii(x,y))) return;
s.insert(pii(x,y));
dfs(d+,x-,y+);
dfs(d+,x+,y+);
}
int dis(pii u, pii v) {
return (u.x-v.x)*(u.x-v.x)+*(u.y-v.y)*(u.y-v.y);
}
int main() {
cin>>n;
dfs(,,);
vector<pii> v(s.begin(),s.end());
int sz = v.size(), ans = ;
REP(i,,sz-) REP(j,i+,sz-) REP(k,j+,sz-) {
int q=dis(v[i],v[j]),w=dis(v[i],v[k]),e=dis(v[j],v[k]);
if (q==w&&w==e) ++ans;
}
printf("%d\n",ans);
}

暴力代码

H. Huge Discount

大意: 给定一个长$n$的串$s$, 只含数字'0','1','2', 有$n$个商品, 第$i$个商品价格为s[i...n]. 对于一个商品, 每次操作选两个连续且不相同的数删除, 可以进行任意次操作. 求$n$个商品最小价格和.

I. Magic Potion

大意: $n$个英雄, $m$个怪物, 给定每个英雄能杀死的怪物集合, 每个英雄只能从中选一个杀死. 可以选出$k$个英雄多杀一次, 求最大能杀怪物数.

最大流水题, 开个虚拟结点, 源点向虚拟结点连$k$即可.

#include <iostream>
#include <sstream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <cstring>
#include <bitset>
#include <functional>
#include <random>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define PER(i,a,n) for(int i=n;i>=a;--i)
#define hr putchar(10)
#define pb push_back
#define lc (o<<1)
#define rc (lc|1)
#define mid ((l+r)>>1)
#define ls lc,l,mid
#define rs rc,mid+1,r
#define x first
#define y second
#define io std::ios::sync_with_stdio(false)
#define endl '\n'
#define DB(a) ({REP(__i,1,n) cout<<a[__i]<<',';hr;})
using namespace std;
typedef long long ll;
const int N = 1e6+;
const int SS = N-, S = N-, T = N-, INF = 0x3f3f3f3f;
int n, m, k;
struct edge {
int to,w,next;
edge(int to=,int w=,int next=):to(to),w(w),next(next){}
} e[N];
int head[N], dep[N], vis[N], cur[N], cnt=;
queue<int> Q;
int bfs() {
REP(i,,n+m) dep[i]=INF,vis[i]=,cur[i]=head[i];
REP(i,SS,T) dep[i]=INF,vis[i]=,cur[i]=head[i];
dep[S]=,Q.push(S);
while (Q.size()) {
int u = Q.front(); Q.pop();
for (int i=head[u]; i; i=e[i].next) {
if (dep[e[i].to]>dep[u]+&&e[i].w) {
dep[e[i].to]=dep[u]+;
Q.push(e[i].to);
}
}
}
return dep[T]!=INF;
}
int dfs(int x, int w) {
if (x==T) return w;
int used = ;
for (int i=cur[x]; i; i=e[i].next) {
cur[x] = i;
if (dep[e[i].to]==dep[x]+&&e[i].w) {
int f = dfs(e[i].to,min(w-used,e[i].w));
if (f) used+=f,e[i].w-=f,e[i^].w+=f;
if (used==w) break;
}
}
return used;
}
int dinic() {
int ans = ;
while (bfs()) ans+=dfs(S,INF);
return ans;
}
void add(int u, int v, int w) {
e[++cnt] = edge(v,w,head[u]);
head[u] = cnt;
e[++cnt] = edge(u,,head[v]);
head[v] = cnt;
} int main() {
scanf("%d%d%d",&n,&m,&k);
add(S,SS,k);
REP(i,,n) {
add(S,i,);
add(SS,i,);
int t;
scanf("%d",&t);
while (t--) {
int x;
scanf("%d",&x);
add(i,n+x,);
}
}
REP(i,,m) add(n+i,T,);
printf("%d\n",dinic());
}

J. Prime Game

大意: 给定序列$a$, 设$fac(l,r)$为$[l,r]$区间积的素因子个数, 求$\sum\limits_{i=1}^n\sum\limits_{j=i}^n fac(i,j)$

计算出每种素因子所在的区间即可

#include <iostream>
#include <sstream>
#include <algorithm>
#include <cstdio>
#include <math.h>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <string.h>
#include <bitset>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define PER(i,a,n) for(int i=n;i>=a;--i)
#define hr putchar(10)
#define pb push_back
#define lc (o<<1)
#define rc (lc|1)
#define mid ((l+r)>>1)
#define ls lc,l,mid
#define rs rc,mid+1,r
#define x first
#define y second
#define io std::ios::sync_with_stdio(false)
#define endl '\n'
#define DB(a) ({REP(__i,1,n) cout<<a[__i]<<' ';hr;})
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int P = 1e9+, P2 = , INF = 0x3f3f3f3f;
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
ll qpow(ll a,ll n) {ll r=%P;for (a%=P;n;a=a*a%P,n>>=)if(n&)r=r*a%P;return r;}
ll inv(ll x){return x<=?:inv(P%x)*(P-P/x)%P;}
inline int rd() {int x=;char p=getchar();while(p<''||p>'')p=getchar();while(p>=''&&p<='')x=x*+p-'',p=getchar();return x;}
//head const int N = 1e6+;
int n, mi[N], a[N];
vector<int> g[N];
int main() {
REP(i,,N-) mi[i]=i;
REP(i,,N-) if (mi[i]==i) {
for (int j=i;j<N;j+=i) mi[j]=min(mi[j],i);
}
scanf("%d", &n);
REP(i,,n) {
scanf("%d", a+i);
while (a[i]!=) g[mi[a[i]]].pb(i),a[i]/=mi[a[i]];
}
ll ans = ;
REP(i,,N-) if (g[i].size()) {
ll t = (ll)n*(n+)/;
int now = ;
g[i].pb(n+);
for (int j:g[i]) {
t -= (ll)(j-now)*(j-now+)/;
now = j+;
}
ans += t;
}
printf("%lld\n", ans);
}

M. Mediocre String Problem

大意: 给定串$s,t$, 求三元组$(i,j,k)$的个数, 满足$j-i+1>k$且$s[i,j]+t[1,k]$为回文串

合法方案一定是$s$中与$t$的一段前缀对称, 然后中间再连上一段回文串.

exkmp求出最长匹配前缀, pam求出每个位置开头的回文串数

#include <iostream>
#include <sstream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <cstring>
#include <bitset>
#include <functional>
#include <random>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define PER(i,a,n) for(int i=n;i>=a;--i)
#define hr putchar(10)
#define pb push_back
#define lc (o<<1)
#define rc (lc|1)
#define mid ((l+r)>>1)
#define ls lc,l,mid
#define rs rc,mid+1,r
#define x first
#define y second
#define io std::ios::sync_with_stdio(false)
#define endl '\n'
#define DB(a) ({REP(__i,1,n) cout<<a[__i]<<',';hr;})
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int P = 1e9+, INF = 0x3f3f3f3f;
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
ll qpow(ll a,ll n) {ll r=%P;for (a%=P;n;a=a*a%P,n>>=)if(n&)r=r*a%P;return r;}
ll inv(ll x){return x<=?:inv(P%x)*(P-P/x)%P;}
inline int rd() {int x=;char p=getchar();while(p<''||p>'')p=getchar();while(p>=''&&p<='')x=x*+p-'',p=getchar();return x;}
//head const int N = 4e6+;
void init(char *s, int *z, int n) {
int mx=,l=;
REP(i,,n-) {
z[i] = i<mx?min(mx-i,z[i-l]):;
while (s[z[i]]==s[i+z[i]]) ++z[i];
if (i+z[i]>mx) mx=i+z[i],l=i;
}
} int n, m, tot, cnt, last, fac[N];
int fail[N], len[N], ch[N][], num[N];
ll sum[N];
char ss[N]; int getfail(int x) {
while (ss[cnt-len[x]-]!=ss[cnt]) x=fail[x];
return x;
}
int insert(int c) {
ss[++cnt] = c;
int p = getfail(last);
if (!ch[p][c]) {
len[++tot] = len[p]+;
fail[tot]=ch[getfail(fail[p])][c];
ch[p][c]=tot;
num[tot]=num[fail[tot]]+;
}
last = ch[p][c];
return num[last];
}
void clear() {
REP(i,,tot) {
memset(ch[i],,sizeof ch[]);
num[i]=len[i]=fail[i]=;
}
ss[]='#',fail[]=,last=;
len[]=,len[]=-,tot=,cnt=;
} char s[N], t[N];
int c[N],z[N]; int main() {
scanf("%s%s",s,t);
n = strlen(s);
m = strlen(t);
clear();
PER(i,,n-) c[i]=insert(s[i]);
reverse(s,s+n);
t[m] = '?';
strcat(t,s);
init(t,z,n+m+);
ll ans = ;
REP(i,m+,n+m) ans += (ll)z[i]*c[n+-i+m];
printf("%lld\n", ans);
}

The 2018 ACM-ICPC Asia Nanjing Regional Programming Contest的更多相关文章

  1. Gym 2009-2010 ACM ICPC Southwestern European Regional Programming Contest (SWERC 2009) A. Trick or Treat (三分)

    题意:在二维坐标轴上给你一堆点,在x轴上找一个点,使得该点到其他点的最大距离最小. 题解:随便找几个点画个图,不难发现,答案具有凹凸性,有极小值,所以我们直接三分来找即可. 代码: int n; lo ...

  2. 2019 ICPC Asia Nanjing Regional

    2019 ICPC Asia Nanjing Regional A - Hard Problem 计蒜客 - 42395 若 n = 10,可以先取:6,7,8,9,10.然后随便从1,2,3,4,5 ...

  3. Gym - 101981K The 2018 ICPC Asia Nanjing Regional Contest K.Kangaroo Puzzle 暴力或随机

    题面 题意:给你1个20*20的格子图,有的是障碍有的是怪,你可以每次指定上下左右的方向,然后所有怪都会向那个方向走, 如果2个怪撞上了,就融合在一起,让你给不超过5w步,让所有怪都融合 题解:我们可 ...

  4. Gym - 101981M The 2018 ICPC Asia Nanjing Regional Contest M.Mediocre String Problem Manacher+扩增KMP

    题面 题意:给你2个串(长度1e6),在第一个串里找“s1s2s3”,第二个串里找“s4”,拼接后,是一个回文串,求方案数 题解:知道s1和s4回文,s2和s3回文,所以我们枚举s1的右端点,s1的长 ...

  5. Gym - 101981G The 2018 ICPC Asia Nanjing Regional Contest G.Pyramid 找规律

    题面 题意:数一个n阶三角形中,有多少个全等三角形,n<=1e9 题解:拿到题想找规律,手画开始一直数漏....,最后还是打了个表 (打表就是随便定个点为(0,0),然后(2,0),(4,0), ...

  6. Gym - 101981I The 2018 ICPC Asia Nanjing Regional Contest I.Magic Potion 最大流

    题面 题意:n个英雄,m个怪兽,第i个英雄可以打第i个集合里的一个怪兽,一个怪兽可以在多个集合里,有k瓶药水,每个英雄最多喝一次,可以多打一只怪兽,求最多打多少只 n,m,k<=500 题解:显 ...

  7. Gym - 101981D The 2018 ICPC Asia Nanjing Regional Contest D.Country Meow 最小球覆盖

    题面 题意:给你100个三维空间里的点,让你求一个点,使得他到所有点距离最大的值最小,也就是让你找一个最小的球覆盖掉这n个点 题解:红书模板题,这题也因为数据小,精度也不高,所以也可以用随机算法,模拟 ...

  8. Gym - 101981J The 2018 ICPC Asia Nanjing Regional Contest J.Prime Game 计数

    题面 题意:1e6的数组(1<a[i]<1e6),     mul (l,r) =l × (l+1) ×...× r,  fac(l,r) 代表 mul(l,r) 中不同素因子的个数,求s ...

  9. Gym - 101981A The 2018 ICPC Asia Nanjing Regional Contest A.Adrien and Austin 简单博弈

    题面 题意:一堆有n个石子,编号从1⋯N排成一列,两个人Adrien 和Austin玩游戏,每次可以取1⋯K个连续编号的石子,Adrien先手,谁不能取了则输 题解:k==1时,显然和n奇偶相关,当k ...

随机推荐

  1. variant变异 | Epigenome表观基因组 | Disease-susceptible gene 疾病易感基因

    paper:cepip: context-dependent epigenomic weighting for prioritization of regulatory variants and di ...

  2. 浏览器cookie数 跨站请求伪造 欧盟Cookie指令

    <?php for ($w=0; $w < 200 ; $w++) { setcookie('name'.$w,'value'.$w, time()+3600*10 ); } var_du ...

  3. 数据包分析中Drop和iDrop的区别

    数据包分析中Drop和iDrop的区别   在数据包分析中,Drop表示因为过滤丢弃的包.为了区分发送和接受环节的过滤丢弃,把Drop又分为iDrop和Drop.其中,iDrop表示接受环节丢弃的包, ...

  4. Vue中的路由 以及默认路由跳转

    https://router.vuejs.org/ vue路由配置: 1.安装 npm install vue-router --save / cnpm install vue-router --sa ...

  5. winform使用委托和事件在窗体之间传值

    定义委托和事件,并且触发这个事件 //定义委托 public delegate void ShowOutStockDelegate(List<OutStockResultDto> outS ...

  6. Spring Cloud微服务安全实战-1-1 课程导学

  7. oraagent.bin High Memory Usage as Dependent Listener was Removed/Renamed

    Grid Infrastructure oraagent.bin process using huge amount of memory and  forking huge number of thr ...

  8. Shenzhen Wanze Technology Co., Ltd.隐私协议

    本隐私权政策详细说明了Shenzhen Wanze Technology Co., Ltd.团队(“我们”或“我们的”)通过我们的应用程序和网站收集的信息,以及我们将如何使用这些信息. 1.我们不会通 ...

  9. 邪淫真正的可怕危害 (转自学佛网:http://www.xuefo.net/nr/article54/544414.html)

    邪淫真正的可怕危害 邪淫的害处可能很快就显现,也可能是逐渐的表现出来.但往往后者的害处更大.因为当积累了多年的邪淫果报一旦显现,后悔就已经晚了. 我本人就是一个很好的例子.回想自己这40多年的日子,邪 ...

  10. PAT 甲级 1146 Topological Order (25 分)(拓扑较简单,保存入度数和出度的节点即可)

    1146 Topological Order (25 分)   This is a problem given in the Graduate Entrance Exam in 2018: Which ...