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. postman导入接口

    给大家说一个poatman导入接口的好办法,平常要是想在postman上模拟接口,如果复杂的很难配,其实有一个很简单的方法: 现在我模拟一下百度搜索时历史记录的接口: 点击Copy as cUrl 然 ...

  2. linux-PXE-12

    以DHCP+DNS模式管理服务器IP地址和主机名.服务器上架前,以其MAC地址为依据,在DHCP中配置主机保留并分配主机名.DHCP结合TFTP提供的PXE服务,提供PXE引导Linux内核和启动镜像 ...

  3. Scrapy终端(Scrapy shell)

    1.介绍文档:http://scrapy-chs.readthedocs.io/zh_CN/latest/topics/shell.html# 2.终端的启用方式:scrapy shell url u ...

  4. [IOI2008/BZOJ1791 岛屿](处理基环树的小技巧&基于bfs树形DP)

    IOI2008/BZOJ1791 岛屿 题目大意是在一个基环树森林里求每一棵基环树的直径①的和. 其实就是树的直径的基环树升级版.我们先把环找出来,然后从环上的每一个节点x出发,并且不经过环上其他节点 ...

  5. bootstrap基础讲解

    Bootstrap基础简介 网站链接:  http://www.bootcss.com/ bootstrap优点: 下载: bootstrap的引入: <meta name="view ...

  6. legend3---OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054

    legend3---OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054 一.总结 一句话总结: 解决方法:多试几次,实在不行就手动下载 1.homeste ...

  7. nginx location的优先级

    原来一直以为location的优先级是先后顺序,结果有次项目中傻眼了,赶紧百度一下,下面的内容参考了这个链接 location表达式类型 ~ 表示执行一个正则匹配,区分大小写~* 表示执行一个正则匹配 ...

  8. Quartz安装包中的15个example

    Welcome======= Welcome to the Quartz Examples directory. This directory contains 15 examples that sh ...

  9. day65—angularJS的学习笔记1

    转行学开发,代码100天—2018-05-20 AngularJS的引用示例: <!DOCTYPE html> <html> <head> <title> ...

  10. C# App.config全攻略

    读语句:          String str = ConfigurationManager.AppSettings["DemoKey"]; 写语句: Configuration ...