KMP/DP+树链剖分+线段树/暴力


  今天考的真是……大起大落……

String

  QwQ题意理解又出错了……(还是说一开始理解了,后来自己又忘了为什么是这样了?)

  反正最后的结果就是……我当成:后面每行只需要和第一行check一下就可以了。

  因为那个图真的很像在搞串的匹配啊……一格一格往过移,看能不能匹配

  然后不就是每个s[i]对A取一下模,然后KMP?看有多少个位置能匹配咯。。。

  (其实这是A=B时的做法)

  将原序列增长一倍(复制一遍),对A取模做一遍,然后再对B取模做一遍,看有哪些位置是合法的,统计一下……

  然而其实正解可以证明出来当$A \not = B$的时候,可以当A=B做……也就是说,上面那种做法……是可以AC的-_-b

  P.S.正解是KMP来找循环节= = n如果可以整除n-next[n],那么循环节长度就是n-next[n]……可匹配长度就是……那么多……啊反正差不多啦

 //Round6 A
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
typedef long long LL;
inline int getint(){
int r=,v=; char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-;
for(; isdigit(ch);ch=getchar()) v=v*-''+ch;
return r*v;
}
const int N=;
/*******************template********************/ int a[N],b[N],c[N],A,B,n,ans,nxt[N];
bool yes[N];
void init(){
n=getint(); A=getint(); B=getint();
F(i,,n) a[i]=getint();
memset(yes,,sizeof yes);
ans=;
}
void KMP(int *s,int n){
int m=n*;
nxt[]=; int j=;
F(i,,n+){
while(j && s[i]!=s[j+]) j=nxt[j];
if (s[i]==s[j+]) j++;
nxt[i]=j;
}
j=;
F(i,,m-){
while(j && b[i]!=s[j+]) j=nxt[j];
if (b[i]==s[j+]) j++;
if (j==n) yes[i]=,j=nxt[j];
}
}
void work(){
F(i,,n) c[i]=b[i]=b[i+n]=a[i]%A;
KMP(c,n);
if (A!=B){
F(i,,n) c[i]=b[i]=b[i+n]=a[i]%B;
KMP(c,n);
}
F(i,n,n*-) ans+=yes[i];
printf("%d\n",ans?ans+:);
}
int main(){
int T=getint();
while(T--){
init();
work();
}
return ;
}

Tree

  ……30分的做法其实就是直接TreeDP,40~50的做法是线段树维护最大连续子段和,那么满分做法?两者结合……Orzzzzzz

  所以就是树链剖分+DP(并没有?其实是贪心?)啊……

  Orz zyf,这题代码感觉细节很多啊……

  树链剖分一下,权值沿轻链按TreeDP的思路将权值加到fa上面,建出整个线段树……

  然后每次修改的时候,先将这个点x到top[x]这一条重链上的ans更新一下(这里重点是maxl,即从左端点开始的最大连续子段和),然后!更新fa[top[x]]的DP值!因为它在线段树上的权值是自身权值+轻链的maxl,怎么搞?区间查询一下top[x]所在的重链的maxl……然后更新。。。【这里我并不知道如何记重链的结尾……因为dfs序记start和end是子树的,所以并不能那样搞。。。zyf的做法是:往出连轻链的时候多++一下dfs_clock,这样就可以将不同的重链断开,(当然是将这些没有编号的空节点的权值置为-INF)

  查询的时候……直接出解呗。。。

 //Round6 B
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
typedef long long LL;
inline int getint(){
int r=,v=; char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-;
for(; isdigit(ch);ch=getchar()) v=v*-''+ch;
return r*v;
}
const int N=,INF=;
/*******************template********************/ int head[N],to[N],nxt[N],cnt;
void add(int x,int y){
to[++cnt]=y; nxt[cnt]=head[x]; head[x]=cnt;
to[++cnt]=x; nxt[cnt]=head[y]; head[y]=cnt;
} int n,m,f[N],id[N],v[N],ans;
int pos[N],dfs_clock,fa[N],son[N],size[N],top[N];
struct node{
int max,maxl,maxr;
LL sum;
}t[N];
bool vis[N]; void dfs(int x){
size[x]=; son[x]=;
int mx=;
for(int i=head[x];i;i=nxt[i])
if (to[i]!=fa[x]){
fa[to[i]]=x;
dfs(to[i]);
size[x]+=size[to[i]];
if (size[to[i]]>mx) son[x]=to[i],mx=size[to[i]];
}
}
void connect(int x,int f){
pos[x]=++m; top[x]=f; vis[x]=;
id[m]=x;
if (son[x]) connect(son[x],f);
for(int i=head[x];i;i=nxt[i])
if (!vis[to[i]])
++m,connect(to[i],to[i]);
} #define L (o<<1)
#define R (o<<1|1)
#define mid (l+r>>1)
node maintain(node a,node b){
node ans;
ans.maxl=max((LL)a.maxl,a.sum+b.maxl);
ans.maxr=max((LL)b.maxr,b.sum+a.maxr);
ans.max=max(a.maxr+b.maxl,max(a.max,b.max));
ans.sum=a.sum+b.sum;
return ans;
}
void update(int o,int l,int r,int p,int v){
if (l==r){
t[o].sum+=v;
t[o].maxl=t[o].maxr=t[o].max=max(t[o].sum,(LL));
}else{
if (p<=mid) update(L,l,mid,p,v);
else update(R,mid+,r,p,v);
t[o]=maintain(t[L],t[R]);
}
}
node query(int o,int l,int r,int ql,int qr){
if (l==ql && r==qr) return t[o];
else if (qr<=mid) return query(L,l,mid,ql,qr);
else if (ql>mid) return query(R,mid+,r,ql,qr);
else return maintain(query(L,l,mid,ql,mid),query(R,mid+,r,mid+,qr));
}
void change(int x,int y1,int y2){
while(x){
int y=top[x],z=query(,,m,pos[y],m).maxl;
update(,,m,pos[x],y2-y1);
y1=z; y2=query(,,m,pos[y],m).maxl;
x=fa[top[x]];
}
} int main(){
#ifndef ONLINE_JUDGE
freopen("sub.in","r",stdin);
freopen("sub.out","w",stdout);
#endif
n=getint(); int T=getint();
F(i,,n) v[i]=getint();
F(i,,n){
int x=getint(),y=getint();
add(x,y);
}
dfs(); connect(,);
F(i,,m) if (!id[i]) update(,,m,i,-INF);
F(i,,n) change(i,,v[i]);
while(T--){
int cmd=getint(),x,y;
if (cmd==){
x=getint(), y=getint();
change(x,v[x],y);
v[x]=y;
}else printf("%d\n",t[].max);
}
return ;
}

Transport

  ……我就无语了……

  一开始我想的是二分!然后模拟过程进行判断!然而连样例都过不了……QwQ

  仔细想了想好像确实并不满足单调性……会有小的波动……

  然后蒟蒻就不会了……实在没办法了,二分的时候边界不是 $L=max\{a[i]\},R=\sum a[i]$ 嘛= =然后我就直接将二分的过程删掉……改成枚举……然后……TM居然就过了……maya我也是惊呆了,这个枚举的上下界明明很大的好吗……如果全都走一遍肯定要T的啊!然而我就是过了……就是这么神奇……>_>

  P.S.这个边界 L 还是比较松的,其实应该弄成$max\{ \frac{\sum a[i]}{k}, max(a[i]) \}$ ?

 //Round6 C
#include<cstdio>
#include<set>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
typedef long long LL;
inline int getint(){
int r=,v=; char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-;
for(; isdigit(ch);ch=getchar()) v=v*-''+ch;
return r*v;
}
const int N=;
/*******************template********************/ int n,k,a[N],sum;
multiset<int>s,s2;
multiset<int>::iterator it;
bool check(int c){
if (k*c<sum) return ;
s2=s;
int num;
F(i,,k){
num=c;
do{
if (s2.empty()) return ;
it=s2.lower_bound(num);
if (it==s2.end()) it--;
if (*it>num){
if (it==s2.begin()) break;
else it--;
}
num-=*it;
s2.erase(it);
}while();
}
return s2.empty();
}
void init(){
n=getint(); k=getint();
s.clear();
int L=,R=;
sum=;
F(i,,n){
a[i]=getint();
sum+=a[i]; R+=a[i]; L=max(L,a[i]);
s.insert(a[i]);
}
F(i,L,R)
if (check(i)){
printf("%d\n",i);
return;
}
} int main(){
#ifndef ONLINE_JUDGE
freopen("C.in","r",stdin);
freopen("C.out","w",stdout);
#endif
int T=getint();
while(T--) init();
return ;
}

【ContestHunter】【弱省胡策】【Round6】的更多相关文章

  1. 弱省胡策 Magic

    弱省胡策 Magic 求\(n\)个点\(n\)的条边的简单联通图的个数. 毒瘤,还要写高精. 我们枚举环的大小\(k\),\(\displaystyle ans=\sum_{k=3}^nC_n^k ...

  2. 【弱省胡策】Round #5 Count

    [弱省胡策]Round #5 Count 太神仙了. \(DP\)做法 设\(f_{n,m,d,k}\)表示\(n*m\)的矩阵,填入第\(k\)个颜色,并且第\(k\)个颜色最少的一列上有\(d\) ...

  3. luoguP3769 [CH弱省胡策R2]TATT

    luoguP3769 [CH弱省胡策R2]TATT PS:做这题前先切掉 P4148简单题,对于本人这样的juruo更助于理解,当然dalao就当练练手吧 题目大意: 现在有n个四维空间中的点,请求出 ...

  4. 【ContestHunter】【弱省胡策】【Round0】(A)&【Round1】(B)

    DP+容斥原理or补集转化?/KD-Tree 唔……突然发现最早打的两场(打的最烂的两场)没有写记录……(太烂所以不忍记录了吗... 还是把搞出来了的两道题记录一下吧= =勉强算弥补一下缺憾…… Ro ...

  5. 【ContestHunter】【弱省胡策】【Round3】(C)

    容斥原理+Fib Orz HE的神犇们 蒟蒻只能改出来第三题……实在太弱 官方题解:http://pan.baidu.com/s/1o6MdtQq fib的神奇性质……还有解密a[i]的过程……这里就 ...

  6. 【ContestHunter】【弱省胡策】【Round2】

    官方题解:http://wyfcyx.is-programmer.com/posts/95490.html A 目前只会30分的暴力……DP好像很神的样子0.0(听说可以多次随机强行算? //Roun ...

  7. 【ContestHunter】【弱省胡策】【Round8】

    平衡树维护凸壳/三角函数+递推+线段树 官方题解:http://pan.baidu.com/s/1sjQbY8H 洛阳城里春光好 题目大意:(其实出题人已经写的很简短了……直接copy的-_-.sor ...

  8. 【ContestHunter】【弱省胡策】【Round7】

    Prufer序列+高精度+组合数学/DP+可持久化线段树 Magic 利用Prufer序列,我们考虑序列中每个点是第几个插进去的,再考虑环的连接方式,我们有$$ans=\sum_{K=3}^n N^{ ...

  9. 【ContestHunter】【弱省胡策】【Round5】

    反演+FFT+构造+DP 写了这么多tag,其实我一个也不会 A 第一题是反演……数据范围10W,看着就有种要用FFT等神奇算法的感觉……然而蒟蒻并不会推公式,只好写了20+10分的暴力,然而特判30 ...

随机推荐

  1. windows + hadoop + eclipse 过程记录

    昨天在本机上搭建了伪分布式的hadoop,今天决定在eclipse中搭建hadoop的环境,毕竟磨刀不误砍柴工 安装的hadoop是2.7.5版本,要想使用eclipse写MapReduce需要一个  ...

  2. P1757 通天之分组背包

    P1757 通天之分组背包背包中的经典问题,我竟然不知道.分组背包就是每个物品有一个所属的小组,小组内的物品会冲突.就是把01背包中的两个for换一下位置01:for(i,1,kind) for(j, ...

  3. 【转】tair与redis比较总结

    1. Tair总述 1.1 系统架构 一个Tair集群主要包括3个必选模块:configserver.dataserver和client,一个可选模块:invalidserver.通常情况下,一个集群 ...

  4. 【Ray Tracing in One Weekend 超详解】 光线追踪1-8 自定义相机设计

    今天,我们来学习如何设计自定义位置的相机 ready 我们只需要了解我们之前的坐标体系,或者说是相机位置 先看效果   Chapter10:Positionable camera 这一章我们直接用概念 ...

  5. EntityFramework笔记

    参照文档:http://www.cnblogs.com/farb/p/ABPAdvancedTheoryContent.html 案例:http://pan.baidu.com/s/1c1Qgg28 ...

  6. tesseract_ocr+pytesseract图像识别

    一.windows安装配置 其他系统安装配置参考github:https://github.com/tesseract-ocr/tesseract/wiki 下载tesseract-ocr参考:htt ...

  7. BZOJ.4456.[ZJOI2016]旅行者(分治 Dijkstra)

    题目链接 \(Description\) 给定\(n\times m\)的带边权网格图.\(Q\)次询问从点\((x_i,y_i)\)到点\((x_j,y_j)\)的最短路. \(n\times m\ ...

  8. NOIP练习赛题目3

    魔兽争霸 难度级别:C: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 小x正在销魂地玩魔兽他正控制着死亡骑士和n个食尸鬼(编号1-n)去打 ...

  9. [AHOI2013]作业

    [AHOI2013]作业 题目大意: 给定一个长度为\(n(n\le10^5)\)的数列\(A(1\le A_i\le n)\).\(m(m\le10^6)\)次询问,每次询问区间\([l,r]\)内 ...

  10. BZOJ4065 : [Cerc2012]Graphic Madness

    因为两棵树中间只有k条边,所以这些边一定要用到. 对于每棵树分别考虑: 如果一个点往下连着两个点,那么这个点往上的那条边一定不能用到. 如果一个点往下连着一个点,那么这个点往上的那条边一定不能用到. ...