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. java中的二进制运算简单理解

    package test9; public class StreamTest { public static void main(String[] args) { int a = 15;// 0b11 ...

  2. android studio svn 创建分支

    创建分支或标签 从哪里复制 工作副本 用这个变体去创建分支,并带着当地的改变.通常,服务项将被 添加带历史 , 不仅仅只有目标目录. 每个不同于根的版本文件 ,将被指定的复制.它推荐 去更新 工作副本 ...

  3. 括弧匹配检验(check.cpp)

    [问题描述]        假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如([ ]())或[([ ][ ])]等为正确的匹配,[( ])或([ ]( )或 ( ( ) ) )均为错 ...

  4. Codeforces.566F.Clique in the Divisibility Graph(DP)

    题目链接 \(Description\) 给定集合\(S=\{a_1,a_2,\ldots,a_n\}\),集合中两点之间有边当且仅当\(a_i|a_j\)或\(a_j|a_i\). 求\(S\)最大 ...

  5. BZOJ.1031.[JSOI2007]字符加密(后缀数组)

    题目链接 环可以拆成链:对字符串排序能想到后缀数组. 完了.输出时忽略长度不足n的串,输出s[sa[i]+n-1],即排名为i的字符串的末尾. //4140kb 744ms #include < ...

  6. 关于dubbo服务的xml配置文件报错的问题

    在配置dubbo服务的过程中,经常会遇到虽然程序能够跑起来,但是配置文件一堆红叉,虽然不影响功能,但是确实很让人恶心. 报错信息如下: Multiple annotations found at th ...

  7. SQL Server Management Studio 教程二: 创建新登录名

    1.先用windows身份登录SQL server2008 2.打开[安全性],右击[登录名],选择[新建登录名] 3.[常规]选项页面中,修改如下位置设置,默认数据库可以是其他数据库,不一定是mas ...

  8. ConcurrentHashMap之实现细节(转)

    ConcurrentHashMap是Java 5中支持高并发.高吞吐量的线程安全HashMap实现.在这之前我对ConcurrentHashMap只有一些肤浅的理解,仅知道它采用了多个锁,大概也足够了 ...

  9. 通过webbrowser控件获取验证码

    1.首先介绍下基本控件(拖控件大家都会,我就不一一介绍了),看下图: 2.添加MSHTML引用,步骤如下: 解决方案—右键“引用”—​添加引用—在.NET下找到Microsoft.mshtml组件—点 ...

  10. Java深入 - 深入 Java自己定义注解

    我们在使用Spring框架的时候,会常常使用类似:@Autowired 这种注解. 我们也能够自定义一些注解.Java的注解主要在包:java.lang.annotation中实现. 1. 元注解 什 ...