雅礼集训2017Day1的题

感觉上不可做实际上还挺简单的吧

T1

区间加 区间除法向下取整

查询区间和 区间最小值

大力上线段树,把除法标记推到底,加法标记就是按照线段树的来

先拿30

然后60的数据随机不知道该怎么做

开始YY

那个“向下取整”的tag并不能累加

所以考虑转化

除法->减法

如果一个区间要减的都是一样的数,直接减就行了,如果不一样,就递归下去,反正1个数肯定减的是一样的

本来想拿60,结果A了

T2

n*n的棋盘(n = 1000)每次把找一行,把它的颜色序列copy下来涂到一列上

问最少多少次能把整个棋盘涂黑

首先 全白肯定无解

其次 只要把一行涂黑 之后涂n次就可以了

然后 大力模拟发现并没有比这个优的策略

于是一顿乱搞

我们枚举第i行,假装要把他弄成全1的。

设第i行的0的数量为cc[i],那么考虑第i列是否含有1,如果含有1那么就可以用含有1的那列的那行给第i行所有0的地方赋值,需要cc[i]步。

如果第i列不含有1,我们要花1次操作给第i列搞个1出来,所以答案是cc[i]+1步。

每行取个min

听说是签到题...数据极水 被各种对的不对的做法爆切

T3

令 s 与 w 为两字符串,定义:

  1. $w[l,r]$  表示字符串 $w$ 在区间 $[l,r]$中的子串;
  2. $w$ 在 $s $中出现的频率定义为$w$ 在 $s$  中出现的次数;
  3. $f(s,w,l,r)$表示 $w[l,r]$ 在 $s$ 中出现的频率。

比如 $f(ababa,aba,1,3)=2$。

现在给定串 $s$,$m$个区间 $[l,r] $ 和长度 $k$ ,你要回答 $q$  个询问,每个询问给你一个长度为 $k$  的字符串 $w$  和两个整数 $a,b$,求:

$\sum\limits_{i = a} ^ b f(s, w, l_i, r_i)$

重要条件

$\sum w_i$ 是个定值

所以很eazy看了题解后想到要写两种做法

首先考虑k小的情况

这种情况我们可以用SAM暴力处理出right集合计算每一个子串在当前串出现的次数

我的暴力永远比别人慢系列

用莫队可以把O(n^2 k ^2)优化到(n sqrt n k ^2)写写写

k大时可以考虑在SAM的parent树上跑一个倍增

暴力记前缀然后倍增往上跳找到后缀

这样遍历每个子串就可以做了

这是什么完全不可做的毒瘤题啊妈妈带我回家吧我不学OI了

嗯 抬头 微笑

感觉没看到签到题有点亏...想T1想了2个小时有点不应该

然后1个小时迅速切T2

T3就没时间想了只能n^3的KMP

最后100 + 100 + 30

感觉拿了个大众分?

2018.6.6upd

代码写完了 贴一下

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
inline int read()
{
int x = ,f = ;char ch = getchar();
for(;!isdigit(ch);ch = getchar())if(ch == '-')f = -f;
for(;isdigit(ch);x = * x + ch - '',ch = getchar());
return x * f;
}
inline LL Lread()
{
LL x = ,f = ;char ch = getchar();
for(;!isdigit(ch);ch = getchar())if(ch == '-')f = -f;
for(;isdigit(ch);x = * x + ch - '',ch = getchar());
return x * f;
}
const int maxn = 1e5 + ;
int n,m;
LL a[maxn];
LL minx[maxn << ],sum[maxn << ],maxx[maxn << ],add[maxn << ];
#define ls (x << 1)
#define rs ((x << 1) | 1)
inline void pushup(int x){minx[x] = min(minx[ls],minx[rs]);sum[x] = sum[ls] + sum[rs];maxx[x] = max(maxx[ls],maxx[rs]);}
inline void pushdown(int x,int l,int r)
{
if(add[x])
{
add[ls] += add[x];add[rs] += add[x];
int mid = (l + r) >> ;
sum[ls] += add[x] * (mid - l + );sum[rs] += add[x] * (r - mid);
minx[ls] += add[x];minx[rs] += add[x];maxx[ls] += add[x];maxx[rs] += add[x];
add[x] = ;
}
}
inline void build(int x,int l,int r)
{
if(l == r)
{
maxx[x] = minx[x] = sum[x] = a[l];
return;
}
add[x] = ;
int mid = (l + r) >> ;
build(ls,l,mid);build(rs,mid + ,r);
pushup(x);
}
inline void update1(int x,int l,int r,int L,int R,int c) //Add
{
if(L <= l && r <= R)
{
add[x] += c;
sum[x] += (r - l + ) * c;
minx[x] += c;maxx[x] += c;
return;
}
pushdown(x,l,r);int mid = (l + r) >> ;
if(L <= mid)update1(ls,l,mid,L,R,c);
if(R > mid)update1(rs,mid + ,r,L,R,c);
pushup(x);
}
inline void update2(int x,int l,int r,int L,int R,int d) //Div
{
if(L <= l && r <= R)
{
if(minx[x] == maxx[x] || ((maxx[x] % d == ) && (maxx[x] - == minx[x])))
{
LL delta = maxx[x] - (LL)floor((1.0 * maxx[x] / d));
add[x] -= delta;
minx[x] -= delta;maxx[x] -= delta;
sum[x] -= 1LL *delta * (r - l + );
return;
}
//return;
}
pushdown(x,l,r);int mid = (l + r) >> ;
if(L <= mid)update2(ls,l,mid,L,R,d);
if(R > mid)update2(rs,mid + ,r,L,R,d);
pushup(x);
}
inline LL query1(int x,int l,int r,int L,int R) //Min
{
if(L <= l && r <= R)return minx[x];
pushdown(x,l,r);
int mid = (l + r) >> ;
LL ans = 21474832333333LL;
if(L <= mid)ans = min(ans,query1(ls,l,mid,L,R));
if(R > mid)ans = min(ans,query1(rs,mid + ,r,L,R));
return ans;
}
inline LL query2(int x,int l,int r,int L,int R) //Sum
{
if(L <= l && r <= R)return sum[x];
pushdown(x,l,r);int mid = (l + r) >> ;LL ans = ;
if(L <= mid)ans += query2(ls,l,mid,L,R);
if(R > mid)ans += query2(rs,mid + ,r,L,R);
return ans;
} int main()
{
n = read(),m = read();
for(int i=;i<=n;i++)a[i] = Lread();
build(,,n);
while(m--)
{
int opt = read(),l = read() + ,r = read() + ;
if(opt == )
{
int c = read();
update1(,,n,l,r,c);
}
if(opt == )
{
int d = read();
update2(,,n,l,r,d);
}
if(opt == )
{
LL ans = query1(,,n,l,r);
printf("%lld\n",ans);
}
if(opt == )
{
LL ans = query2(,,n,l,r);
printf("%lld\n",ans);
}
}
return ;

T1

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
inline int read()
{
int x = ,f = ;char ch = getchar();
for(;!isdigit(ch);ch = getchar())if(ch == '-')f = -f;
for(;isdigit(ch);x = * x + ch - '',ch = getchar());
return x * f;
}
int n,ac,ans;
int cr[],cc[];
char ch[];
int main()
{
n = read();
for(int i=;i<=n;i++)
{
scanf("%s",ch + );
for(int j=;j<=n;j++)
{
if(ch[j] == '#')ac++;
if(ch[j] == '.')cr[i] ++,cc[j]++;
}
}
if(!ac){puts("-1");return ;}
for(int i=;i<=n;i++)if(cc[i])++ans;
int _Ma = * n + ;
for(int i=;i<=n;i++)_Ma = min(_Ma,cr[i] + (cc[i] == n));
cout<<ans + _Ma<<endl;
}

T2

#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int LIM = ;
inline int read()
{
int x=,f=;char ch;
for(ch=getchar();!isdigit(ch);ch=getchar())if(ch=='-')f=-f;
for(;isdigit(ch);ch=getchar())x=*x+ch-'';
return x*f;
}
const int maxn = ;
int n,m,k,q;
char s[maxn];
struct SAM
{
int tr[maxn][],fa[maxn],len[maxn],size[maxn];
int ST[maxn][],id[maxn],Cnt[maxn];
int last,p,np,q,nq,cnt,rt;
SAM(){last = ++cnt; rt = ;}
inline void extend(int c)
{
p = last, np = last = ++cnt, len[np] = len[p] + ;size[np] = ;
while(!tr[p][c] && p) tr[p][c] = np, p = fa[p];
if(!p) fa[np] = rt;
else
{
q = tr[p][c];
if(len[q] == len[p] + ) fa[np] = q;
else
{
nq = ++cnt; len[nq] = len[p] + ; memcpy(tr[nq],tr[q],sizeof(tr[q]));
fa[nq] = fa[q]; fa[q] = fa[np] = nq;
while(tr[p][c] == q) tr[p][c] = nq,p = fa[p];
}
}
}
inline void buildsize()
{
for(int i=;i<=cnt;i++)Cnt[len[i]]++;
for(int i=;i<=n;i++)Cnt[i] += Cnt[i-];
for(int i=;i<=cnt;i++)id[Cnt[len[i]]--] = i;
for(int i=cnt;i>=;i--)size[fa[id[i]]] += size[id[i]];
}
inline void STLCA()
{
for(int i=;i<=cnt;i++)ST[i][]=fa[i];
for(int i=;i<;i++)for(int j=;j<=cnt;j++)ST[j][i]=ST[ST[j][i-]][i-];
}
inline int query(int x,int va)
{
if(len[x] < va)return ;
for(int i=;i>=;i--)
if(len[ST[x][i]] >= va)x = ST[x][i];
return size[x];
}
inline int trans(int &now,int v,int x)
{
if(tr[now][x])
{
now=tr[now][x];
return v + ;
}
while(now && !tr[now][x])now=fa[now];
v = len[now];
if(tr[now][x])v++;
now = tr[now][x];
if(now == )now = ;
return v;
}
}sam;
//快来跟我写后缀自动机 写一下 调一年
struct Xianzhi{int l,r;}req[maxn];
namespace Modui_ksmall
{
struct Query
{
int l,r,id;
bool operator < (const Query &a)const
{
if((l / LIM) == (a.l / LIM))return r < a.r;
return (l / LIM) < (a.l / LIM);
}
}qs[maxn];
LL res[maxn],ans[LIM][LIM];
char w[maxn][LIM];
void solve()
{
for(int i=;i<=q;i++)
{
scanf("%s",w[i] + );
qs[i].l = read() + ;qs[i].r = read() + ;qs[i].id = i;
}
sort(qs + ,qs + q + );
int l = ,r = ;
for(int i=;i<=q;i++)
{
for(;l < qs[i].l;l++)ans[req[l].l][req[l].r]--;
for(;l > qs[i].l;l--)ans[req[l - ].l][req[l - ].r]++;
for(;r < qs[i].r;r++)ans[req[r + ].l][req[r + ].r]++;
for(;r > qs[i].r;r--)ans[req[r].l][req[r].r]--;
for(int s=;s<=k;s++)
{
int now = ;
for(int t=s;t<=k;t++)
{
now=sam.tr[now][w[qs[i].id][t] - 'a'];
if(now)res[qs[i].id] += (LL) sam.size[now] * ans[s][t];
}
}
} for(int i=;i<=q;i++)printf("%lld\n",res[i]);
}
}
namespace Beizeng_klarge
{
vector<LL> vec[maxn];
char w[maxn];
int v;
void solve()
{
LL ans;int a,b;
while(q--)
{
ans = ;
scanf("%s%d%d",w + ,&a,&b);a++,b++;
for(int i=a;i<=b;i++)vec[req[i].r].push_back(req[i].r - req[i].l + );
int now = ,maxlen = ;
for(int i=;i<=k;i++)
{
maxlen = sam.trans(now,maxlen,w[i] - 'a');
for(auto j : vec[i])
if(maxlen >= j)ans += sam.query(now,j);
vec[i].clear();
}
printf("%lld\n",ans);
}
}
} int main()
{
n = read(),m = read(),q = read(),k = read();
scanf("%s",s + );for(int i=;i<=n;i++)sam.extend(s[i] - 'a');
sam.buildsize(),sam.STLCA();
for(int i=;i<=m;i++)req[i].l = read() + ,req[i].r = read() + ;
if(k < LIM)Modui_ksmall::solve();
else Beizeng_klarge::solve();
}

T3_C++11

集训Day1的更多相关文章

  1. 【欧拉回路+最小生成树】SD开车@山东2018省队一轮集训day1

    目录 [欧拉回路+最小生成树]SD开车@山东2018省队一轮集训day1 PROBLEM 题目描述 输入 输出 样例输入 样例输出 提示 SOLUTION CODE [欧拉回路+最小生成树]SD开车@ ...

  2. 国庆集训 Day1 T2 生成图 DP

    国庆集训 Day1 T2 生成图 现在要生成一张\(n\)个点的有向图.要求满足: 1.若有 a->b的边,则有 b->a 的边 2.若有 a->b 的边和 b->c 的边,则 ...

  3. 2019暑期金华集训 Day1 组合计数

    自闭集训 Day1 组合计数 T1 \(n\le 10\):直接暴力枚举. \(n\le 32\):meet in the middle,如果左边选了\(x\),右边选了\(y\)(且\(x+y\le ...

  4. 2019暑期金华集训 Day1 数据结构

    自闭集训 Day1 数据结构 CF643G 用类似于下面的方法,搬到线段树上. 如何合并两个集合?先全部放在一起,每次删掉最小的\(cnt_i\),然后把其他所有的\(cnt\)都减去\(cnt_i\ ...

  5. LOJ 6060「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set(线性基,贪心)

    LOJ 6060「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set $ solution: $ 这一题的重点在于优先级问题,我们应该先保证总和最大,然后再保证某一个最小.于是我 ...

  6. 牛客2018国庆集训 DAY1 D Love Live!(01字典树+启发式合并)

    牛客2018国庆集训 DAY1 D Love Live!(01字典树+启发式合并) 题意:给你一颗树,要求找出简单路径上最大权值为1~n每个边权对应的最大异或和 题解: 根据异或的性质我们可以得到 \ ...

  7. 暑假集训Day1 整数划分

    题目大意: 如何把一个正整数N(N长度<20)划分为M(M>=1)个部分,使这M个部分的乘积最大.N.M从键盘输入,输出最大值及一种划分方式. 输入格式: 第一行一个正整数T(T<= ...

  8. 考前停课集训 Day1 废

    [友情链接] Day1 今天模拟赛倒数…… 感觉自己菜到爆炸…… 被一个以前初一的倒数爆踩…… 感觉自己白学了. 满分400,自己只有100.真的是倒数第一…… 做了一个T2,其他暴力分全部没有拿到… ...

  9. 长沙雅礼中学集训-------------------day1(内含day0)

    day0: 首先,请允许我吐槽一下: 1.那些一个人住一个标准房的人您们真的是#@**¥&%……#*()%……*()@Q$&. 2.感谢那些一个人住一个标准间的人,要不然我们也找不到这 ...

随机推荐

  1. RF常用库简介(robotframework)

    标准库 Robot Framework可以直接导入使用的库,包括: Builtin:包含经常需要的关键字.自动导入无需import,因此总是可用的 Dialogs:提供了暂停测试执行和从用户的输入方式 ...

  2. Android组件间通信库EventBus学习

    项目地址:   https://github.com/greenrobot/EventBus EventBus主要特点 1. 事件订阅函数不是基于注解(Annotation)的,而是基于命名约定的,在 ...

  3. freemark2pdf

    freemarker+ITextRenderer 生成html转pdf 博客分类: ITextRenderer ITextRenderer  网上已经有比较多的例子 写这个 但是很多都是简单的 dem ...

  4. uwsgi报错:listen queue of socket ...

    Linux默认的socket链接为128,uwsgi默人的链接为100 需要修改系统默认的配置参数, 然后修改uwsgi配置:listen参数:1024

  5. php减少损耗的方法之一 缓存对象

    即把实例后的对象缓存起来(存入变量),当需要再次实例化时,先去缓存里查看是否存在.存在则返回.否则实例化.

  6. 基于友善之臂ARM-tiny4412--uboot源代码分析

    /* * armboot - Startup Code for OMAP3530/ARM Cortex CPU-core * * Copyright (c) 2004 Texas Instrument ...

  7. 有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)->6->7->0(删除),如此循环直到最后一个数被删除。

    // ConsoleApplication12.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" // ConsoleApplication1 ...

  8. Android OOM解决方案 :

    清单文件里 给Application标签加上android:largeHeap="true"这行代码   这样会给你的app分配一个大内存   如果某个页面在绘制时会耗非常多的内存 ...

  9. python 基础 5.2 类的继承

    一. 类的继承 继承,顾名思议就知道是它的意思,举个例子说明,你现在有一个现有的A类,现在需要写一个B类,但是B类是A类的特殊版,我们就可以使用继承,B类继承A类时,B类会自动获得A类的所有属性和方法 ...

  10. js闭包实际用途

    闭包例:防止双击 在线商店的购物车里,为防止“多重购买”,需要防止按钮被双击. 下面用“jQuery + 闭包”来实现这一功能. HTML <form name="frm" ...