打算把省冬的题目放上来,主要是防止自己偷懒不订正

T1、全连(fc)

传送门

Code 

//PaperCloud 2019/2/12
//60 pts
#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read()
{
register int x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
#define MN 1000005
int N,tm[MN];
ll a[MN];
namespace solve1
{
ll f[10005],ans;
void work()
{
register int i,j;
memset(f,0,sizeof f);
ans=f[1]=a[1];
for(i=2;i<=N;++i)
{
f[i]=a[i];
for(j=i-1;j;--j) if(max(tm[i],tm[j])<=i-j) f[i]=max(f[i],f[j]+a[i]);
ans=max(ans,f[i]);
}
printf("%lld\n",ans);
}
}
namespace solve2
{
struct Node
{
ll val,lazy;
}T[MN<<3];
void down(int x)
{
if(!T[x].lazy) return;
T[x<<1].val=max(T[x<<1].val,T[x].lazy);
T[x<<1].lazy=max(T[x<<1].lazy,T[x].lazy);
T[x<<1|1].val=max(T[x<<1|1].val,T[x].lazy);
T[x<<1|1].lazy=max(T[x<<1|1].lazy,T[x].lazy);
T[x].lazy=0;
}
void Mdf(int x,int l,int r,int a,int b,ll val)
{
if(a==l&&r==b) {T[x].val=max(T[x].val,val);T[x].lazy=max(T[x].lazy,val);return;}
register int mid=(l+r)>>1;down(x);
if(b<=mid) Mdf(x<<1,l,mid,a,b,val);
else if(a>mid) Mdf(x<<1|1,mid+1,r,a,b,val);
else Mdf(x<<1,l,mid,a,mid,val),Mdf(x<<1|1,mid+1,r,mid+1,b,val);
T[x].val=max(T[x<<1].val,T[x<<1|1].val);
}
ll Gi(int x,int l,int r,int p)
{
if(l==r) return T[x].val;
register int mid=(l+r)>>1;down(x);
if(p<=mid) return Gi(x<<1,l,mid,p);
else return Gi(x<<1|1,mid+1,r,p);
}
void work()
{
register int i;
Mdf(1,1,N<<1,tm[1]+1,N<<1,a[1]);
for(i=2;i<=N;++i)
{
//printf("update: %d 10 %lld",i+tm[i],a[i]+Gi(1,1,N<<1,i));
Mdf(1,1,N<<1,i+tm[i],N<<1,a[i]+Gi(1,1,N<<1,i));
}
printf("%lld\n",T[1].val);
}
}
int main()
{
freopen("fc.in","r",stdin);
freopen("fc.out","w",stdout);
N=read();
register int i,j;
for(i=1;i<=N;++i) tm[i]=read();
for(i=1;i<=N;++i) a[i]=1ll*read()*tm[i];
bool flag=1;
for(i=1;i<=N;++i) if(tm[1]!=tm[i]) {flag=0;break;}
if(flag==1||N>10000) solve2::work();
else if(N<=10000) solve1::work();
return 0;
}
/*
首先 写出一个dp
按照 i+tm[i] 从小到大考虑
维护 前缀的最大值
2019/2/12 19:40~20:02
*/
#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
#define MN 1000005
ll a[MN],ti[MN],t[MN],n,ans,f[MN];
inline void rw(ll &x,ll y){if(y>x)x=y;}
inline void C(int p,ll val){for(;p<=n;p+=(p&(-p))) rw(t[p],val);}
inline ll G(int p){ll r=0;for(;p>0;p-=(p&(-p))) rw(r,t[p]);return r;}
std::vector<int> g[MN];
int main()
{
freopen("fc.in","r",stdin);
freopen("fc.out","w",stdout);
n=read();
register int i;
for(i=1;i<=n;++i) ti[i]=read();
for(i=1;i<=n;++i) a[i]=1ll*read()*ti[i];
for(i=1;i<=n;++i)
{
if(i+ti[i]<=n) g[i+ti[i]].push_back(i);
for(int j=g[i].size()-1;~j;--j) C(g[i][j],f[g[i][j]]);
f[i]=G(i-ti[i])+a[i];
rw(ans,f[i]);
}
return 0*printf("%lld\n",ans);
}

T2、原样输出(copy)

传送门

Code 

//PaperCloud 2019/2/12
//40 pts
#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define MX 1048580
#define mod 1000000007
#define MM MX<<1
int c[MM][5],fa[MM],step[MM],val[MM];
int v[MM],rk[MM],siz[MM];
int last=1,cnt=1,Line,K,ans,n;
void Insert(int x)
{
int p=last,np=++cnt;step[np]=step[p]+1;val[np]=1;
for(;p&&!c[p][x];p=fa[p]) c[p][x]=np;
if(!p) fa[np]=1;
else
{
int q=c[p][x];
if(step[q]==step[p]+1) fa[np]=q;
else
{
int nq=++cnt;step[nq]=step[p]+1;
memcpy(c[nq],c[q],sizeof c[q]);
fa[nq]=fa[q];fa[np]=fa[q]=nq;
for(;c[p][x]==q;p=fa[p]) c[p][x]=nq;
}
}
last=np;
}
inline int Num(char x)
{
if(x=='A') return 1;
if(x=='C') return 2;
if(x=='G') return 3;
if(x=='T') return 4;
}
inline void putch(int x)
{
if(x==1) putchar('A');
if(x==2) putchar('C');
if(x==3) putchar('G');
if(x==4) putchar('T');
}
namespace solve1
{
char str[MX];int st[MX],nn;
inline void dfs2(int x)
{
register int i;
ans++;ans%=mod;
for(int j=1;j<=nn;++j) putch(st[j]);puts("");
for(i=1;i<=4;++i) if(c[x][i])
{
st[++nn]=i;
dfs2(c[x][i]);
--nn;
}
}
inline void ddd()
{
register int i,j;
for(i=1;i<=cnt;++i) ++v[step[i]];
for(i=1;i<=n;++i) v[i]+=v[i-1];
for(i=1;i<=cnt;++i) rk[v[step[i]]--]=i;
for(i=cnt;i;--i) siz[i]=1;
for(i=cnt;i;--i)for(j=1;j<5;++j)if(c[rk[i]][j]) (siz[rk[i]]+=siz[c[rk[i]][j]])%=mod;
ans=siz[1]%mod;
}
void work()
{
register int i;
scanf("%s",str+1);n=strlen(str+1);
for(i=1;i<=n;++i) Insert(Num(str[i]));
scanf("%d",&K);
if(K==0) ddd();else dfs2(1);
printf("%d\n",ans);
}
}
int main()
{
freopen("copy.in","r",stdin);
freopen("copy.out","w",stdout);
scanf("%d",&Line);
if(Line==1) solve1::work();
//else if(Line<3) solve2::work();
return 0;
}
/*
考虑每个串建一个后缀自动机 并且把他们连在一起
具体的 如果在当前点失配 就找到下一个包含失配字符的自动机
这样采用的时贪心的思想,每个字符串所对应的状态仍然是唯一的
学习一下读入优化?
2019/2/12 20:26~21:32
*/
#include<bits/stdc++.h>
#define ll long long
#define mod 1000000007
namespace IO
{
const int lim=(1<<20)+5;
char buf[lim+5],*S,*T;
inline char gc(){if(S==T){T=(S=buf)+fread(buf,1,lim,stdin);if(S==T)return EOF;}return *S++;}
inline int read()
{
int x;char ch;bool f;
for(f=0;(ch=gc())<'0'||ch>'9';f=ch=='-');
for(x=ch^'0';(ch=gc())>='0'&&ch<='9';x=(x<<1)+(x<<3)+(ch^'0'));
return f?-x:x;
}
inline int Num(char x)
{
if(x=='A') return 0;
else if(x=='C') return 1;
else if(x=='G') return 2;
else if(x=='T') return 3;
else return -1;
}
}
using namespace IO;
const char alpha[4]={'A','C','G','T'};
int n,ans,k;
class Suf_Automation
{
private:
#define MN 1048580
int ch[MN<<1][4],cnt,last,step[MN<<1],sz[MN<<1],fa[MN<<1],rt[MN];
inline void Insert(int R,int x)
{
int np=++cnt,p;step[np]=step[last]+1;
for(p=last;!ch[p][x];p=fa[p]) ch[p][x]=np;
if(!p) fa[np]=R;
else
{
int q=ch[p][x];
if(step[q]==step[p]+1) fa[np]=q;
else
{
int nq=++cnt;step[nq]=step[p]+1;
memcpy(ch[nq],ch[q],sizeof ch[nq]);
fa[nq]=fa[q];fa[q]=fa[np]=nq;
for(;ch[p][x]==q;p=fa[p]) ch[p][x]=nq;
}
}
last=np;
}
inline void ins(int i)
{
register char c;
while(!(~Num(c=gc())));
last=rt[i]=++cnt;
for(;~Num(c);c=gc()) Insert(rt[i],Num(c));
}
char st[MN];int tp;
inline void dfs(int x)
{
if(!x) return ;
++ans;puts(st+1);
for(int al=0;al<4;++al) st[++tp]=alpha[al],dfs(ch[x][al]),st[tp--]='\0';
}
int Dfs(int x)
{
if(!x) return 0;
if(sz[x]) return sz[x];
sz[x]=1;
for(int al=0;al<4;++al) (sz[x]+=Dfs(ch[x][al]))%=mod;
return sz[x];
}
public:
void solve()
{
n=read();register int i,j,al;
for(i=1;i<=n;++i) ins(i);
k=read();
for(i=n-1;i;--i)for(j=rt[i+1]-1;j>=rt[i];--j)for(al=0;al<4;++al)
if(!ch[j][al]) ch[j][al]=ch[rt[i+1]][al];
if(k==1) dfs(1);
else ans=Dfs(1);
printf("%d\n",ans);
}
}pac;
int main()
{
freopen("copy.in","r",stdin);
freopen("copy.out","w",stdout);
pac.solve();
return 0;
}

T3、不同的缩写(diff)

传送门

Code 

/*
每个字符串只需要找出n个子序列即可(越短越好)
二分答案,dinic跑匹配
2019/2/13 12:07~13:00+15:30~16:07
*/
#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
const int MN=305,MS=305,TT=100505;
int N,ch[MN][MS][26],len[MN];
char s[MN][MS];
int trie[MN*MN+10][26],tot,siz[MN*MN+10];
char t[MN*MN][MS];
int num;
std::vector<int> G[MN];
std::queue<std::pair<int,int> > que;
class Dinic
{
private:
const int S=0,T=100500,inf=0x3f3f3f3f;
struct edge{int to,w,nex;}e[TT*2];int cur[TT],hr[TT],d[TT],q[TT],en;
inline void Ins(int f,int t)
{
e[++en]=(edge){t,1,hr[f]};hr[f]=en;
e[++en]=(edge){f,0,hr[t]};hr[t]=en;
}
inline bool bfs()
{
memset(d,0,sizeof d);register int i,j,tp;
for(d[q[i=tp=1]=S]=1;i<=tp;++i)
for(j=hr[q[i]];j;j=e[j].nex)
if(!d[e[j].to]&&e[j].w) d[q[++tp]=e[j].to]=d[q[i]]+1;
return d[T];
}
inline int dfs(int x,int f)
{
if(x==T) return f;register int used=0;
for(int &i=cur[x];i;i=e[i].nex)
if(d[e[i].to]==d[x]+1&&e[i].w)
{
int w=dfs(e[i].to,min(f-used,e[i].w));
used+=w;e[i].w-=w;e[i^1].w+=w;
if(used==f) return used;
}
return d[x]=-1,used;
}
public:
inline void ins(int f,int t){Ins(f,t+N);}
inline void init(){memset(hr,0,sizeof hr);en=1;}
bool check()
{
for(int i=1;i<=N;++i) Ins(S,i);
for(int i=1;i<=tot;++i) Ins(i+N,T);
int maxflow=0;
while(bfs()) memcpy(cur,hr,sizeof cur),maxflow+=dfs(S,inf);
return maxflow==N;
}
inline void G()
{
for(int i=1;i<=N;++i) for(int j=hr[i];j;j=e[j].nex)
if(!e[j].w&&e[j].to) {puts(t[e[j].to-N]);break;}
}
}pac;
bool chk(int mid)
{
register int i,j,S;pac.init();
for(i=1;i<=N;++i) for(S=G[i].size(),j=0;j<S;++j)
if(siz[G[i][j]]<=mid) pac.ins(i,G[i][j]);
return pac.check();
}
inline void getans(int ans){chk(ans);pac.G();}
void bfs(int str)
{
while(!que.empty()) que.pop();
que.push(std::make_pair(0,0));
while(!que.empty())
{
int last=que.front().first,p=que.front().second;que.pop();
register int i;
for(i=0;i<26;++i)if(ch[str][p][i]<=len[str])
{
if(!trie[last][i])
{
trie[last][i]=++tot;
siz[tot]=siz[last]+1;
for(int al=0;al<siz[last];++al) t[tot][al]=t[last][al];
t[tot][siz[last]]='a'+i;
}
++num;G[str].push_back(trie[last][i]);
que.push(std::make_pair(trie[last][i],ch[str][p][i]));
if(num>=N) return;
}
}
}
int main()
{
freopen("diff.in","r",stdin);
freopen("diff.out","w",stdout);
scanf("%d",&N);
register int i,j;
for(i=1;i<=N;++i) scanf("%s",s[i]+1),len[i]=strlen(s[i]+1);
for(i=1;i<=N;++i)
{
memset(ch[i][len[i]],0x3f,sizeof ch[i][len[i]]);
for(j=len[i]-1;~j;--j)
memcpy(ch[i][j],ch[i][j+1],sizeof ch[i][j]),
ch[i][j][s[i][j+1]-'a']=j+1;
}
for(i=1;i<=N;++i) num=0,bfs(i);
int mid,l=1,r=300,ans=-1;
for(;l<=r;mid=(l+r)>>1,chk(mid)?(ans=mid,r=mid-1):(l=mid+1));
if(ans==-1) return 0*puts("-1");
printf("%d\n",ans);getans(ans);return 0;
}

Blog来自PaperCloud,未经允许,请勿转载,TKS!

FOI冬令营 Day1的更多相关文章

  1. 2016NOI冬令营day1

    感冒了!!!: ( 上午听 picks 讲多项式导论(所有内容均不考)只听懂了那个O(n1.585)的多项式乘法算法 : ( 安装好了弹幕!太厉害了(有电脑的都在刷弹幕) :  ( 中午吃的不错 : ...

  2. [冬令营Day1 T2]sequence

    题目描述 Description 给一个长度为N的序列以及Q的询问,每次两个参数l,r,问你序列[l,r]中的最大连续和 输入描述 Input Description 一行二个正整数N,Q. 接下来一 ...

  3. FOI 冬令营 Day6

    目录 T1.堆(heap) 传送门 Code T2.密文(secret) 传送门 Code T3.树(tree) 传送门 Code 别问Day5到底去哪里了,咕咕咕 T1.堆(heap) 传送门 Co ...

  4. FOI冬令营 Day4

    目录 T1.循环流(flow) 传送门 Code T2.整除分块(mex) 传送门 Code T3.森林(forest) 传送门 Code 咕咕咕 T1.循环流(flow) 传送门 Code /* 特 ...

  5. FOI冬令营 Day 3

    目录 T1.签到题(sort) 传送门 Code T2.送分题(queue) 传送门 Code T3.简单题(game) 传送门 Code 咕咕咕 T1.签到题(sort) 传送门 原题:LOJ 27 ...

  6. FOI冬令营 Day2

    目录 T1.直径(diameter) 传送门 Code T2.定价(price) 传送门 Code T3.排序(sort) 传送门 Code T1.直径(diameter) 传送门 Code //20 ...

  7. 19年PDYZ冬令营游记

    我和卓越的那些事 ——2019年平度一中卓越计划冬令营   题前记: 正月十三那天,刚看完<流浪地球>,便接到了一个电话,老妈告诉我竟然一中组织了一个冬令营,并且起了一个很好的名字“卓越计 ...

  8. JSOI2018冬令营游记&总结(迁移自洛谷博客)

    游记 一开始在冬令营还没开始的时候,十分期待,殊不知每天都有一场浩劫在等着我. Day0 10:50出发,看见lbn同学发了一条说说,也随便发了一个. 然后在车上一直在睡觉,现在感觉挺后悔的,其实可以 ...

  9. NOIp2016 Day1&Day2 解题报告

    Day1 T1 toy 本题考查你会不会编程. //toy //by Cydiater //2016.11.19 #include <iostream> #include <cstd ...

随机推荐

  1. 字符串replace的理解和练习和配合正则表达式的使用

    下面代码展示了(demo地址 https://codepen.io/peach_/pen/jONJjRY): 1.字符串replace的理解和练习和配合正则表达式的使用, 2.正则表达式学习 3.通过 ...

  2. Element ui tree 搜索

    搜索框 属性 :filter-node-method="filterNode" 对树节点进行筛选时执行的方法,返回 true 表示这个节点可以显示,返回 false 则表示这个节点 ...

  3. Snort Rule Infographic

    Snort Rule Infographic Official Documentation Snort FAQ  Snort Team / Open Source Community Snort Us ...

  4. PHP 的闭包

    匿名函数 提到闭包就不得不想起匿名函数,也叫闭包函数(closures),貌似PHP闭包实现主要就是靠它.声明一个匿名函数是这样: 1 $func = function() { 2 3 }; //带结 ...

  5. vue的mescroll搜索运用以及各种填坑处理

    父组件处理: <template> <div class="wrap"> <!-- 搜索框 --> <div class="se ...

  6. ES6中 对字符串增强

    在曾经,我们只能用A.indexof(B)来判断A中是否含有B字符串: 现在在ES6中 有了: includes(), startswith(),endswith() reapt()重复次数: 输出 ...

  7. http接口测试工具-Advanced-REST-client

    非常好用的http接口测试工具 相信作为一个java开发人员,大家或多或少的要写或者接触一些http接口.而当我们需要本地调试接口常常会因为没有一款好用的工具而烦恼.今天要给大家介绍一款非常好用.实用 ...

  8. Python-共享引用

    A会改变么? 下面三小段代码,A的值都会改变么? >>> A = "spam" >>> B = A >>> B = " ...

  9. C++——异常处理

    前言 大型和十分复杂的程序往往会产生一些很难查找的甚至是无法避免的运行时错误.当发生运行时错误时,不能简单地结束程序运行,而是退回到任务的起点,指出错误,并由用户决定下一步工作.面向对象的异常处理(e ...

  10. C++——多态性 与 虚函数

    多态性 多态性是面向对象程序设计的关键技术之一.若程序设计语言不支持多态性,不能称为面向对象的语言.利用多态性技术,可以调用同一个函数名的函数,实现完全不同的功能. 多态性(polymorphism) ...