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

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. App客户端性能测试点总结

    一.内存 测试范围1. 空闲状态下的应用内存消耗情况2. 中等规格状态下的应用内存消耗情况3. 满规格状态下的应用内存消耗情况4. 应用内存峰值情况5. 应用内存泄露情况6. 应用是否常驻内存7. 压 ...

  2. C# 阿拉伯数字转换为中文数字/中文数字转换为阿拉伯数字

    项目中经常会格式化数据,转换数字的使用情况比较多,记录一下数字转换的方法! 如果需要转换为繁体中文,将数组里的汉字换成繁体中文即可. 1.阿拉伯数字转换为中文数字 /// <summary> ...

  3. Http 和 Socket 之间的恩爱情仇

    前言 一些刚入门的小伙伴可能会用 Socket,也会用 OkHttp 或者 HttpUrlConnection 等一些 HTTP 客户端工具,这两个东西看着有点像可是又不太一样,到底是哪里不一样呢? ...

  4. jQuery遍历(3)

    上期我们讲了遍历的祖先.后代和同胞的问题,现在我们讲讲遍历遍历过滤 三个最基本的过滤方法是:first(), last() 和 eq(),它们允许您基于其在一组元素中的位置来选择一个特定的元素.其他过 ...

  5. vue-cli 运行打开浏览器

    在配置好项目之后的package.json文件中,找到运行的script,其中“serve”中增加配置“ --open” "scripts": { "serve" ...

  6. Oracle 定时JOB

    讲一下Oracle创建临时job小窍门,创建Oracle临时JOB是为了临时执行调用过程或者函数,只调用一次. 1.创建Oracle临时job declare VJOB  number; begin ...

  7. python网络爬虫之爬取图片

    今天使用requests和BeautifulSoup爬取了一些图片,还是很有成就感的,注释可能有误,希望大家多提意见: 方法一:requests import requests from bs4 im ...

  8. hexo Yelee 主题的busuanzi网站统计没数字显示问题解决

    j进入你的Yelee主题路径: themes\yelee\source\css\_partial 修改该路径下的: footer.styl 修改文件内容: 将内容改为: 然后你的站点就可以了

  9. Python 写入训练日志文件并控制台输出

    1. 背景 在深度学习的任务中,通常需要比较长时间的训练,因此我们会选择离开电脑.笔者在跟踪模型表现, 观察模型accuracy 以及 loss 的时候,比较传统的方法是在控制台print输出或者直接 ...

  10. Eclipse启动tomcat超时

    启动tomcat 超时 Server Tomcat v8.0 Server at localhost was unable to start within 45 seconds. If the ser ...