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. TensorFlow问题“The TensorFlow library wasn't compiled to use SSE instructions, but these are available on your machine and could speed up CPU computations.”

    出现的问题: 在使用TensorFlow跑官方教程例子时报以下warning: 虽程序能正常跑出结果,但作为一名强迫症患者对此很是不爽,于是查找资料找到隐藏该warning的解决办法. 解决办法: 在 ...

  2. 学号:201621123032 《Java程序设计》第3周学习总结

    1:本周学习总结 1. 写出你认为本周学习中比较重要的知识点关键词. 类,对象,封装,继承,方法. 2. 用思维导图或者Onenote或其他工具将这些关键词组织起来 2:书面作业 2.1:以面向对象方 ...

  3. python API的安全认证

    我们根据pid加客户端的时间戳进行加密md5(pid|时间戳)得到的单向加密串,与时间戳,或者其它字段的串的url给服务端. 服务端接收到请求的url进行分析 客户端时间与服务端的时间戳之差如果大于规 ...

  4. 关于FPGA随笔

    verilog与c

  5. java方法的定义格式

    Java的方法类似于其他语言的函数,是一段用来完成特定功能的代码片段,声明格式为: [修饰符1  修饰符2  …..] 返回值类型  方法名( 形式参数列表 ){ Java 语句;… … … } 例如 ...

  6. display属性

    display 属性规定元素应该生成的框的类型. 值 描述 none 此元素不会被显示. block 此元素将显示为块级元素,此元素前后会带有换行符. inline 默认.此元素会被显示为内联元素,元 ...

  7. wpf研究之道——datagrid控件数据绑定

    前台: <DataGrid x:Name="TestCaseDataGrid" ItemsSource="{Binding}" > {binding ...

  8. kali rolling更新源之gpg和dirmngr问题

    1.编辑 /etc/apt/source.list gedit /etc/apt/sources.list 输入更新源,可以选任何可用更新源,这里设置官方源 deb http://http.kali. ...

  9. js window

    window对象: browser object mode :bom对象. bom提供了独立于内容而与浏览器窗口进行交互的对象. bom主要用于管理窗口与窗口之间的通讯,因此其核心对象是window ...

  10. 用C#(.NET Core) 实现简单工厂和工厂方法模式

    本文源自深入浅出设计模式. 只不过我是使用C#/.NET Core实现的例子. 前言 当你看见new这个关键字的时候, 就应该想到它是具体的实现. 这就是一个具体的类, 为了更灵活, 我们应该使用的是 ...