B题打错调了半天,C题想出来来不及打,还好没有挂题

AC:AB Rank:96 Rating:2125+66->2191

A.Berzerk

题目大意:有一个东东在长度为n的环上(环上点编号0~n-1),两个玩家,玩家1有a种操作可选,玩家2有b种操作可选,每种操作可以让这个东东向前走若干步,两个玩家轮流操作,谁先让东东走到0谁胜,求出双方都选最优操作的情况下,东东开始在1~n-1各位置时玩家1先手和玩家2先手会必胜,必败还是无限循环。(a,b<n<=7000)

思路:类似DFS或者BFS的乱找,每次确定一个必败状态时,能到该状态的所有状态都为必胜态,一个状态能到的所有状态都确定为必胜时,该状态必败,用数组记下每个状态还有几个能到的状态未被确定即可,最后无法确定的状态即为循环,总复杂度O((a+b)n)。

#include<cstdio>
char B[<<],*S=B,C;int X;
inline int read()
{
while((C=*S++)<''||C>'');
for(X=C-'';(C=*S++)>=''&&C<='';)X=(X<<)+(X<<)+C-'';
return X;
}
#define MN 7000
int n,s[],t[][MN+],u[MN*+],q[MN*+],l[MN*+],qn;
int d(int x,int y){return x*n+(y+n)%n;}
void lose(int);
void win(int p)
{
int x=p/n,y=p%n,i,v;
x^=;u[p]=;
for(i=;i<=s[x];++i)
{
v=d(x,y-t[x][i]);
if(!u[v]&&++l[v]==s[x])lose(v);
}
}
void lose(int p)
{
int x=p/n,y=p%n,i,v;
x^=u[p]=;
for(i=;i<=s[x];++i)
{
v=d(x,y-t[x][i]);
if(!u[v])win(v);
}
}
int main()
{
fread(B,,<<,stdin);
int i,x,y;
for(n=read(),x=;x<;++x)for(s[x]=read(),i=;i<=s[x];++i)t[x][i]=read();
u[n]=;lose();lose(n);
for(i=;i<n;++i)printf("%s ",u[i]?u[i]>?"Win":"Lose":"Loop");puts("");
for(i=;i<n;++i)printf("%s ",u[i+n]?u[i+n]>?"Win":"Lose":"Loop");
}

B.Legacy

题目大意:n个点,一个人一开始位于s,有q个走法供他选择,走法有3种种类:1.从v到u,花费w;2.从v到l~r中的一个点,花费w;3.从l~r中的一个点到v,花费w,求到各个点的最短路。(n,q<=100,000)

思路:线段树优化建图。第一类边直接连;第二类我们建一棵线段树,所有父亲向儿子连长度为0的边,表示到了该区间也能到达该区间中的点,每次我们让v连向表示[l,r]的O(log)个线段树节点即可;第三类我们再建一棵线段树,所有儿子向父亲连长度为0的边,这样每个点就能到达所有表示包含它的区间的线段树节点,每次我们让表示[l,r]的线段树上节点连向v即可。跑Dijkstra,总复杂度O((n+q)logn^2)。

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define ll long long
char B[<<],*S=B,C;int X;
inline int read()
{
while((C=*S++)<''||C>'');
for(X=C-'';(C=*S++)>=''&&C<='';)X=(X<<)+(X<<)+C-'';
return X;
}
#define MN 100000
#define N 131072
#define MV 524288
#define ME 5000000
#define d(x,y) make_pair(x,y)
struct edge{int nx,t,w;}e[ME+];
int h[MV+],en;ll ds[MV+];
typedef pair<ll,int> data;
priority_queue<data,vector<data>,greater<data> >pq;
inline void ins(int x,int y,int w){e[++en]=(edge){h[x],y,w};h[x]=en;}
void ins1(int l,int r,int f,int w)
{
for(l+=N-,r+=N+;l^r^;l>>=,r>>=)
{
if(~l&)ins(f+N,l+,w);
if( r&)ins(f+N,r-,w);
}
}
void ins2(int l,int r,int t,int w)
{
for(l+=N-,r+=N+;l^r^;l>>=,r>>=)
{
if(~l&)ins(l++(N<<),t+N,w);
if( r&)ins(r-+(N<<),t+N,w);
}
}
int main()
{
fread(B,,<<,stdin);
int n,m,i,s,a,b,c,d;ll x;
n=read();m=read();s=read();
for(i=;i<N;++i)
{
ins(i,i<<,);ins(i,i<<|,);
ins(i+N<<,i+(N<<),);ins(i+N<<|,i+(N<<),);
ins(i+N,i+N*,);ins(i+N*,i+N,);
}
while(m--)
{
a=read();b=read();c=read();d=read();
if(a==)ins(b+N,c+N,d);
if(a==)ins1(c,d,b,read());
if(a==)ins2(c,d,b,read());
}
memset(ds,,sizeof(ds));ds[s+N]=;pq.push(d(,s+N));
while(pq.size())
{
a=pq.top().second;x=pq.top().first;pq.pop();
for(i=h[a];i;i=e[i].nx)if(x+e[i].w<ds[e[i].t])
{
ds[e[i].t]=x+e[i].w;
pq.push(d(ds[e[i].t],e[i].t));
}
while(pq.size()&&pq.top().first>ds[pq.top().second])pq.pop();
}
for(i=;i<=n;++i)printf("%I64d ",ds[i+N]<ds[]?ds[i+N]:-);
}

C.Till I Collapse

题目大意:给定n个数,对于每个1<=k<=n,求把数列分成若干段,每段数字种数不超过k,至少分几段。(n<=100,000)

思路:对于k<=n^0.5,我们每次O(n)暴力统计答案,对于k>n^0.5,我们先预处理出k=n^0.5时分成的至多n^0.5段,每段的右端点和各种数字的出现次数,每次把所有右端点向右推即可知道k+1时的信息,右端点每向右推一位我们都只要O(1),总复杂度O(n^1.5)。

#include<cstdio>
inline int read()
{
int x;char c;
while((c=getchar())<''||c>'');
for(x=c-'';(c=getchar())>=''&&c<='';)x=(x<<)+(x<<)+c-'';
return x;
}
#define MN 100000
#define MK 320
int a[MN+],f[MK+][MN+],cnt[MK+],r[MK+],ans;
int main()
{
int n=read(),i,j,k;
for(i=;i<=n;++i)a[i]=read();
for(i=;i<=n&&i<=MK;++i)
{
for(ans=j=;j++<=n;)
if(j>n||(!f[][a[j]]++&&++cnt[]>i))
{
for(k=j>n?n:j;cnt[];--k)if(!--f[][a[k]])--cnt[];
if(j<=n)f[][a[j]]=cnt[]=;++ans;
}
printf("%d ",ans);
}
if(i<=n)
{
for(ans=j=;j<=n;r[ans]=++j)
if(!f[ans][a[j]]++&&++cnt[ans]>i)
{
--f[ans][a[j]];--cnt[ans];
++f[++ans][a[j]];++cnt[ans];
}
printf("%d ",ans);
}
for(++i;i<=n;++i)
{
for(j=;j<=ans;++j)
{
for(k=r[j];k<=n;r[j]=++k)
{
if(!--f[j+][a[k]])--cnt[j+];
if(!f[j][a[k]]++&&++cnt[j]>i)
{
if(!--f[j][a[k]])--cnt[j];
if(!f[j+][a[k]]++)++cnt[j+];
break;
}
}
if(k>n)ans=j;
}
printf("%d ",ans);
}
}

Codeforces Round #406 (Div. 1)的更多相关文章

  1. Codeforces Round #406 (Div. 1) B. Legacy 线段树建图跑最短路

    B. Legacy 题目连接: http://codeforces.com/contest/786/problem/B Description Rick and his co-workers have ...

  2. Codeforces Round #406 (Div. 1) A. Berzerk 记忆化搜索

    A. Berzerk 题目连接: http://codeforces.com/contest/786/problem/A Description Rick and Morty are playing ...

  3. 维护前面的position+主席树 Codeforces Round #406 (Div. 2) E

    http://codeforces.com/contest/787/problem/E 题目大意:给你n块,每个块都有一个颜色,定义一个k,表示在区间[l,r]中最多有k中不同的颜色.另k=1,2,3 ...

  4. 区间->点,点->区间,线段树优化建图+dijstra Codeforces Round #406 (Div. 2) D

    http://codeforces.com/contest/787/problem/D 题目大意:有n个点,三种有向边,这三种有向边一共加在一起有m个,然后起点是s,问,从s到所有点的最短路是多少? ...

  5. 有向图博弈+出度的结合 Codeforces Round #406 (Div. 2) C

    http://codeforces.com/contest/787/problem/C 题目大意:有一个长度为n的环,第1个位置是黑洞,其他都是星球.已知在星球上(不含第一个黑洞)有一位神.有两个人, ...

  6. 【转】Codeforces Round #406 (Div. 1) B. Legacy 线段树建图&&最短路

    B. Legacy 题目连接: http://codeforces.com/contest/786/problem/B Description Rick and his co-workers have ...

  7. Codeforces #Round 406(Div.2)

    来自FallDream的博客,未经允许,请勿转载,谢谢. ------------------------------------------------------- 大家好,我是一个假人.在学习O ...

  8. Codeforces Round #406 (Div. 2) D. Legacy 线段树建模+最短路

    D. Legacy time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...

  9. Codeforces Round #406 (Div. 2)滚粗记

    A 一看到题,不是一道解不定方程的裸题吗,调了好久exgcd. 其实一个for就好了啊 B 一直WA ON TEST 7真是烦,一想会不会是编号太大了,又写了一个map版本,无用. 调了好久好久才发现 ...

随机推荐

  1. 【iOS】swift-如何理解 if let 与guard?

    著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:黄兢成 链接:http://www.zhihu.com/question/36448325/answer/68614858 ...

  2. node创建第一个应用

    如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi. 从这个角度看,整个"接收 HTTP 请求并提供 ...

  3. 识别图片中文字(百度AI)

     这个是百度官方的文档         https://ai.baidu.com/docs#/OCR-API/top    通用的文字识别,如果是其他的含生僻字/含位置信息的版本,请参考官方的文档,只 ...

  4. python使用tesseract-ocr完成验证码识别(模型训练和使用部分)

    一.Tesseract训练 大体流程为:安装jTessBoxEditor -> 获取样本文件 -> Merge样本文件 –> 生成BOX文件 -> 定义字符配置文件 -> ...

  5. Comet之SSE(Server - Sent - Envent,服务器发送事件)

    1.SSE API 先要创建一个新的EventSource对象,并传进一个入口点: var source = new EventSource("myenvent.php"); △: ...

  6. php的格式化数字函数

    php格式化数字:位数不足前面加0补足 php格式化数字:位数不足前面加0补足 感谢:http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/12 ...

  7. PCB名詞解釋:通孔、盲孔、埋孔(转载)

    文章转载自:https://www.researchmfg.com/2011/07/pth-blind-hole-buried-hole/ PCB名詞解釋:通孔.盲孔.埋孔 Posted by 工作熊 ...

  8. 新概念英语(1-9)How is Ema?

    A:Hello Helen. B:Hi Steven. A:How are you today? B:I'm very well, thank you. And you? A:I'm fine tha ...

  9. Spark入门(1-3)Spark的重要概念

    1.什么是弹性分布式数据集? Spark提出了RDD(Resilient Distributed Datasets)这么一个全新的概念,RDD弹性分布式数据集是并行.容错的分布式数据结构:可以将RDD ...

  10. less规范

    Less 编码规范 (1.1) 简介 该文档主要的设计目标是提高 Less 文档的团队一致性与可维护性. Less 代码的基本规范和原则与 CSS 编码规范 保持一致. 编撰 吕俊涛 本文档由商业运营 ...