A 易知最优的方法是一次只拿一颗,石头数谁多谁赢,一样多后手赢

#include <map>
#include <set>
#include <ctime>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
#define For(i, x, y) for(int i=x;i<=y;i++)
#define _For(i, x, y) for(int i=x;i>=y;i--)
#define Mem(f, x) memset(f,x,sizeof(f))
#define Sca(x) scanf("%d", &x)
#define Sca2(x,y) scanf("%d%d",&x,&y)
#define Sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define Scl(x) scanf("%lld",&x);
#define Pri(x) printf("%d\n", x)
#define Prl(x) printf("%lld\n",x);
#define CLR(u) for(int i=0;i<=N;i++)u[i].clear();
#define LL long long
#define ULL unsigned long long
#define mp make_pair
#define PII pair<int,int>
#define PIL pair<int,long long>
#define PLL pair<long long,long long>
#define pb push_back
#define fi first
#define se second
typedef vector<int> VI;
int read(){int x = ,f = ;char c = getchar();while (c<'' || c>''){if (c == '-') f = -;c = getchar();}
while (c >= ''&&c <= ''){x = x * + c - '';c = getchar();}return x*f;}
const double eps = 1e-;
const int maxn = ;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + ;
int N,M,K;
int main(){
int T = read();
while(T--){
N = read();
int ans = ;
for(int i = ; i <= N; i ++) ans += read();
for(int i = ; i <= N; i ++) ans -= read();
if(ans > ) puts("BaoBao");
else puts("DreamGrid");
}
return ;
}

A

B.

题意:给出N个字符串以及一系列查询,查询u,v两字符串的最大后缀可以成为所有字符串中多少字符串的前缀

由于N和Q以及字符串的长度是1e5级别的,暴力求出最大后缀然后匹配肯定不行。

考虑到在fail树中,每一个节点的父节点都是当前结点所代表字符串在所有字符串中的最长后缀。

所以u,v两字符串的最大公共后缀就是结点lca(u,v)代表的字符串

#include <map>
#include <set>
#include <ctime>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
#define For(i, x, y) for(int i=x;i<=y;i++)
#define _For(i, x, y) for(int i=x;i>=y;i--)
#define Mem(f, x) memset(f,x,sizeof(f))
#define Sca(x) scanf("%d", &x)
#define Sca2(x,y) scanf("%d%d",&x,&y)
#define Sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define Scl(x) scanf("%lld",&x);
#define Pri(x) printf("%d\n", x)
#define Prl(x) printf("%lld\n",x);
#define CLR(u) for(int i=0;i<=N;i++)u[i].clear();
#define LL long long
#define ULL unsigned long long
#define mp make_pair
#define PII pair<int,int>
#define PIL pair<int,long long>
#define PLL pair<long long,long long>
#define pb push_back
#define fi first
#define se second
typedef vector<int> VI;
int read(){int x = ,f = ;char c = getchar();while (c<'' || c>''){if (c == '-') f = -;c = getchar();}
while (c >= ''&&c <= ''){x = x * + c - '';c = getchar();}return x*f;}
const double eps = 1e-;
const int maxn = 1e5 + ;
const int maxm = 5e5 + ;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + ;
int N,M,K;
char str[maxm];
int root,ttt;
int nxt[maxm][],fail[maxm],cnt[maxm];
int Index[maxn];
int newnode(){
for(int i = ; i < ; i ++) nxt[ttt][i] = -;
cnt[ttt] = ;
return ttt++;
}
void Init(){
ttt = ;
root = newnode();
}
int insert(char *t){
int p = root;
for(int i = ; t[i]; i ++){
int id = t[i] - 'a';
if(nxt[p][id] == -) nxt[p][id] = newnode();
p = nxt[p][id];
cnt[p]++;
}
return p;
}
struct Edge{
int to,next;
}edge[maxm * ];
int head[maxm],tot;
void init(){
for(int i = ; i <= ttt; i ++) head[i] = -;
tot = ;
}
void add(int u,int v){
edge[tot].to = v;
edge[tot].next = head[u];
head[u] = tot++;
}
void Build(){
queue<int>Q;
for(int i = ; i < ; i ++){
if(nxt[root][i] == -) nxt[root][i] = root;
else{
fail[nxt[root][i]] = root;
Q.push(nxt[root][i]);
add(root,nxt[root][i]);
}
}
while(!Q.empty()){
int u = Q.front(); Q.pop();
for(int i = ; i < ; i ++){
if(nxt[u][i] == -) nxt[u][i] = nxt[fail[u]][i];
else{
fail[nxt[u][i]] = nxt[fail[u]][i];
add(nxt[fail[u]][i],nxt[u][i]);
Q.push(nxt[u][i]);
}
}
}
}
const int SP = ;
int pa[maxm][],dep[maxm];
void dfs(int t){
for(int i = ; i < SP; i ++) pa[t][i] = pa[pa[t][i - ]][i - ];
for(int i = head[t]; ~i ; i = edge[i].next){
int v = edge[i].to; pa[v][] = t;
dep[v] = dep[t] + ;
dfs(v);
}
}
int lca(int u,int v){
if(dep[u] < dep[v]) swap(u,v);
int t = dep[u] - dep[v];
for(int i = ; i < SP; i ++) if(t & ( << i)) u = pa[u][i];
for(int i = SP - ; i >= ; i --){
int uu = pa[u][i],vv = pa[v][i];
if(uu != vv){
u = uu;
v = vv;
}
}
return u == v ? u: pa[u][];
}
int main(){
while(~Sca(N)){
Init();
for(int i = ; i <= N ; i ++){
scanf("%s",str);
Index[i] = insert(str);
}
init(); Build();
pa[root][] = root; dep[root] = ;
dfs(root);
int Q = read();
while(Q--){
int u = Index[read()],v = Index[read()];
u = lca(u,v);
if(!cnt[u]) puts("N");
else Pri(cnt[u]);
}
}
return ;
}

B

D.

题意:给出N代表拥有1-N序列的椅子,给出10个数字,第i个数字ai表示有ai个人希望做i的倍数的椅子,问最多能安排多少符合条件的椅子。

首先考虑贪心,但10到1依次安排很容易可以证伪。

考虑最大流,起点给出ai个流量到i这个点表示i这个位置的人数,然后这些人分别通向他们可以满足的椅子,椅子再向终点连容量为1的边。

显然这样的方法时间和空间会炸穿。

考虑到很多椅子虽然序号不同但是其本质相同,例如都仅仅是1和3和9的倍数的9和81.

所以我们将所有的数归类成本质不同的数,预处理之后可发现种类只有48种。

接下来的问题在于1e9的椅子太多了,根本无法建图。可以考虑1-10的lcm为2520,也就是说2520为一个周期,我们预处理出一个周期的情况之后,就将N % 2520,将所有可以分成周期的部分累加,不可以分的部分最多为2519,直接单独计算即可。

这样就建出了S到10个点,分别流向48个点,48个点到T的图,跑最大流

#include <map>
#include <set>
#include <ctime>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
#define For(i, x, y) for(int i=x;i<=y;i++)
#define _For(i, x, y) for(int i=x;i>=y;i--)
#define Mem(f, x) memset(f,x,sizeof(f))
#define Sca(x) scanf("%d", &x)
#define Sca2(x,y) scanf("%d%d",&x,&y)
#define Sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define Scl(x) scanf("%lld",&x);
#define Pri(x) printf("%d\n", x)
#define Prl(x) printf("%lld\n",x);
#define CLR(u) for(int i=0;i<=N;i++)u[i].clear();
#define ULL unsigned long long
#define mp make_pair
#define PII pair<int,int>
#define PIL pair<int,long long>
#define PLL pair<long long,long long>
#define pb push_back
#define fi first
#define se second
typedef vector<int> VI;
int read(){int x = ,f = ;char c = getchar();while (c<'' || c>''){if (c == '-') f = -;c = getchar();}
while (c >= ''&&c <= ''){x = x * + c - '';c = getchar();}return x*f;}
const double eps = 1e-;
const int maxn = ;
const int maxm = 1e6 + ;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + ;
int N,M,K;
int vis[ << ];
int num[],Hash[];
PII road[ << ];
struct Edge{
int to,next,cap,flow;
Edge(){}
Edge(int to,int next,int cap,int flow):to(to),next(next),cap(cap),flow(flow){}
}edge[maxm * ];
int head[maxn],tot;
void init(){
for(int i = ; i <= ;i ++) head[i] = -;
tot = ;
}
inline void add(int u,int v,int w){
edge[tot] = Edge(v,head[u],w,);
head[u] = tot++;
edge[tot] = Edge(u,head[v],,);
head[v] = tot++;
}
int dep[maxn],pre[maxn];
inline bool BFS(int s,int t){
for(int i = ; i <= ; i ++) dep[i] = -;
queue<int>Q; Q.push(s); dep[s] = ;
while(!Q.empty()){
int u = Q.front(); Q.pop();
for(int i = head[u]; ~i ; i = edge[i].next){
int v = edge[i].to;
if(edge[i].cap <= edge[i].flow || ~dep[v]) continue;
dep[v] = dep[u] + ;
Q.push(v);
}
}
return ~dep[t];
}
inline int dfs(int s,int a,int t){
if(s == t || !a) return a;
int flow = ;
for(int &i = pre[s]; ~i && a; i = edge[i].next){
int v = edge[i].to;
if(dep[v] != dep[s] + ) continue;
int f = dfs(v,min(a,edge[i].cap - edge[i].flow),t);
if(!f) continue;
flow += f;
edge[i].flow += f; edge[i ^ ].flow -= f;
a -= f;
}
return flow;
}
int maxflow(int s,int t){
int flow = ;
while(BFS(s,t)){
for(int i = ; i <= ; i ++) pre[i] = head[i];
flow += dfs(s,INF,t);
}
return flow;
}
int cnt;
void Init(){
for(int i = ; i <= ; i ++){
int t = ;
for(int j = ; j < ; j ++) if(!(i % (j + ))) t |= ( << j);
vis[t]++;
Hash[i] = t;
}
cnt = ;
for(int i = ; i < ( << ); i ++){
if(vis[i]){
road[++cnt] = mp(i,vis[i]);
vis[i] = cnt;
}
}
}
int main(){
Init();
int T = read();
while(T--){
N = read();
int S = ,T = ;
init();
for(int i = ; i <= ; i ++) add(S,i,read());
int k = N / ;
N %= ;
for(int i = ; i <= ; i ++) num[i] = ;
for(int i = ; i <= N ; i ++) num[vis[Hash[i]]]++;
for(int i = ; i <= cnt; i ++){
int id = i + ,state = road[i].fi;
int w = road[i].se * k + num[i];
for(int j = ; j < ; j ++) if(state & ( << j)) add(j + ,id,w);
add(id,T,w);
}
Prl(maxflow(S,T));
}
return ;
}

D

E.线段树维护区间乘,由于质数的存在,要给质数也取模,用费马小定理

质数取的模为mod - 1

#include <map>
#include <set>
#include <ctime>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
#define For(i, x, y) for(int i=x;i<=y;i++)
#define _For(i, x, y) for(int i=x;i>=y;i--)
#define Mem(f, x) memset(f,x,sizeof(f))
#define Sca(x) scanf("%d", &x)
#define Sca2(x,y) scanf("%d%d",&x,&y)
#define Sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define Scl(x) scanf("%lld",&x);
#define Pri(x) printf("%d\n", x)
#define Prl(x) printf("%lld\n",x);
#define CLR(u) for(int i=0;i<=N;i++)u[i].clear();
#define LL long long
#define ULL unsigned long long
#define mp make_pair
#define PII pair<int,int>
#define PIL pair<int,long long>
#define PLL pair<long long,long long>
#define pb push_back
#define fi first
#define se second
typedef vector<int> VI;
int read(){int x = ,f = ;char c = getchar();while (c<'' || c>''){if (c == '-') f = -;c = getchar();}
while (c >= ''&&c <= ''){x = x * + c - '';c = getchar();}return x*f;}
const double eps = 1e-;
const int maxn = 1e5 + ;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + ;
int N,M,K,Q;
struct Tree{
int l,r;
LL sum,lazy1,lazy2;
}tree[maxn << ];
void Pushup(int t){
tree[t].sum = (tree[t << ].sum * tree[t << | ].sum) % mod;
}
void Build(int t,int l,int r){
tree[t].l = l; tree[t].r = r;
tree[t].lazy1 = tree[t].lazy2 = ;
tree[t].sum = ;
if(l == r){
tree[t].sum = read() % mod;
return;
}
int m = l + r >> ;
Build(t << ,l,m); Build(t << | ,m + ,r);
Pushup(t);
}
LL cul(LL a,LL b){
LL ans = ;
while(b){
if(b & ) ans = ans * a % mod;
a = a * a % mod;
b >>= ;
}
return ans;
}
void change1(int t,LL v){
tree[t].lazy1 = (v * tree[t].lazy1) % mod;
tree[t].sum = tree[t].sum * cul(v,tree[t].r - tree[t].l + ) % mod;
}
void Pushdown1(int t){
if(tree[t].lazy1 != ){
change1(t << ,tree[t].lazy1);
change1(t << | ,tree[t].lazy1);
tree[t].lazy1 = ;
}
}
void change2(int t,int k){
tree[t].sum = cul(tree[t].sum,k);
tree[t].lazy1 = cul(tree[t].lazy1,k);
tree[t].lazy2 = tree[t].lazy2 * k % (mod - );
}
void Pushdown2(int t){
if(tree[t].lazy2 != ){
change2(t << ,tree[t].lazy2);
change2(t << | ,tree[t].lazy2);
tree[t].lazy2 = ;
}
}
void Pushdown(int t){
Pushdown2(t);
Pushdown1(t);
}
void update1(int t,int l,int r,LL v){
if(l <= tree[t].l && tree[t].r <= r){
change1(t,v);
return;
}
Pushdown(t);
int m = (tree[t].l + tree[t].r) >> ;
if(r <= m) update1(t << ,l,r,v);
else if(l > m) update1(t << | ,l,r,v);
else{
update1(t << ,l,m,v); update1(t << | ,m + ,r,v);
}
Pushup(t);
}
void update2(int t,int l,int r,LL k){
if(l <= tree[t].l && tree[t].r <= r){
change2(t,k);
return;
}
Pushdown(t);
int m = (tree[t].l + tree[t].r) >> ;
if(r <= m) update2(t << ,l,r,k);
else if(l > m) update2(t << | ,l,r,k);
else{
update2(t << ,l,m,k); update2(t << | ,m + ,r,k);
}
Pushup(t);
}
LL query(int t,int l,int r){
if(l <= tree[t].l && tree[t].r <= r) return tree[t].sum;
Pushdown(t);
int m = (tree[t].l + tree[t].r) >> ;
if(r <= m) return query(t << ,l,r);
else if(l > m) return query(t << | ,l,r);
else{
return query(t << ,l,m) * query(t << | ,m + ,r) % mod;
}
}
int main(){
int T = read();
while(T--){
Sca2(N,Q);
Build(,,N);
for(int i = ; i <= Q; i ++){
int op,l,r; Sca3(op,l,r);
if(op == ) update1(,l,r,read());
else if(op == ) update2(,l,r,read());
else Prl(query(,l,r));
}
}
return ;
}

E

H 最小生成树 + 路径最大值

由于起点和终点都是固定的食物点,所以记dis[i]为i点距离最近的食物点的位置,将最小生成树的边(u,v,w)变为(u,v,w + dis[u] + dis[v]),表示想要经过这条道路最少的食物上限是多少,对于整个图求一个最小生成树,u到v的食物上限就是树链上面的最大边,可用树剖或者倍增lca的思想求得

#include <map>
#include <set>
#include <ctime>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
#define For(i, x, y) for(int i=x;i<=y;i++)
#define _For(i, x, y) for(int i=x;i>=y;i--)
#define Mem(f, x) memset(f,x,sizeof(f))
#define Sca(x) scanf("%d", &x)
#define Sca2(x,y) scanf("%d%d",&x,&y)
#define Sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define Scl(x) scanf("%lld",&x);
#define Pri(x) printf("%d\n", x)
#define Prl(x) printf("%lld\n",x);
#define CLR(u) for(int i=0;i<=N;i++)u[i].clear();
#define LL long long
#define ULL unsigned long long
#define mp make_pair
#define PII pair<int,int>
#define PIL pair<int,long long>
#define PLL pair<long long,long long>
#define pb push_back
#define fi first
#define se second
typedef vector<int> VI;
int read(){int x = ,f = ;char c = getchar();while (c<'' || c>''){if (c == '-') f = -;c = getchar();}
while (c >= ''&&c <= ''){x = x * + c - '';c = getchar();}return x*f;}
const double eps = 1e-;
const int maxn = 2e5 + ;
const int maxm = 4e5 + ;
const LL INF = 1e18;
const int mod = 1e9 + ;
int N,M,K;
LL dis[maxn];
struct node{
int p;
LL w;
node(int p,LL w):p(p),w(w){}
friend bool operator < (node a,node b){
return a.w > b.w;
}
};
struct Edge{
int to,next;
LL dis;
}edge[maxm * ];
int head[maxn],tot,tree[maxn];
void init(){
for(int i = ; i <= N ; i ++) head[i] = -;
for(int i = ; i <= N ; i ++) tree[i] = i;
tot = ;
}
void add(int u,int v,LL w){
edge[tot].to = v;
edge[tot].next = head[u];
edge[tot].dis = w;
head[u] = tot++;
}
struct E{
int u,v;
LL w;
E(){}
E(int u,int v,LL w):u(u),v(v),w(w){}
}e[maxm * ];
bool cmp(E a,E b){
return a.w < b.w;
}
int find(int x){
if(x == tree[x]) return x;
return tree[x] = find(tree[x]);
}
void Union(int a,int b){
a = find(a); b = find(b);
if(a == b) return;
tree[a] = b;
}
const int SP = ;
int fa[maxn][SP],dep[maxn];
LL pa[maxn][SP];
bool vis[maxn];
void dfs(int t,int la){
vis[t] = ;
for(int i = ; i < SP; i ++){
fa[t][i] = fa[fa[t][i - ]][i - ];
pa[t][i] = max(pa[t][i - ],pa[fa[t][i - ]][i - ]);
}
for(int i = head[t]; ~i ; i = edge[i].next){
int v = edge[i].to;
if(v == la) continue;
dep[v] = dep[t] + ;
pa[v][] = edge[i].dis;
fa[v][] = t;
dfs(v,t);
}
}
LL lca(int u,int v){
if(dep[u] < dep[v]) swap(u,v);
int t = dep[u] - dep[v];
LL ans = ;
for(int i = ; i < SP; i ++) {
if(t & ( << i)){
ans = max(ans,pa[u][i]);
u = fa[u][i];
}
}
if(u == v) return ans;
for(int i = SP - ; i >= ; i --){
int uu = fa[u][i],vv = fa[v][i];
if(uu != vv){
ans = max(ans,pa[u][i]);
ans = max(ans,pa[v][i]);
u = uu; v = vv;
}
}
return max(ans,max(pa[v][],pa[u][]));
}
int main(){
Sca2(N,M); init();
for(int i = ; i <= N ; i ++) dis[i] = INF;
priority_queue<node>Q;
for(int i = ; i <= N ; i ++){
if(read()){
dis[i] = ;
Q.push(node(i,));
}
}
for(int i = ; i <= M; i ++){
int u,v; Sca2(u,v);
LL w; Scl(w);
add(u,v,w); add(v,u,w);
e[i] = E(u,v,w);
}
while(!Q.empty()){
node u = Q.top(); Q.pop();
if(u.w > dis[u.p]) continue;
for(int i = head[u.p]; ~i ; i = edge[i].next){
int v = edge[i].to;
if(dis[v] > u.w + edge[i].dis){
dis[v] = u.w + edge[i].dis;
Q.push(node(v,dis[v]));
}
}
}
for(int i = ; i <= M; i ++) e[i].w += dis[e[i].u] + dis[e[i].v];
for(int i = ; i <= N; i ++) head[i] = -; tot = ;
sort(e + ,e + M + ,cmp);
for(int i = ; i <= M ; i ++){
if(find(e[i].u) != find(e[i].v)){
Union(e[i].u,e[i].v);
add(e[i].v,e[i].u,e[i].w);
add(e[i].u,e[i].v,e[i].w);
}
}
for(int i = ; i <= N ; i ++) if(!vis[i]) dfs(i,);
int T = read();
for(int i = ; i <= T; i ++){
int u,v; Sca2(u,v);
Prl(lca(u,v));
}
return ;
}

J 先写出n3的暴力,枚举i,j两个点之后依次遍历长度

考虑到二元组(i,j)转换到(i + 1,j + 1)可延续长度为l - 1的信息,记录一个数组len[maxn][maxn]更新到这两个端点时候的最小长度来优化即可。

#include <map>
#include <set>
#include <ctime>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
#define For(i, x, y) for(int i=x;i<=y;i++)
#define _For(i, x, y) for(int i=x;i>=y;i--)
#define Mem(f, x) memset(f,x,sizeof(f))
#define Sca(x) scanf("%d", &x)
#define Sca2(x,y) scanf("%d%d",&x,&y)
#define Sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define Scl(x) scanf("%lld",&x);
#define Pri(x) printf("%d\n", x)
#define Prl(x) printf("%lld\n",x);
#define CLR(u) for(int i=0;i<=N;i++)u[i].clear();
#define LL long long
#define ULL unsigned long long
#define mp make_pair
#define PII pair<int,int>
#define PIL pair<int,long long>
#define PLL pair<long long,long long>
#define pb push_back
#define fi first
#define se second
typedef vector<int> VI;
int read(){int x = ,f = ;char c = getchar();while (c<'' || c>''){if (c == '-') f = -;c = getchar();}
while (c >= ''&&c <= ''){x = x * + c - '';c = getchar();}return x*f;}
const double eps = 1e-;
const int maxn = ;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + ;
int N,P;
LL V;
LL a[maxn],b[maxn];
int len[maxn][maxn];
LL num[maxn][maxn];
LL cul(LL a){
if(a < ) a = -a;
if(P == ) return a;
else if(P == ) return a * a;
return a * a * a;
}
int main(){
int T = read();
while(T--){
scanf("%d%lld%d",&N,&V,&P);
for(int i = ; i <= N ; i ++){
for(int j = ; j <= N ; j ++){
len[i][j] = num[i][j] = ;
}
}
for(int i = ; i <= N ; i ++) Scl(a[i]);
for(int i = ; i <= N ; i ++) Scl(b[i]);
LL ans = ;
for(int i = ; i <= N ; i ++){
for(int j = ; j <= N; j ++){
int l = len[i][j];
LL sum = num[i][j];
ans += l;
while(i + l <= N && j + l <= N && sum + cul(a[i + l] - b[j + l]) <= V){
sum += cul(a[i + l] - b[j + l]);
ans++; l++;
}
if(!l) continue;
len[i + ][j + ] = l - ;
num[i + ][j + ] = sum - cul(a[i] - b[j]);
}
}
Prl(ans);
}
return ;
}

J

ZOJ Monthly, January 2018的更多相关文章

  1. ZOJ Monthly, January 2018 训练部分解题报告

    A是水题,此处略去题解 B - PreSuffix ZOJ - 3995 (fail树+LCA) 给定多个字符串,每次询问查询两个字符串的一个后缀,该后缀必须是所有字符串中某个字符串的前缀,问该后缀最 ...

  2. ZOJ Monthly, January 2018 Solution

    A - Candy Game 水. #include <bits/stdc++.h> using namespace std; #define N 1010 int t, n; int a ...

  3. ZOJ 4010 Neighboring Characters(ZOJ Monthly, March 2018 Problem G,字符串匹配)

    题目链接  ZOJ Monthly, March 2018 Problem G 题意  给定一个字符串.现在求一个下标范围$[0, n - 1]$的$01$序列$f$.$f[x] = 1$表示存在一种 ...

  4. ZOJ 4009 And Another Data Structure Problem(ZOJ Monthly, March 2018 Problem F,发现循环节 + 线段树 + 永久标记)

    题目链接  ZOJ Monthly, March 2018 Problem F 题意很明确 这个模数很奇妙,在$[0, mod)$的所有数满足任意一个数立方$48$次对$mod$取模之后会回到本身. ...

  5. ZOJ Monthly, March 2018 题解

    [题目链接] A. ZOJ 4004 - Easy Number Game 首先肯定是选择值最小的 $2*m$ 进行操作,这些数在操作的时候每次取一个最大的和最小的相乘是最优的. #include & ...

  6. ZOJ Monthly, March 2018 Solution

    A - Easy Number Game 水. #include <bits/stdc++.h> using namespace std; #define ll long long #de ...

  7. matrix_2015_1 138 - ZOJ Monthly, January 2015

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3844 第一个,n个数,每次操作最大数和最小数都变成他们的差值,最后n个数相 ...

  8. ZOJ Monthly, March 2018

    A. Easy Number Game 贪心将第$i$小的和第$2m-i+1$小的配对即可. #include<cstdio> #include<algorithm> usin ...

  9. ZOJ Monthly, June 2018 Solution

    A - Peer Review Water. #include <bits/stdc++.h> using namespace std; int t, n; int main() { sc ...

随机推荐

  1. windows下php7.1安装redis扩展以及redis测试使用全过程

    最近做项目,需要用到redis相关知识.在Linux下,redis扩展安装起来很容易,但windows下还是会出问题的.因此,特此记下自己实践安装的整个过程,以方便后来人. 一,php中redis扩展 ...

  2. springboot项目屏蔽mq或者mongodb的监控日志输出

    最近写项目,用的是springboot,其中用到了rabbitmq和mongodb,配置完成 项目启动后,会输出如下日志: mongodb和mq的检测,会一直打印日志,这样会影响开发人员的测试. 如何 ...

  3. 【Linux基础】iconv命令详解(编码转换)

    对于给定文件把它的内容从一种编码转换成另一种编码. iconv -f GBK -t UTF- file1 -o file2 //将GBK转换为UTF8,输出到file2.没-o那么会输出到标准输出 i ...

  4. golang 解析XML

    用adb操控android手机时,可以解析页面控件信息(xml) 代码如下: package main import ( "encoding/xml" "fmt" ...

  5. vue.js sha256加密

    sha256: 1.使用cnpm安装 :cnpm install js-sha256 2.然后在组件中methods定义方法,在调用 let sha256 = require("js-sha ...

  6. zabbix源码安装 令人窒息的操作

    一.简介 zabbix-server主要分为2部分: zabbix程序 程序根据客户端的监控项,从客户端获取数据并写入到数据库,再根据触发器/动作等配置进行操作. 展示页面 使用php编写,php脚本 ...

  7. linux下开启、关闭、重启mysql服务命令

    一. 启动1.使用 service 启动:service mysql start2.使用 mysqld 脚本启动:/etc/inint.d/mysql start3.使用 safe_mysqld 启动 ...

  8. centos6.8 配置mysql赋予mysql远程连接权限

    1.关掉防火墙 2.检查3306端口是否开放 3.修改用户用户权限 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '您的数据库密码' ...

  9. vue中使用LESS、SASS、stylus

    less的使用 npm install less less-loader --save 修改webpack.config.js文件.vue.cli 搭建项目可跳过此步 { test: /\.less$ ...

  10. vue应用或者是项目其实就是 实例(完成基本逻辑) + 组件(单文件组件,全局组件,局部组件,内置组件)来完成 ;

    以上! 组件里面包含HTML,css, js,也就是一个完整的功能!