CF1153A

直接做啊,分类讨论即可

#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<vector>
#include<queue>
#include<map>
#include<set>
using namespace std;
#define lowbit(x) (x)&(-x)
#define rep(i,a,b) for (int i=a;i<=b;i++)
#define per(i,a,b) for (int i=a;i>=b;i--)
#define maxd 1000000007
typedef long long ll;
const int N=100000;
const double pi=acos(-1.0); int read()
{
int x=0,f=1;char ch=getchar();
while ((ch<'0') || (ch>'9')) {if (ch=='-') f=-1;ch=getchar();}
while ((ch>='0') && (ch<='9')) {x=x*10+(ch-'0');ch=getchar();}
return x*f;
} int main()
{
int n=read(),st=read(),ans=0,tim=maxd;
rep(i,1,n)
{
int s=read(),d=read();
if (s==st) {printf("%d",i);return 0;}
else if (s>st)
{
if (s<tim) {ans=i;tim=s;}
}
else
{
int tmp=(st-s-1)/d+1;
int now=(tmp*d+s);
if (now<tim) {ans=i;tim=now;}
}
}
printf("%d",ans);
return 0;
}

CF1153B

对于\(h_{i,j}\),我们有两个最小值的限制,那么我们强制\(h_{i,j}\)为这两个限制最小值即可

由于题目保证有解,故总存在对应的答案

#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<vector>
#include<queue>
#include<map>
#include<set>
using namespace std;
#define lowbit(x) (x)&(-x)
#define rep(i,a,b) for (int i=a;i<=b;i++)
#define per(i,a,b) for (int i=a;i>=b;i--)
#define maxd 1000000007
typedef long long ll;
const int N=100000;
const double pi=acos(-1.0);
int n,m,h,blo[1010][1010],ans[1010][1010],x[1010],y[1010]; int read()
{
int x=0,f=1;char ch=getchar();
while ((ch<'0') || (ch>'9')) {if (ch=='-') f=-1;ch=getchar();}
while ((ch>='0') && (ch<='9')) {x=x*10+(ch-'0');ch=getchar();}
return x*f;
} int main()
{
n=read();m=read();h=read();
rep(i,1,m) x[i]=read();
rep(i,1,n) y[i]=read();
rep(i,1,n)
{
rep(j,1,m)
{
blo[i][j]=read();
}
}
rep(i,1,n)
{
rep(j,1,m)
{
if (blo[i][j])
{
ans[i][j]=min(x[j],y[i]);
}
}
}
rep(i,1,n)
{
rep(j,1,m)
{
printf("%d ",ans[i][j]);
}
printf("\n");
}
return 0;
}

CF1153C

考虑如何构造一个合法的括号序列

我们将\((\)看做\(1\),将\()\)看做\(-1\),那么原括号序列合法的条件就是\(\forall i\in [1..n],sum(1...i)>0\)

考虑这样的贪心:为了使前缀和尽可能的大,我们尽可能的将\((\)首先填完,之后剩下的位置再填\()​\)

在首先判掉\((\)的个数超过一半了之后暴力扫描即可

#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<vector>
#include<queue>
#include<map>
#include<set>
using namespace std;
#define lowbit(x) (x)&(-x)
#define rep(i,a,b) for (int i=a;i<=b;i++)
#define per(i,a,b) for (int i=a;i>=b;i--)
#define maxd 1000000007
typedef long long ll;
const int N=100000;
const double pi=acos(-1.0);
int n;
char s[300500]; int read()
{
int x=0,f=1;char ch=getchar();
while ((ch<'0') || (ch>'9')) {if (ch=='-') f=-1;ch=getchar();}
while ((ch>='0') && (ch<='9')) {x=x*10+(ch-'0');ch=getchar();}
return x*f;
} int main()
{
n=read();
scanf("%s",s+1);
if (n&1) {cout <<":(";return 0;}
int cnt=n/2;
rep(i,1,n) if (s[i]=='(') cnt--;
if (cnt<0) {cout << ":(";return 0;}
rep(i,1,n)
{
if (s[i]=='?')
{
if (cnt) {s[i]='(';cnt--;}
else {s[i]=')';}
}
}
//rep(i,1,n) putchar(s[i]);
int tmp=0;
rep(i,1,n-1)
{
if (s[i]=='(') tmp++;else tmp--;
if (tmp<=0) {cout << ":(";return 0;}
}
rep(i,1,n) putchar(s[i]);
return 0;
}

CF1153D

\(mdzz\),在这题上卡住了

注意到使得“根节点的值最大”的条件对任意子树都是成立的

记\(dp[u]\)为在\(u\)点上的值是所有叶子上的值的第\(k\)大,那么最后的答案就是\(cnt-dp[1]+1\)

那么对于\(min\)操作和\(max​\)操作进行分类讨论

自己手玩一下便可以知道,\(min\)操作等价于\(dp[u]=\sum dp[v]\),而\(max\)等价于\(dp[u]=min(dp[v])\)(\(v\)是\(u\)的儿子)

直接\(dfs\)即可

#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<vector>
#include<queue>
#include<map>
#include<set>
using namespace std;
#define lowbit(x) (x)&(-x)
#define rep(i,a,b) for (int i=a;i<=b;i++)
#define per(i,a,b) for (int i=a;i>=b;i--)
#define maxd 1000000007
typedef long long ll;
const int N=100000;
const double pi=acos(-1.0); int read()
{
int x=0,f=1;char ch=getchar();
while ((ch<'0') || (ch>'9')) {if (ch=='-') f=-1;ch=getchar();}
while ((ch>='0') && (ch<='9')) {x=x*10+(ch-'0');ch=getchar();}
return x*f;
}
int n,all=0,ans,head[600600],w[600600],dp[600600],cnt=0; struct node {
int nxt,to;
}sq[600500]; void add(int u,int v)
{
all++;sq[all].nxt=head[u];sq[all].to=v;head[u]=all;
} void dfs(int u,int fu)
{
if(!head[u])
{
cnt++;dp[u]=1;
return;
}
if(w[u]==1) dp[u]=maxd;
int i;
for(i=head[u];i;i=sq[i].nxt)
{
int v=sq[i].to;
dfs(v,u);
if(w[u]==1) dp[u]=min(dp[u],dp[v]);
else dp[u]+=dp[v];
}
} int main()
{
n=read();
rep(i,1,n) w[i]=read();
rep(i,2,n)
{
int fu=read();add(fu,i);
}
dfs(1,0);
printf("%d\n",cnt+1-dp[1]);
return 0;
}

CF1153E

CF的交互(尤其是\(div\ 2\))基本上就是用来理性愉悦的

假设你从这条蛇的头部走到尾部,每次询问一个方格,你会发现只有在头部和尾部你会询问到奇数的答案,其他位置都是偶数,这十分好理解:对于除去头部和尾部的其他格子而言,为了保证蛇的连通性,必然是一次“进入”询问区间对应着恰好一次“走出”询问区间,即对询问答案个贡献一定是成对出现的

但是对于头部和尾部却不是这样,由于他会有一次“进入”或“走出”操作时突然出现的,所以它对答案的贡献一定是奇数

为了减少询问同时方便定位(就是从询问次数的大小发现的规律),我们可以暴力询问每一行和每一列共\(2n\)次询问,记录下来得到奇数答案的对应的行和列,然后分类讨论

1)假设得到了4个值,我们随意询问一个合法的格子,如果答案是奇数那么它就是一个头,否则将它对应的行和列拆开得到新的两个格子即为答案

2)假设得到了2个值,说明两个格子同行或同列,我们对于剩下的\(19\)次询问考虑二分,如每次询问\(1-mid\)的所有行(或列),如果答案是奇数的话那么答案就在此区间,否则就在另一个区间

很明显答案只有以上两种情况

#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<vector>
#include<queue>
#include<map>
#include<set>
using namespace std;
#define lowbit(x) (x)&(-x)
#define rep(i,a,b) for (int i=a;i<=b;i++)
#define per(i,a,b) for (int i=a;i>=b;i--)
#define maxd 1000000007
typedef long long ll;
const int N=100000;
const double pi=acos(-1.0);
int n; int read()
{
int x=0,f=1;char ch=getchar();
while ((ch<'0') || (ch>'9')) {if (ch=='-') f=-1;ch=getchar();}
while ((ch>='0') && (ch<='9')) {x=x*10+(ch-'0');ch=getchar();}
return x*f;
} int main()
{
n=read();
int x1=0,y1=0,x2=0,y2=0,got=0;
rep(i,1,n)
{
printf("? %d %d %d %d\n",i,1,i,n);fflush(stdout);
int cnt=read();
if (cnt&1)
{
if (x1) x2=i;else x1=i;
got++;
}
}
rep(i,1,n)
{
printf("? %d %d %d %d\n",1,i,n,i);fflush(stdout);
int cnt=read();
if (cnt&1)
{
if (y1) y2=i;else y1=i;
got++;
}
}
if (got==4)
{
printf("? %d %d %d %d\n",x1,y1,x1,y1);fflush(stdout);
int cnt=read();
if ((cnt&1)==0) swap(x1,x2);
printf("! %d %d %d %d\n",x1,y1,x2,y2);fflush(stdout);
}
else
{
if (x1)
{
int l=1,r=n,ansy;
while (l<=r)
{
int mid=(l+r)>>1;
printf("? %d %d %d %d\n",x1,l,x1,mid);fflush(stdout);
int cnt=read();
if (cnt&1) {ansy=mid;r=mid-1;}
else {l=mid+1;}
}
printf("! %d %d %d %d\n",x1,ansy,x2,ansy);fflush(stdout);
}
else
{
int l=1,r=n,ansx;
while (l<=r)
{
int mid=(l+r)>>1;
printf("? %d %d %d %d\n",l,y1,mid,y1);fflush(stdout);
int cnt=read();
if (cnt&1) {ansx=mid;r=mid-1;}
else l=mid+1;
}
printf("! %d %d %d %d\n",ansx,y1,ansx,y2);fflush(stdout);
}
}
return 0;
}

CF1153F

答案可以看做\(每一段的期望长度*每一次的期望段数\)

前者的答案是\(\frac{l}{2n+1}\),关键是如何计算后者

记\(dp[i][j]\)为当前有\(i\)个节点,其中有\(j\)个节点没有右端点与其匹配的方案数

在枚举是按照当前的点是否配对即可,即对于\(dp[i][j]\),有

\[dp[i+1][j+1]+=dp[i][j]\\
dp[i+1][j-1]+=dp[i][j]*j
\]

统计答案时,枚举左半边有\(i\)个点且有\(j\)(\(j\leq k\))个点未匹配,则\(ans=\sum dp[i][j]*dp[n*2-i][j]*j!\)

最后两者相乘即可

#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<vector>
#include<queue>
#include<map>
#include<set>
using namespace std;
#define lowbit(x) (x)&(-x)
#define rep(i,a,b) for (int i=a;i<=b;i++)
#define per(i,a,b) for (int i=a;i>=b;i--)
#define maxd 998244353
typedef long long ll;
const int N=100000;
const double pi=acos(-1.0);
int n,k,l;
ll dp[4020][4020],fac[4040]; int read()
{
int x=0,f=1;char ch=getchar();
while ((ch<'0') || (ch>'9')) {if (ch=='-') f=-1;ch=getchar();}
while ((ch>='0') && (ch<='9')) {x=x*10+(ch-'0');ch=getchar();}
return x*f;
} ll qpow(ll x,int y)
{
ll ans=1;
while (y)
{
if (y&1) ans=(ans*x)%maxd;
x=(x*x)%maxd;
y>>=1;
}
return ans;
} ll inv(ll x) {return qpow(x,maxd-2);} int main()
{
n=read();k=read();l=read();
dp[0][0]=1;
rep(i,0,n*2)
{
rep(j,0,min(i,n))
{
dp[i+1][j+1]=(dp[i+1][j+1]+dp[i][j])%maxd;
dp[i+1][j-1]=(dp[i+1][j-1]+dp[i][j]*j)%maxd;
}
}
fac[0]=1;
rep(i,1,4000) fac[i]=(fac[i-1]*i)%maxd;
ll ans=0;
rep(i,1,n*2)
{
rep(j,k,min(i,n))
{
ans=(ans+((dp[i][j]*dp[n*2-i][j])%maxd*fac[j])%maxd)%maxd;
}
}
ll len=l*inv(n*2+1)%maxd;
ans=ans*inv(dp[n*2][0])%maxd;
ans=ans*len%maxd;
printf("%lld",ans);
return 0;
}

code

Codeforces Round #551 (Div. 2) 题解的更多相关文章

  1. Codeforces Round #182 (Div. 1)题解【ABCD】

    Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...

  2. 【Codeforces】Codeforces Round #551 (Div. 2)

    Codeforces Round #551 (Div. 2) 算是放弃颓废决定好好打比赛好好刷题的开始吧 A. Serval and Bus 处理每个巴士最早到站且大于t的时间 #include &l ...

  3. Codeforces Round #608 (Div. 2) 题解

    目录 Codeforces Round #608 (Div. 2) 题解 前言 A. Suits 题意 做法 程序 B. Blocks 题意 做法 程序 C. Shawarma Tent 题意 做法 ...

  4. Codeforces Round #525 (Div. 2)题解

    Codeforces Round #525 (Div. 2)题解 题解 CF1088A [Ehab and another construction problem] 依据题意枚举即可 # inclu ...

  5. Codeforces Round #528 (Div. 2)题解

    Codeforces Round #528 (Div. 2)题解 A. Right-Left Cipher 很明显这道题按题意逆序解码即可 Code: # include <bits/stdc+ ...

  6. Codeforces Round #466 (Div. 2) 题解940A 940B 940C 940D 940E 940F

    Codeforces Round #466 (Div. 2) 题解 A.Points on the line 题目大意: 给你一个数列,定义数列的权值为最大值减去最小值,问最少删除几个数,使得数列的权 ...

  7. Codeforces Round #677 (Div. 3) 题解

    Codeforces Round #677 (Div. 3) 题解 A. Boring Apartments 题目 题解 简单签到题,直接数,小于这个数的\(+10\). 代码 #include &l ...

  8. Codeforces Round #665 (Div. 2) 题解

    Codeforces Round #665 (Div. 2) 题解 写得有点晚了,估计都官方题解看完切掉了,没人看我的了qaq. 目录 Codeforces Round #665 (Div. 2) 题 ...

  9. Codeforces Round #160 (Div. 1) 题解【ABCD】

    Codeforces Round #160 (Div. 1) A - Maxim and Discounts 题意 给你n个折扣,m个物品,每个折扣都可以使用无限次,每次你使用第i个折扣的时候,你必须 ...

随机推荐

  1. arcgis api 3.x for js 入门开发系列七图层控制(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  2. Android: 在native中访问assets全解析

    本文总结在Android Native C++开发中访问APK中的assets资源的方法 在CMake中添加相关NDK LIB的 依赖 因为我们接下来用到的一些函数实现在NDK库libandroid. ...

  3. Android 通过反射获取DatePicker 中的控件,并改变其颜色

    到最后也只是成功改变了中间部分的颜色. private void setDatePickerDividerColor(DatePicker datePicker) { // Divider chang ...

  4. iOS pthread

    pthread 是属于 POSIX 多线程开发框架 创建线程的方法:pthread_create   参数含义: 1.指向线程代号的指针 2.线程的属性 3.指向函数的指针 4.传递给该函数的参数 返 ...

  5. Python Learning: 01

    After a short period of  new year days, I found life a little boring. So just do something funny--Py ...

  6. 阿里Canal安装和代码示例

    Canal的简单使用 canal可以用来监控数据库数据的变化,从而获得新增数据,或者修改的数据,用于实际工作中,比较实用,特此记录一下 Canal简介 canal是应阿里巴巴存在杭州和美国的双机房部署 ...

  7. nginx日志切割(logrotate或shell脚本)

    nginx自己不会对日志文件进行切割,可以通过两种不同的方式进行,分别是:通过logrotate和通过shell脚本. 如果是yum方式安装的nginx,系统默认会自动通过logrotate这个日志管 ...

  8. web框架开发-Ajax

    Ajax简介 向服务器发送请求的4种方式 1.浏览器地址栏,默认get请求2.form表单: get请求 post请求3.a标签,默认get请求 4.Ajax 特点: 1 异步请求 2 局部刷新 方式 ...

  9. Mango 基础知识

    1 mongdb和python交互的模块 pymongo 提供了mongdb和python交互的所有方法 安装方式: pip install pymongo 2 使用pymongo 1. 导入pymo ...

  10. JS操作数组-2

    1. 找出数组 arr 中重复出现过的元素 function duplicates(arr) { var result = []; var count = []; for (var i=0;i< ...