Codeforces Round #402 (Div. 1)
A题卡壳了,往离线倒着加那方面想了会儿,后来才发现方向错了,二十多分钟才过掉,过了B后做D,想法好像有点问题,最后只过两题,掉分了,差一点回紫。
AC:AB Rank:173 Rating:2227-23->2204
A.String Game
题目大意:给出字符串A和B,保证B是A的子序列,给出一个长度为A串长度的排列,问按排列的顺序删掉A串中字符,最多删几个使得B任然是A的子序列。(A串长度<=200,000)
思路:发现答案满足单调性,二分删几个,O(n)check一下B还是不是A的子序列,复杂度O(nlogn)。
#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 200000
char a[MN+],b[MN+],s[MN+];
int p[MN+];
bool check(int x)
{
int i,j;
for(i=;a[i];++i)s[i]=a[i];
for(i=;i<x;++i)s[p[i]-]=' ';
for(i=j=;s[i]&&b[j];++i)if(s[i]==b[j])++j;
return !b[j];
}
int main()
{
int i,l=,r,mid,ans;
scanf("%s%s",a,b);
for(r=;a[r];++r)p[r]=read();
while(l<=r)
{
mid=l+r>>;
if(check(mid))ans=mid,l=mid+;
else r=mid-;
}
printf("%d",ans);
}
B.Bitwise Formula
题目大意:给出n条语句和语句中数字的二进制串长m,每条语句会新定义一个变量,并给它赋值,赋值语句有两种,一种给出一个长为m的二进制常量,另一种给出两个出现过的变量或"?",以及一个位运算符(AND、OR、XOR)。所有"?"可以用同一个长为m的二进制串代替,问这个串最小为多少时,所有变量的和最大/最小。(N<=5000,M<=1000)
思路:二进制的每一位独立,分别枚举取0取1就可以了,复杂度O(nm)。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
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 5000
#define MM 1000
map<string,int> mp;
int n,a[MN+][MM+],cnt;
int t[MN+],ta[MN+],tb[MN+];
int aa[MM+],bb[MM+];
int f[MN+];
int check(int p,int k)
{
int i,s=;
for(i=;i<=n;++i)
{
if(!t[i])f[i]=a[i][p];
if(t[i]==)f[i]=(ta[i]?f[ta[i]]:k)&(tb[i]?f[tb[i]]:k);
if(t[i]==)f[i]=(ta[i]?f[ta[i]]:k)|(tb[i]?f[tb[i]]:k);
if(t[i]==)f[i]=(ta[i]?f[ta[i]]:k)^(tb[i]?f[tb[i]]:k);
s+=f[i];
}
return s;
}
int main()
{
int m,i,j,x,y;string s;
n=read();m=read();
for(i=;i<=n;++i)
{
cin>>s;mp[s]=++cnt;cin>>s;
cin>>s;
if(s[]==''||s[]=='')
{
for(j=;j<m;++j)a[i][j]=s[j]-'';
continue;
}
ta[i]=s[]=='?'?:mp[s];
cin>>s;
if(s[]=='A')t[i]=;
if(s[]=='O')t[i]=;
if(s[]=='X')t[i]=;
cin>>s;
tb[i]=s[]=='?'?:mp[s];
}
for(i=;i<m;++i)
{
x=check(i,);y=check(i,);
aa[i]=y<x;bb[i]=y>x;
}
for(i=;i<m;++i)printf("%d",aa[i]);puts("");
for(i=;i<m;++i)printf("%d",bb[i]);
}
C.Peterson Polyglot
题目大意:给出一棵n个节点的Trie树,可以选择一个p,删除Trie树各节点表示的字符串中第p个字符后再组成一棵新的Trie树,求新Trie树的最少节点数和此时应选的最小的p。(n<=300,000)
思路:对树上每个节点统计以该节点深度(根为1)作为p时这棵子树对答案的贡献,贡献即为以该节点各儿子为根的子树合并成一个的大小减去以这个节点为根的子树的大小。合并我们可以用可持久化思想,直接建新的点连向原树,这样两棵子树合并,最多新建相当于小的子树的大小的节点,发现复杂度与启发式合并整棵Trie树相同。总复杂度O(26nlogn)(常数较小)。
#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 600000
int n,c[MN+][],f[MN+],cnt,tn;
int merge(int x,int y)
{
if(!x)return y;if(!y)return x;
int r=++tn;++cnt;
for(int i=;i<;++i)c[r][i]=merge(c[x][i],c[y][i]);
return r;
}
void dfs(int x,int d)
{
int i,rt=++(tn=n);cnt=;
for(i=;i<;++i)if(c[x][i])rt=merge(rt,c[x][i]);
f[d]+=cnt;
for(i=;i<;++i)if(c[x][i])dfs(c[x][i],d+);
}
int main()
{
int i,x,y;
for(n=read(),i=;i<n;++i)x=read(),y=read(),c[x][getchar()-'a']=y;
dfs(,);
for(i=,x=;i<=n;++i)if(f[i]>x)x=f[i],y=i;
printf("%d\n%d",n-x,y);
}
D.Parquet Re-laying
题目大意:给出一个n*m的棋盘,和两个覆盖满1*2棋子的状态,每次允许把相邻两个摆向相同的棋子旋转90°,要求构造出不超过100,000步的方案从一个状态转成另一个状态,无解输出-1。(n,m<=50)
思路:每次从上到下,从左到右找到能旋的横着的棋子,全部转为竖着;再每次找到竖着的棋子转为横着,可以证明最后一定后转成全为横或全为竖,把两个状态都这样做一遍再把第二个的操作反过来输出就可以了。复杂度O(能过)。
#include<cstdio>
#define MN 50
#define MK 100000
char s[MN+][MN+];
int n,m,x[MK+],y[MK+],xn,cnt,t,k[];
void solve()
{
int i,j;
for(i=k[t]=;i<n;++i)
{
scanf("%s",s[i]);
for(j=;j<m;++j)++k[s[i][j]];
}
while(k[t])
{
for(i=;i<n;++i)for(j=;j<m;++j)if(s[i][j]=='U'&&s[i][j+]=='U')
x[++cnt]=i+,y[cnt]=j+,s[i][j]=s[i+][j]='L',s[i][j+]='R',k['U']-=,k['L']+=;
if(!k[t])return;
for(i=;i<n;++i)for(j=;j<m;++j)if(s[i][j]=='L'&&s[i+][j]=='L')
x[++cnt]=i+,y[cnt]=j+,s[i][j]=s[i][j+]='U',s[i+][j]='D',k['U']+=,k['L']-=;
}
}
int main()
{
scanf("%d%d",&n,&m);
t=n&?'U':'L';
solve();xn=cnt;
solve();printf("%d\n",cnt);
for(int i=;i<=xn;++i)printf("%d %d\n",x[i],y[i]);
for(int i=cnt;i>xn;--i)printf("%d %d\n",x[i],y[i]);
}
E.Selling Numbers
题目大意:给一个由数字和"?"组成的串,你可以用0~9替换"?",组成一个数,但要求这个数首位不能为0,给你n个数,把这n个数都分别加上你选出的数,给出0~9各个数字的权值,要求最后n个数中各个出现的数字的权值和加起来最大,求出这个值。(出现的数字和串都不超过1000位,n<=1000)
思路:考虑数位DP,从末尾往前推,每一位的状态只与后一位是否进位有关,发现若把每个数字当前处理过的部分拿出来排个序,进位的数是连续的,用f[i][j]表示当前处理到第i位,每个数后i位从大到小排序后前j个有进位时的最大权值和,每次枚举当前串选哪个数字就能转移了,排序的方法可以以第i位为第1关键字,后i-1位的大小顺序为第2关键字进行计数排序,再注意下一些实现细节就可以了。总复杂度O(10nL)(L表示数和串的长度)。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MN 1001
char a[MN+],b[MN+][MN+],s[MN+];
int l[MN+],f[MN+][MN+],g[MN+][MN+],sa[MN+][MN+],c[MN+],ss[];
void read(char*a,int p)
{
scanf("%s",s);
while(s[l[p]])++l[p];
for(int i=;s[i];++i)a[l[p]-i]=s[i];
}
int get(int x,int y){return b[x][y]?b[x][y]-'':;}
int value(int x,int y){return y>max(l[x],l[])&&!g[x][y]?:c[g[x][y]];}
int main()
{
int n,i,j,k,r,p,v;
read(a,);scanf("%d",&n);
for(i=;i<=n;++i)read(b[i],i);
for(i=;i<;++i)scanf("%d",&c[i]);
for(i=;i<=n;++i)sa[][i]=i;
memset(f,,sizeof(f));f[][]=;
for(i=;i<=MN;++i)
{
memset(ss,,sizeof(ss));
for(j=;j<=n;++j)++ss[get(j,i)];
for(j=;j;--j)ss[j-]+=ss[j];
for(j=n;j;--j)sa[i][ss[get(sa[i-][j],i)]--]=sa[i-][j];
if(i>l[])j=r=;
else if(a[i]=='?')j=i==l[],r=;
else j=r=a[i]-'';
for(;j<=r;++j)
{
for(p=v=,k=;k<=n;++k)
{
g[k][i]=get(k,i)+j;
if(g[k][i]>)g[k][i]-=,++p;
v+=value(k,i);
}
for(k=;;)
{
f[i][p]=max(f[i][p],f[i-][k]+v);
if(k++==n)break;
v-=value(sa[i-][k],i);
if(++g[sa[i-][k]][i]>)g[sa[i-][k]][i]=,++p;
v+=value(sa[i-][k],i);
}
}
}
printf("%d",f[MN][]);
}
Codeforces Round #402 (Div. 1)的更多相关文章
- Codeforces Round #402 (Div. 2)
Codeforces Round #402 (Div. 2) A. 日常沙比提 #include<iostream> #include<cstdio> #include< ...
- Codeforces Round #402 (Div. 2) A+B+C+D
Codeforces Round #402 (Div. 2) A. Pupils Redistribution 模拟大法好.两个数列分别含有n个数x(1<=x<=5) .现在要求交换一些数 ...
- Codeforces Round #402 (Div. 2) A,B,C,D,E
A. Pupils Redistribution time limit per test 1 second memory limit per test 256 megabytes input stan ...
- Codeforces Round #402 (Div. 2) D. String Game
D. String Game time limit per test 2 seconds memory limit per test 512 megabytes input standard inpu ...
- Codeforces Round #402 (Div. 2) A B C sort D二分 (水)
A. Pupils Redistribution time limit per test 1 second memory limit per test 256 megabytes input stan ...
- 【DFS】Codeforces Round #402 (Div. 2) B. Weird Rounding
暴搜 #include<cstdio> #include<algorithm> using namespace std; int n,K,Div=1,a[21],m,ans=1 ...
- Codeforces Round #402 (Div. 2) 题解
Problem A: 题目大意: 给定两个数列\(a,b\),一次操作可以交换分别\(a,b\)数列中的任意一对数.求最少的交换次数使得任意一个数都在两个序列中出现相同的次数. (\(1 \leq a ...
- Codeforces Round #402 (Div. 2) 阵亡记
好长时间没有打Codeforces了,今天被ysf拉过去打了一场. lrd也来参(nian)加(ya)比(zhong)赛(sheng) Problem A: 我去,这不SB题吗.. 用桶统计一下每个数 ...
- CodeForces Round #402 (Div.2) A-E
2017.2.26 CF D2 402 这次状态还算能忍吧……一路不紧不慢切了前ABC(不紧不慢已经是在作死了),卡在D,然后跑去看E和F——卧槽怎么还有F,早知道前面做快点了…… F看了看,不会,弃 ...
- Codeforces Round #402 (Div. 2) B
Description Polycarp is crazy about round numbers. He especially likes the numbers divisible by 10k. ...
随机推荐
- spring mvc 整合Quartz
Quartz是一个完全由java编写的开源作业调度框架.不要让作业调度这个术语吓着你.尽管Quartz框架整合了许多额外功能, 但就其简易形式看,你会发现它易用得简直让人受不了!Quartz整合在sp ...
- django 连接mysql
环境 Linux 修改工程目录下的settings.py 文件 #!!!!!!!!切勿出现中文 即便//注释也不行 DATABASES = { 'default': { 'ENGINE': 'djan ...
- 【iOS】swift-如何理解 if let 与guard?
著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:黄兢成 链接:http://www.zhihu.com/question/36448325/answer/68614858 ...
- css3动画transition详解2
transition主要包含四个属性值:执行变换的属性:transition-property,变换延续的时间:transition-duration,在延续时间段,变换的速率变化transition ...
- 使用 VSCode 编写 .NET Core 项目之初体验
注:本文在根据 微软官方文档指导下,根据自己的学习中整理,并不完全照搬文档,但也大体和文档学习路线相似,主要为记录学习过程. 官方学习地址: https://code.visualstudio.com ...
- python之路--day13---函数--三元表达式,递归,匿名函数,内置函数-----练习
1.文件内容如下,标题为:姓名,性别,年纪,薪资 egon male 18 3000 alex male 38 30000 wupeiqi female 28 20000 yuanhao female ...
- EasyUI中Tabs添加远程数据的方法。
tabs加载远程数据: $(function () { $("#btnquery").click(function () { if (!$("#tcontent" ...
- JAVA_SE基础——23.类的定义
黑马程序员入学blog ... java 面向对象的语言 对象:真实存在的唯一的实物. 比如:我家的狗, 类: 实际就是对某种类型事物的共性属性与行为的抽取. 抽象的概念... 比如说:车 ...
- Mybatis学习日志
在Mybatis深入学习的一周中,总感觉跟着师傅的视屏讲解什么都能懂,但实际自己操作的时候才发现自己一脸懵逼,不知道从何入手.但还好自己做了点笔记.在此记录一下自己浅度学习Mybatis遇到几个小问题 ...
- SecureCRT 7.3注册机激活
SecureCRT是一款很好用的远程登陆管理工具 工具和注册机下载链接:http://pan.baidu.com/s/1jImWiMU 密码:0yox 以管理管运行keygen.exe(一定要以管理员 ...