CF1257F Make Them Similar

$solution:$

折半搜索后考虑如何维护两个数组的和,可以将 $A$ 中每个数减 $A_1$ ,$B$ 中每个数被减 $B_1$ ,$map$ 维护一下即可。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
inline int read(){
int f=,ans=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return f*ans;
}
const int MAXN=;
int lowbit(int x){return x&-x;}
int cont(int x){int c=;while(x) c++,x-=lowbit(x);return c;}
int N,A[MAXN];
vector<int> sta;
map<vector<int> ,int> M;
int main(){
N=read();for(int i=;i<=N;i++) A[i]=read();
for(int i=;i<(<<)-;i++){
int cur=cont(i^((A[]>>)));sta.clear();
for(int j=;j<=N;j++) sta.push_back(cont(i^(A[j]>>))-cur);
M[sta]=i;
}
int all=((<<)-);
for(int i=;i<(<<)-;i++){
int cur=cont(i^((A[]&all)));sta.clear();
for(int j=;j<=N;j++) sta.push_back(cur-cont(i^(A[j]&all)));
if(M.count(sta)){
printf("%d\n",(M[sta]<<)+i);
return ;
}
}printf("-1\n");return ;
}

CF1257E The Contest

 $solution:$

设 $f_{i,j}$ 表示现在在 $i$ 个数,现在在第 $j$ 段。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
inline int read(){
int f=,ans=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return f*ans;
}
const int MAXN=;
int col[MAXN],f[MAXN][],k1,k2,k3,N;
int main(){
k1=read(),k2=read(),k3=read();N=k1+k2+k3;
for(int i=;i<=k1;i++) read();
for(int i=;i<=k2;i++) col[read()]=;
for(int i=;i<=k3;i++) col[read()]=;
memset(f,/,sizeof(f));
f[][]=;
for(int i=;i<=N;i++){
for(int j=;j<;j++){
for(int k=;k<=j;k++) f[i][j]=min(f[i][j],f[i-][k]+(col[i]!=j));
}
}
int Minn=min(f[N][],min(f[N][],f[N][]));
printf("%d\n",Minn);return ;
}

CF1268C And Reachability

$solution:$

设 $f_{i,j}$ 表示从 $i$ 点走到离 $i$ 最近并且 $j$ 位上是一的,可以简单递推得到。

时间复杂度 $O(20^2\cdot n)$ 。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
inline int read(){
int f=,ans=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return f*ans;
}
const int MAXN=;
int f[MAXN][],g[],n,q,A[MAXN];
int main(){
n=read(),q=read();
for(int i=;i<=n;i++) A[i]=read();
for(int i=;i<=n+;i++) for(int j=;j<=;j++) f[i][j]=g[j]=n+;
for(int i=n;i>=;i--){
for(int j=;j<=;j++){
if(A[i]&(<<j)){
for(int k=;k<=;k++) f[i][k]=min(f[i][k],f[g[j]][k]);
f[i][j]=i;g[j]=i;
}
}
}
while(q--){
int x=read(),y=read();bool ok=;
for(int i=;i<=;i++) if(A[y]&(<<i)) ok|=(f[x][i]<=y);
if(ok){printf("Shi\n");continue;}
printf("Fou\n");
}return ;
}/*
5 5
0 0 1 3 7
1 2
2 2
3 5
4 5
1 5
*/

CF1268B Good Triple

$solution:$

因为 $2k\leq 9$ ,所以直接 $r$ 单调性暴力处理就行。时间复杂度 $O(9n)$ 。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
inline int read(){
int f=,ans=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return f*ans;
}
const int MAXN=;
int L[MAXN],N,A[MAXN];
char str[MAXN];
signed main(){
scanf("%s",str+);N=strlen(str+);
for(int i=;i<=N;i++) A[i]=str[i]-'';
int ll=,Ans=;
for(int r=;r<=N;r++){
for(int i=;r-*i>=;i++){
if(A[r]==A[r-i]&&A[r-i]==A[r-*i]){ll=max(ll,r-*i);break;}
}
Ans+=ll;
}printf("%lld\n",Ans);
}

CSGRound2 逐梦者的初心

$solution:$

考虑将 $S$ 串翻转后1问题就变为了维护多项式系数。$bitset$ 优化即可。

时间复杂度 $O(\dfrac{m^2}{w})$

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<bitset>
using namespace std;
inline int read(){
int x=,f=; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-;
for(;isdigit(c);c=getchar()) x=x*+c-'';
return x*f;
}
const int N=;
const int MAXN=;
int n,m,A[N],Ans[MAXN];
bitset<MAXN> Bit,ve[],e;
int main(){
n=read(),m=read();
for(int i=;i<=m;i++) A[i]=read();for(int i=;i<=n-m;i++) read();
for(int i=;i<=m;i++) ve[A[i]][m-i+]=;
n=m;
for(int i=;i<=m;i++){
int opt=read(),x=read();
if(opt==) Bit|=(ve[x]<<i);
else{Bit=(Bit<<);Bit|=(ve[x]<<);}
e[m+i]=;printf("%d\n",(Bit.flip()&e).count());
Bit.flip();
}
return ;
}/*
2 2
1 2
1 1
1 3
*/

CSGRound2 开拓者的卓识

$solution:$

考虑每一位 $a_i$ 对答案的贡献,根据插板原理可以得到。

$$S_{k,1,r}=\sum_{i=1}^r A_i\cdot \dbinom{i+k-2}{k-1}\cdot \dbinom{r-i+k-1}{k-1}\\=A_i\cdot\dfrac{(i+k-2)!}{(k-1)!\cdot(i-1)!}\cdot\dfrac{(r-i+k-1)!}{(k-1)!\cdot(r-i)!}\\=A_i\cdot\dfrac{(i+k-2)!\cdot (r-i+k-1)!}{(i-1)!\cdot(r-i)!}\cdot\dfrac{1}{(k-1)!^2}$$

$NTT$ 优化一下即可,而阶乘的预处理可以分段打表。

时间复杂度 $O(n\log n+n\times blo)$

CF1225E Rock Is Push

$solution:$

设 $f_{i,j,0/1}$ 表示从 $(1,1)$ 走到 $(i,j)$,其中最后一步的走向是右还是下。

则 $f_{i,j,0}=\sum_{e=k}^{j-1} f_{i,e,1}$ ,可以记录前缀和得到一段区间的 $dp$ 和。

而 $k$ 的得到可以因为实现不同,故时间复杂度为 $O(nm\log n)$ 或 $O(nm)$ 。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
#define mod 1000000007
using namespace std;
inline int read(){
int f=,ans=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return f*ans;
}
const int MAXN=;
int n,m,f[MAXN][MAXN][];
/*left 0 down 1*/
char str[MAXN];
int A[MAXN][MAXN],S1[MAXN][MAXN],S2[MAXN][MAXN];
int Qi(int id,int l,int r){/*col*/
return S1[r][id]-S1[l-][id];
}
int Qj(int id,int l,int r){/*row*/
return S2[id][r]-S2[id][l-];
}
int fS1[MAXN][MAXN],fS2[MAXN][MAXN];
int Mod(int x){return ((x%mod)+mod)%mod;}
signed main(){
// freopen("maker.in","r",stdin);
n=read(),m=read();
for(int i=;i<=n;i++){
scanf("%s",str+);
for(int j=;j<=m;j++) A[i][j]=(str[j]=='R');
}
if(n==&&m==){printf("%lld\n",A[][]^);return ;}
for(int i=;i<=n;i++) for(int j=;j<=m;j++) S1[i][j]=S1[i-][j]+A[i][j];
for(int i=;i<=n;i++) for(int j=;j<=m;j++) S2[i][j]=S2[i][j-]+A[i][j];
f[][][]=f[][][]=;fS1[][]=,fS2[][]=;
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(i==&&j==) continue;
int l=,r=i-,res=i;
while(l<=r){
int mid=l+r>>;
if(Qi(j,mid+,n)<=(n-i)) res=mid,r=mid-;
else l=mid+;
}
f[i][j][]=fS1[i-][j]-fS1[res-][j];f[i][j][]=Mod(f[i][j][]);
l=,r=j-,res=j;
while(l<=r){
int mid=l+r>>;
if(Qj(i,mid+,m)<=(m-j)) res=mid,r=mid-;
else l=mid+;
}
f[i][j][]=fS2[i][j-]-fS2[i][res-];f[i][j][]=Mod(f[i][j][]);
fS1[i][j]=fS1[i-][j]+f[i][j][];fS1[i][j]=Mod(fS1[i][j]);
fS2[i][j]=fS2[i][j-]+f[i][j][];fS2[i][j]=Mod(fS2[i][j]);
}
}printf("%lld\n",(f[n][m][]+f[n][m][])%mod);return ;
}/*3 3
.RR
...
R..
*/

CF1239D Catowice City

$solution:$

考虑类似于 $2-SAT$ 将必须选择的关系连边,$tarjan$ 后让最开始遍历的强连通分量为 $1$ ,因为 $dfs$ 的顺序易知这是正确的。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
inline int read(){
int f=,ans=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return f*ans;
}
const int MAXN=;
int n,m,T,col[MAXN],sta[MAXN],num,dfn[MAXN],low[MAXN],Ans0[MAXN],Ans1[MAXN];
vector<int> vec[MAXN];
void Init(){
num=;Ans0[]=,Ans1[]=;
for(int i=;i<=n;i++) vec[i].clear();
for(int i=;i<=n;i++) col[i]=dfn[i]=low[i]=;
}
void tarjan(int u){
dfn[u]=low[u]=++num;sta[++sta[]]=u;
int siz=vec[u].size();
for(int i=;i<siz;i++){
int v=vec[u][i];
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}else if(!col[v]) low[u]=min(low[u],low[v]);
}
if(dfn[u]==low[u]){
col[u]=++col[];
while(sta[sta[]]!=u){
col[sta[sta[]]]=col[];
sta[]--;
}sta[]--;
}return;
}
int main(){
// freopen("8.in","r",stdin);
T=read();
while(T--){
n=read(),m=read();
Init();
for(int i=;i<=m;i++){int u=read(),v=read();vec[u].push_back(v);}
for(int i=;i<=n;i++) if(!dfn[i]) tarjan(i);
if(col[]==){printf("No\n");continue;}
for(int i=;i<=n;i++){
if(col[i]==) Ans0[++Ans0[]]=i;
else Ans1[++Ans1[]]=i;
}
printf("Yes\n%d %d\n",Ans0[],Ans1[]);
for(int i=;i<=Ans0[];i++) printf("%d ",Ans0[i]);printf("\n");
for(int i=;i<=Ans1[];i++) printf("%d ",Ans1[i]);printf("\n");
}return ;
}

CF1244F Chips

$solution:$

考虑若对于 $i$ 来说在 $i-1,i+1$ 有颜色相同的话,那么无论经过多少次操作都可以为本身颜色。

否则,与其相邻的是 $01$ 段,模拟一下即可。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
inline int read(){
int f=,ans=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return f*ans;
}
const int MAXN=;
char str[MAXN];
int n,k,A[MAXN],B[MAXN],C[MAXN];
void print(int opt){opt?printf("W"):printf("B");}
int main(){
n=read(),k=read();
scanf("%s",str+);
for(int i=;i<=n;i++) A[i]=(str[i]=='W');
A[]=A[n],A[n+]=A[];
for(int i=;i<=n;i++) B[i]=(A[i-]==A[i]||A[i]==A[i+]),B[i+n]=B[i];
bool F=;for(int i=;i<=n;i++) F|=B[i];
if(!F){for(int i=;i<=n;i++) print(A[i]^(k&));printf("\n");return ;}
int ps=;for(int i=;i<=n;i++) if(B[i]) ps=i;
for(int i=n+;i<=*n;i++){if(B[i]) ps=i;C[i-n]=i-ps;}
for(int i=*n;i>n;i--) if(B[i]) ps=i;
for(int i=n;i>=;i--){if(B[i]) ps=i;C[i]=min(C[i],ps-i);}
for(int i=;i<=n;i++){
if(B[i]) print(A[i]);
else print(A[i]^(min(k,C[i])&));
}printf("\n");return ;
}

CF1245F Daniel and Spring Cleaning

$solution:$

按维容斥后做简单数位 $dp$ 即可。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define int long long
using namespace std;
inline int read(){
int f=,ans=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return f*ans;
}
const int MAXN=;
int T,a,b,A[MAXN],B[MAXN],len,f[MAXN][][];
int dfs(int ps,int lim1,int lim2){
if(ps==-) return ;
if(f[ps][lim1][lim2]!=-) return f[ps][lim1][lim2];
int e1=(lim1==)?A[ps]:,e2=(lim2==)?B[ps]:,res=;
for(int i=;i<=e1;i++)
for(int j=;j<=e2;j++){
if(i==&&j==) continue;
res+=dfs(ps-,lim1&&(i==A[ps]),lim2&&(j==B[ps]));
}
return f[ps][lim1][lim2]=res;
}
int calc(int x,int y){
if(x<||y<) return ;
memset(f,-,sizeof(f));
len=;
for(int i=;i>=;i--) A[i]=(x&(<<i))?:;
for(int i=;i>=;i--) B[i]=(y&(<<i))?:;
return dfs(,,);
}
signed main(){
// freopen("4.in","r",stdin);
T=read();
while(T--){
int l=read(),r=read();
printf("%lld\n",calc(r,r)+calc(l-,l-)-*calc(l-,r));
}
return ;
}

CF1245E Hyakugoku and Ladders

 $solution:$

设 $f_{i,j}$ 表示从 $(i,j)$ 走到 $(1,1)$ 的期望步数,按题意模拟的转移即可。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
inline int read(){
int f=,ans=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return f*ans;
}
const int N=;
int M[N][N],fro[N*N];
double f[N*N];
int main(){
for(int i=;i<=;i++)
for(int j=;j<=;j++){
if(i&) M[i][j]=(i-)*+j;
else M[i][j]=(i-)*+-j;
}
double sum=;
f[]=;for(int i=;i<=;i++){
f[i]=(sum+)/(i-);
sum+=f[i];
}
for(int i=;i<=;i++){
for(int j=;j<=;j++){int x=read();fro[M[i][j]]=M[i-x][j];}
}
for(int i=;i<=;i++){
double s=;
for(int j=;j<=;j++) s+=min(f[i-j],f[fro[i-j]]);
f[i]=s/6.0+;
}
printf("%.10lf\n",f[]);return ;
}

CF1249F Maximum Weight Subset

$solution:$

设 $f_{i,j}$ 表示以 $i$ 号节点为根的子树下距离 $i$ 最近的点至少为 $j$ 的方案数,枚举哪个要选即可。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
inline int read(){
int f=,ans=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return f*ans;
}
const int N=;
int n,k,f[N][N],head[N],cnt,val[N],son[N];
struct node{
int u,v,nex;
}x[N<<];
void add(int u,int v){
x[cnt].u=u,x[cnt].v=v,x[cnt].nex=head[u],head[u]=cnt++;
}
void dfs(int u,int fath){
for(int i=head[u];i!=-;i=x[i].nex){
if(x[i].v==fath) continue;
dfs(x[i].v,u);
}
son[]=;
for(int i=head[u];i!=-;i=x[i].nex){
if(x[i].v==fath) continue;
son[++son[]]=x[i].v;
}
for(int i=;i<=k;i++){
if(i==){
f[u][]=val[u];
for(int j=;j<=son[];j++) f[u][]+=f[son[j]][k];
continue;
}
for(int j=;j<=son[];j++){
int res=f[son[j]][i-];
for(int p=;p<=son[];p++){
if(j==p) continue;
res+=f[son[p]][max(k-i,i-)];
}
f[u][i]=max(f[u][i],res);
}
}for(int i=k;i>=;i--) f[u][i]=max(f[u][i],f[u][i+]);
}
int main(){
memset(head,-,sizeof(head));
n=read(),k=read();
for(int i=;i<=n;i++) val[i]=read();
for(int i=;i<n;i++){
int u=read(),v=read();
add(u,v),add(v,u);
}dfs(,);
printf("%d\n",f[][]);return ;
}

some problem的更多相关文章

  1. 1199 Problem B: 大小关系

    求有限集传递闭包的 Floyd Warshall 算法(矩阵实现) 其实就三重循环.zzuoj 1199 题 链接 http://acm.zzu.edu.cn:8000/problem.php?id= ...

  2. No-args constructor for class X does not exist. Register an InstanceCreator with Gson for this type to fix this problem.

    Gson解析JSON字符串时出现了下面的错误: No-args constructor for class X does not exist. Register an InstanceCreator ...

  3. C - NP-Hard Problem(二分图判定-染色法)

    C - NP-Hard Problem Crawling in process... Crawling failed Time Limit:2000MS     Memory Limit:262144 ...

  4. Time Consume Problem

    I joined the NodeJS online Course three weeks ago, but now I'm late about 2 weeks. I pay the codesch ...

  5. Programming Contest Problem Types

        Programming Contest Problem Types Hal Burch conducted an analysis over spring break of 1999 and ...

  6. hdu1032 Train Problem II (卡特兰数)

    题意: 给你一个数n,表示有n辆火车,编号从1到n,入站,问你有多少种出站的可能.    (题于文末) 知识点: ps:百度百科的卡特兰数讲的不错,注意看其参考的博客. 卡特兰数(Catalan):前 ...

  7. BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 4032  Solved: 1817[Submit] ...

  8. [LeetCode] Water and Jug Problem 水罐问题

    You are given two jugs with capacities x and y litres. There is an infinite amount of water supply a ...

  9. [LeetCode] The Skyline Problem 天际线问题

    A city's skyline is the outer contour of the silhouette formed by all the buildings in that city whe ...

  10. PHP curl报错“Problem (2) in the Chunked-Encoded data”解决方案

    $s = curl_init(); curl_setopt($s, CURLOPT_POST, true); curl_setopt($s, CURLOPT_POSTFIELDS, $queryStr ...

随机推荐

  1. OverFeat:基于卷积网络的集成识别、定位与检测

    摘要:我们提出了一个使用卷积网络进行分类.定位和检测的集成框架.我们展示了如何在ConvNet中有效地实现多尺度和滑动窗口方法.我们还介绍了一种新的深度学习方法,通过学习预测对象边界来定位.然后通过边 ...

  2. Spring Cloud Config教程(五)客户端使用

    要在应用程序中使用这些功能,只需将其构建为依赖于spring-cloud-config-client的Spring引导应用程序(例如,查看配置客户端或示例应用程序的测试用例).添加依赖关系的最方便的方 ...

  3. 使用 java替换web项目的web.xml

    创建一个接口: package my.web; public interface SpringWeb { void config(); } 实现类: package my; import my.web ...

  4. 20175308 实验三《敏捷开发与XP实践》

    20175308 实验三<敏捷开发与XP实践> 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 完成实验.撰写实验 ...

  5. Gridview中显示的值根据数据库中带出的值作更改

    前台页面对Gridview增加事件 OnRowDataBound="GridView1_RowDataBound"protected void GridView1_RowDataB ...

  6. C#调用windows API实现 smallpdf客户端程序进行批量压缩

    一.背景 Smallpdf 网站针对PDF文件提供了非常齐全的功能:PDF 与 Word.PPT.Excel.JPG 的相互转化.PDF 的压缩.编辑.合并.分割.解密.加密等功能,用户无需注册即可免 ...

  7. Docker容器技术入门

    独立容器分开的条件: 1.Namespace命名空间 1.主机名和域名,UTS 2.文件系统,mount 3.进程间通信,IPC 4.独立的进程树PID 5.独立的用户User 6.独立的IP地址tc ...

  8. node服务通过Jenkins上线流程

    构建流程 构建服务器: 拉取指定分支代码 构建服务器: 安装依赖 构建服务器: 执行构建 构建服务器: 如果上线流程,则在 git 上创建 tag,供回滚使用 构建服务器:打包 node 服务代码,和 ...

  9. ObjectDataSource.ObjectCreating 事件

    ObjectCreating 事件在创建由 TypeName 属性标识的对象之前发生. 命名空间:System.Web.UI.WebControls程序集:System.Web(在 system.we ...

  10. Fresnel integral菲涅尔积分的一丢丢探讨

    起因源于导师的关于回旋曲线的一点问题 其中最后得到的曲率公式中的c,s’和s定义不明确 于是开始从头从(2.1)式中的积分入手探究 维基百科中Fresnel integral的S(x)与C(x)的定义 ...