WC2016自测
挑战NPC
原题链接
爆搜20分,贪心10分,网络流30分
//挑战NPC
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
inline char gc()
{
static char now[1<<16],*S,*T;
if(S==T) {T=(S=now)+fread(now,1,1<<16,stdin); if(S==T) return EOF;}
return *S++;
}
inline int read()
{
int x=0; char ch=gc();
while(ch<'0'||'9'<ch) ch=gc();
while('0'<=ch&&ch<='9') x=x*10+ch-'0',ch=gc();
return x;
}
int const N=420;
int const INF=0x7FFFFFFF;
int n,m,e;
int edCnt,h[N];
struct edge{int v,c,nxt;} ed[N*N];
void edAdd(int u,int v,int c)
{
edCnt++; ed[edCnt].v=v,ed[edCnt].c=c,ed[edCnt].nxt=h[u],h[u]=edCnt;
edCnt++; ed[edCnt].v=u,ed[edCnt].c=0,ed[edCnt].nxt=h[v],h[v]=edCnt;
}
int ans1,link1[N],cnt1[N],link[N];
void check()
{
memset(cnt1,0,sizeof cnt1);
int res=0;
for(int i=1;i<=n;i++) cnt1[link[i]]++;
for(int i=1;i<=m;i++) if(cnt1[i]<=1) res++; else if(cnt1[i]>3) return;
if(res>ans1) ans1=res,memcpy(link1,link,sizeof link);
}
void dfs(int u)
{
if(u>n) check();
for(int i=h[u];i;i=ed[i].nxt) link[u]=ed[i].v-n,dfs(u+1);
}
void work1()
{
ans1=-1; dfs(1);
printf("%d\n",ans1);
for(int i=1;i<=n;i++) printf("%d ",link1[i]);
printf("\n");
}
void work2()
{
int ans2=m; if(n>m) ans2-=(n-m+1)/2;
printf("%d\n",ans2);
for(int i=1;i<=ans2&&i<=n;i++) printf("%d ",i);
for(int i=1;i<=n-ans2;i++) printf("%d ",ans2+(i+2)/3);
printf("\n");
}
int s,t;
int dpt[N]; int op,cl,q[N];
bool bfs()
{
memset(dpt,0,sizeof dpt);
op=cl=0; dpt[q[++cl]=s]=1;
while(op<cl)
{
int u=q[++op]; if(u==t) break;
for(int i=h[u];i;i=ed[i].nxt)
{
int v=ed[i].v,c=ed[i].c;
if(!dpt[v]&&c) dpt[q[++cl]=v]=dpt[u]+1;
}
}
return dpt[t];
}
int fill(int u,int in)
{
if(u==t||in==0) return in;
int out=0;
for(int i=h[u];i;i=ed[i].nxt)
{
int v=ed[i].v,c=ed[i].c;
if(dpt[v]!=dpt[u]+1||!c) continue;
int fl=fill(v,min(in-out,c));
if(fl==0) dpt[v]=0;
else out+=fl,ed[i].c-=fl,ed[i^1].c+=fl;
if(in==out) return out;
}
return out;
}
int Dinic()
{
int res=0;
while(bfs()) res+=fill(s,INF);
return res;
}
void work3()
{
s=0,t=n+m+1;
for(int i=1;i<=n;i++) edAdd(s,i,1);
int edCnt1=edCnt+1;
for(int i=1;i<=m;i++) edAdd(n+i,t,1);
int flow=Dinic(),ans3=m;
if(flow!=n)
{
for(int i=2;i<=edCnt1;i++) ed[i].c=(i&1)?0:1;
for(int i=edCnt1;i<=edCnt;i++) ed[i].c=(i&1)?0:3;
Dinic(); ans3=0;
for(int i=h[t];i;i=ed[i].nxt) if(ed[i].c<=1) ans3++;
}
printf("%d\n",ans3);
for(int u=1;u<=n;u++)
for(int i=h[u];i;i=ed[i].nxt)
if(ed[i].c==0&&ed[i].v!=s) {printf("%d ",ed[i].v-n); break;}
printf("\n"); return;
}
int main()
{
freopen("npc.in","r",stdin);
int task=read();
while(task--)
{
n=read(),m=read(),e=read();
edCnt=1; memset(h,0,sizeof h);
for(int i=1;i<=e;i++) {int u=read(),v=read(); edAdd(u,v+n,1);}
if(e<=25) work1();
else if(e==n*m) work2();
else work3();
}
return 0;
}
论战捆竹竿
原题链接
竹竿之间的捆绑可以看做在字符串后面续一段,这要求求出所有相同的前缀与后缀。转化为了给出若干个正整数,求[1,w]中有多少个数能被这些数的和表达出来。
//论战捆竹竿
#include <cstdio>
#include <cstring>
int const N=5e5+10;
int n,lim; char s[N];
int sa[N],rank[N<<1],h[N];
int cnt[N],tmp[N],rank1[N];
int min(int x,int y) {return x<y?x:y;}
bool add[N],f[N];
int tCnt,t[N];
int main()
{
freopen("jie.in","r",stdin);
int task; scanf("%d",&task);
while(task--)
{
scanf("%d%d",&n,&lim);
scanf("%s",s+1);
if(lim<n) {printf("0\n"); continue;}
memset(cnt,0,sizeof cnt); memset(rank,0,sizeof rank);
for(int i=1;i<=n;i++) cnt[s[i]]=1;
for(int i='a';i<='z';i++) cnt[i]+=cnt[i-1];
for(int i=1;i<=n;i++) rank[i]=cnt[s[i]];
int k=0;
for(int L=1;k<n;L<<=1)
{
memset(cnt,0,sizeof cnt);
for(int i=1;i<=n;i++) cnt[rank[i+L]]++;
for(int i=1;i<=n;i++) cnt[i]+=cnt[i-1];
for(int i=n;i>=1;i--) tmp[cnt[rank[i+L]]--]=i;
memset(cnt,0,sizeof cnt);
for(int i=1;i<=n;i++) cnt[rank[tmp[i]]]++;
for(int i=1;i<=n;i++) cnt[i]+=cnt[i-1];
for(int i=n;i>=1;i--) sa[cnt[rank[tmp[i]]]--]=tmp[i];
k=0; memcpy(rank1,rank,sizeof rank1);
for(int i=1;i<=n;i++)
{
if(rank1[sa[i]]!=rank1[sa[i-1]]||rank1[sa[i]+L]!=rank1[sa[i-1]+L]) k++;
rank[sa[i]]=k;
}
}
k=0; memset(h,0,sizeof h);
for(int i=1;i<=n;i++)
{
if(--k<0) k=0;
if(rank[i]==1) {h[1]=0; continue;}
while(s[i+k]==s[sa[rank[i]-1]+k]) k++;
h[rank[i]]=k;
}
int len=N; memset(add,false,sizeof add);
for(int i=rank[1]-1;i>=1;i--)
if((len=min(len,h[i+1]))==n-sa[i]+1) add[sa[i]-1]=true;
len=N;
for(int i=rank[1]+1;i<=n;i++)
if((len=min(len,h[i]))==n-sa[i]+1) add[sa[i]-1]=true;
add[n]=true;
for(int i=1;i<=n;i++)
if(add[i]) for(int j=i<<1;j<=n;j+=i) add[j]=false;
tCnt=0;
for(int i=1;i<=n;i++) if(add[i]) t[++tCnt]=i;
memset(f,false,sizeof f); f[n]=true;
for(int i=n;i<=lim;i++)
if(f[i]) for(int j=1;j<=tCnt;j++) f[i+t[j]]=true;
int ans=0;
for(int i=n;i<=lim;i++) if(f[i]) ans++;
printf("%d\n",ans);
for(int i=1;i<=tCnt;i++) printf("%d ",t[i]);
}
return 0;
}
鏖战表达式
原题链接
友情提示这字念鏖(áo)。并不会做。
k=1可以用可持久化平衡树搞?可惜我不会。
WC2016自测的更多相关文章
- wc2016总结
因为我太弱了,高一才第一次来wc. 前几天讲课,被各种小学微积分和初中高等代数虐,简直naive.只好自己做做bzoj,想着练练模板之类的东西. 考试当天自觉状态不错,翻开试题感觉各种神奇(这难道是串 ...
- mysql每秒最多能插入多少条数据 ? 死磕性能压测
前段时间搞优化,最后瓶颈发现都在数据库单点上. 问DBA,给我的写入答案是在1W(机械硬盘)左右. 联想起前几天infoQ上一篇文章说他们最好的硬件写入速度在2W后也无法提高(SSD硬盘) 但这东西感 ...
- 强强联合,Testin云测&云层天咨众测学院开课了!
Testin&云层天咨众测学院开课了! 共享经济时代,测试如何赶上大潮,利用碎片时间给女票或者自己赚点化妆品钱? 2016年12月13日,Testin联手云层天咨带领大家一起推开众测的大门 ...
- nginx代理https站点(亲测)
nginx代理https站点(亲测) 首先,我相信大家已经搞定了nginx正常代理http站点的方法,下面重点介绍代理https站点的配置方法,以及注意事项,因为目前大部分站点有转换https的需要所 ...
- 【腾讯优测干货分享】安卓专项测试之GPU测试探索
本文来自于Dev Club 开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57c7ffdc0569a1191bce8a63 作者:章未哲——腾讯SNG质 ...
- 【腾讯优测干货分享】如何降低App的待机内存(四)——进阶:内存原理
本文来自于腾讯优测公众号(wxutest),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/3FTPFvZRqyAQnU047kmWJQ 1.4进阶:内存原理 在 ...
- 【腾讯优测干货分享】如何降低App的待机内存(三)——探索内存增长的原因
本文来自于腾讯优测公众号(wxutest),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/8BiKIt3frq9Yv9KV5FXlGw 1.3新问题的进一步挖 ...
- 【腾讯优测干货分享】如何降低App的待机内存(二)——规范测试流程及常见问题
本文来自于腾讯优测公众号(wxutest),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/806TiugiSJvFI7fH6eVA5w 作者:腾讯TMQ专项测 ...
- Http压测工具wrk使用指南
用过了很多压测工具,却一直没找到中意的那款.最近试了wrk感觉不错,写下这份使用指南给自己备忘用,如果能帮到你,那也很好. 安装 wrk支持大多数类UNIX系统,不支持windows.需要操作系统支持 ...
随机推荐
- maven核心概念--生命周期
maven有一个命令,mvn package,该命令行并没有指定一个插件目标, 而是指定了一个Maven生命周期阶段.一个阶段是在被Maven称为"构建生命周期"中的一个步骤.生命 ...
- Linux使用top与free命令查看CPU与内存使用情况
top命令: 显示内容解释: 第一行top分别为:当前时间:系统运行天数:使用者个数:系统负载的平均值,后面的三个值分别为1分钟前.5分钟前.15分钟前进程的平均数,这个数值超过 CPU 数目时,说明 ...
- RESTClient
RESTClient是Mozilla Firefox一个用于测试http请求插件. 1.打开火狐扩展搜索RESTClient进行安装并重启浏览器. 2.重启后可以在Mozilla Firefox地址栏 ...
- awk中引用shell变量执行替换的脚本
遇到问题: 现在有两个脚本,我想 将file1中的内容按file2来匹配 [root@154 home]# cat file1 3-1-1 POTV=1,POTA=0,POTP=2 1-4-76 PO ...
- python --- mulitprocessing(多进程)模块使用
1. 什么是进程? 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执 ...
- mybatis支持oracle批量插入
问题:mysql使用mybatis批量插入时,通过foreach标签,将每条记录按照逗号","连接即可. 但是,oracle不支持. oracle支持如下写法: <inser ...
- SQL作业二
目的:通过加载chinook_db文件来把数据导入到sqllite,根据题目的要求进行查询 1.sql语句的基本语法 2.join多表查询的用法 3.group by分组的用法 4.order by排 ...
- JAVA中默认的编码方式
转:http://blog.csdn.net/scyatcs/article/details/31356823 编码问题存在两个方面:JVM之内和JVM之外.1.Java文件编译后形成class这里J ...
- Jmeter性能测试,新手上路篇
1. JMeter简介 Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域. 它可以用于测试静 ...
- 深入理解JAVA虚拟机之JVM性能篇---垃圾回收
一.基本垃圾回收算法 1. 判断对象是否需要回收的方法(如何判断垃圾): 1) 引用计数(Reference Counting) 对象增加一个引用,即增加一个计数,删除一个引用则减少一个计数.垃圾回 ...