【ContestHunter】【弱省胡策】【Round6】
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】的更多相关文章
- 弱省胡策 Magic
弱省胡策 Magic 求\(n\)个点\(n\)的条边的简单联通图的个数. 毒瘤,还要写高精. 我们枚举环的大小\(k\),\(\displaystyle ans=\sum_{k=3}^nC_n^k ...
- 【弱省胡策】Round #5 Count
[弱省胡策]Round #5 Count 太神仙了. \(DP\)做法 设\(f_{n,m,d,k}\)表示\(n*m\)的矩阵,填入第\(k\)个颜色,并且第\(k\)个颜色最少的一列上有\(d\) ...
- luoguP3769 [CH弱省胡策R2]TATT
luoguP3769 [CH弱省胡策R2]TATT PS:做这题前先切掉 P4148简单题,对于本人这样的juruo更助于理解,当然dalao就当练练手吧 题目大意: 现在有n个四维空间中的点,请求出 ...
- 【ContestHunter】【弱省胡策】【Round0】(A)&【Round1】(B)
DP+容斥原理or补集转化?/KD-Tree 唔……突然发现最早打的两场(打的最烂的两场)没有写记录……(太烂所以不忍记录了吗... 还是把搞出来了的两道题记录一下吧= =勉强算弥补一下缺憾…… Ro ...
- 【ContestHunter】【弱省胡策】【Round3】(C)
容斥原理+Fib Orz HE的神犇们 蒟蒻只能改出来第三题……实在太弱 官方题解:http://pan.baidu.com/s/1o6MdtQq fib的神奇性质……还有解密a[i]的过程……这里就 ...
- 【ContestHunter】【弱省胡策】【Round2】
官方题解:http://wyfcyx.is-programmer.com/posts/95490.html A 目前只会30分的暴力……DP好像很神的样子0.0(听说可以多次随机强行算? //Roun ...
- 【ContestHunter】【弱省胡策】【Round8】
平衡树维护凸壳/三角函数+递推+线段树 官方题解:http://pan.baidu.com/s/1sjQbY8H 洛阳城里春光好 题目大意:(其实出题人已经写的很简短了……直接copy的-_-.sor ...
- 【ContestHunter】【弱省胡策】【Round7】
Prufer序列+高精度+组合数学/DP+可持久化线段树 Magic 利用Prufer序列,我们考虑序列中每个点是第几个插进去的,再考虑环的连接方式,我们有$$ans=\sum_{K=3}^n N^{ ...
- 【ContestHunter】【弱省胡策】【Round5】
反演+FFT+构造+DP 写了这么多tag,其实我一个也不会 A 第一题是反演……数据范围10W,看着就有种要用FFT等神奇算法的感觉……然而蒟蒻并不会推公式,只好写了20+10分的暴力,然而特判30 ...
随机推荐
- (转载)ACM训练计划,先过一遍基础再按此拼搏吧!!!!
ACM大量习题题库 ACM大量习题题库 现在网上有许多题库,大多是可以在线评测,所以叫做Online Judge.除了USACO是为IOI准备外,其余几乎全部是大学的ACM竞赛题库. USACO ht ...
- JAVA 多线程制作大球吃小球 一、实现球的自动生成及运动 生产消费模型
前几天用多线程实现了创建小球并移动,想到大鱼吃小鱼,便突发奇想要写一个大球吃小球.首先第一步自然是先把界面弄好啦 public class BallUI extends JPanel { privat ...
- CSS3利用一个div实现内圆角边框效果
*首先要清楚的是,box-shadow的形状会随着border-radius变化.下面的例子可以证明: <!doctype html> <html lang="en&quo ...
- poj 2253 最短路floyd **
题意:有两只青蛙和若干块石头,现在已知这些东西的坐标,两只青蛙A坐标和青蛙B坐标是第一个和第二个坐标,现在A青蛙想要到B青蛙那里去,并且A青蛙可以借助任意石头的跳跃,而从A到B有若干通路,问从A到B的 ...
- 16、Redis手动创建集群
写在前面的话:读书破万卷,编码如有神 --------------------------------------------------------------------------------- ...
- object-c中NSString与int和float的相互转换
1,字符串拼接 NSString *newString = [NSString stringWithFormat:@"%@%@",tempA,tempB]; 2,字符转int in ...
- Codeforces Round #394 (Div. 2) B. Dasha and friends 暴力
B. Dasha and friends 题目连接: http://codeforces.com/contest/761/problem/B Description Running with barr ...
- 从PHP客户端看MongoDB通信协议(转)
MongoDB 的 PHP 客户端有一个 MongoCursor 类,它是用于获取一次查询结果集的句柄(或者叫游标),这个简单的取数据操作,内部实现其实不是那么简单.本文就通过对 MongoCurso ...
- 蜗牛—ORACLE基础之学习(二)
如何创建一个表,这个表和还有一个表的结构一样但没有数据是个空表,旧表的数据也插入的 create table newtable as select * from oldtable 清空一个表内的数据 ...
- Java嵌入式数据库H2学习总结(三)——在Web应用中嵌入H2数据库
H2作为一个嵌入型的数据库,它最大的好处就是可以嵌入到我们的Web应用中,和我们的Web应用绑定在一起,成为我们Web应用的一部分.下面来演示一下如何将H2数据库嵌入到我们的Web应用中. 一.搭建测 ...