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. Xamarin 开发过的那些项目

    您可能已经看到类似的统计数据:智能手机用户在手机媒体上花费了89%的时间使用应用程序.或者听说Gartner预测到2017年移动应用程序下载将产生价值770亿美元的收入.很难不考虑这些数字.今天,每个 ...

  2. MVC文件的上传、删除

    public ActionResult FileUpload()        {            Users users = new Users();            users = ( ...

  3. 不能收缩 ID 为 %s 的数据库中 ID 为 %s 的文件,因为它正由其他进程收缩或为空。

    SQLServer数据库通常都不建议进行SHRINKFILE操作,因为SHRINKFILE不当会造成一定的性能问题. 但是当进行了某些操作(例如某个超大的日志类型表转成分区表切换了数据文件),数据库某 ...

  4. SQLServer之数据类型解析

    数字 int.bigint.smallint 和 tinyint 使用整数数据的精确数字数据类型. 数据类型 范围 存储 tinyint 0 到 255. 1 字节 smallint -2^15 (- ...

  5. 安装mysql的踩坑之旅

    近期的一个项目要求用mysql数据库,正好系统重装了,复习下mysql的安装,哪成想是踩了无数坑啊! 要安装首先自然是火速进官网下个安装包(下载地址https://dev.mysql.com/down ...

  6. China Tightens Recycling Import Rules

    China Tightens Recycling Import Rules We have all seen the pictures of cities in China with air poll ...

  7. SQL ALTER TABLE 语句

    ALTER TABLE 语句 ALTER TABLE 语句用于在已有的表中添加.修改或删除列. SQL ALTER TABLE 语法 如需在表中添加列,请使用下列语法: ALTER TABLE tab ...

  8. Dispatch Group

    Dispatch Group A group of tasks that you monitor as a single unit. Overview Groups allow you to aggr ...

  9. vue.js sha256加密

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

  10. Spring Cloud:统一异常处理

    在启动应用时会发现在控制台打印的日志中出现了两个路径为 {[/error]} 的访问地址,当系统中发送异常错误时,Spring Boot 会根据请求方式分别跳转到以 JSON 格式或以界面显示的 /e ...