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

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. hdu 6143第二类striling

    题意:有m种字符,要求构造两段长度为n的字符串,其中这两段不能有相同的字符 枚举左边选了i种字符,右边可以选1,2....min(n,m-i)种字符 这样就把问题转化为用k种字符构造n长度的字符串的种 ...

  2. jQuery 基础知识

    一.序言 jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后的又一个优秀的JavaScript代码库(JavaScript框架).jQuery设计的宗旨是"W ...

  3. $.ajaxSetup()与$.ajax()区别

    ajaxSetup()其使用方法与ajax()并无区别,只是在其之后的ajax()不用再重复添加相同参数,节省了代码量. 附:API中关于jQuery.ajaxSetup([options])的描述和 ...

  4. 将网址url中的参数转化为JSON格式的两种方法

    在我们进入主题前,我先先看下获取网址URL的方法: window.location.href // 设置或获取整个URL为字符串 window.location.hash // 设置或获取href属性 ...

  5. VSCode 搭建 React Native 环境

    安装 React Native Tools 在插件市场搜索 react 找到 React Native Tools 进行安装: 创建的react-native的工程拖入vscode中 点击F5即可运行 ...

  6. arm9交叉编译工具链

    Arm-linux-gcc: gcc和arm-linux-gcc的头文件并不一样. Eg. Arm-linux-ld:链接器,-T参数是使用链接器脚本. Eg. Arm-linux-readelf:读 ...

  7. 无法写入配置文件...需要在IIS中手动创建此虚拟目录,才可以打开此项目

    无妄之灾   之前闲着没事写了一个webapi项目,今天下了班闲来无事就像拿出来改改,没想到打开的时候就提示出现错误. 没错就是这货,其实也不是第一次遇见这个问题了,但是之前一直没有找到解决方案,在网 ...

  8. Windows 网络凭证

    前言 单位内部,员工之间电脑免不了要相互访问(eg:访问共享文件夹).这就引出网络凭证的概念,即你用什么身份访问对端计算机. 实验环境 创建共享文件夹 WinSrv 2008上新建的文件夹shared ...

  9. Vue项目打包发布,配置Nginx

    #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #erro ...

  10. 无线热点登陆认证原理探究---captive portal 什么是Captive Portal

    什么是Captive Portal 大家肯定都连过公共场所的wifi热点,比如麦当劳等地方的.他们的wifi往往一连上去就会弹出一个要求登录或者微信关注之类的页面,只有在这个页面完成操作了才能正常访问 ...