A. There Are Two Types Of Burgers

题意:

给一些面包,鸡肉,牛肉,你可以做成鸡肉汉堡或者牛肉汉堡并卖掉

一个鸡肉汉堡需要两个面包和一个鸡肉,牛肉汉堡需要两个面包和一个牛肉

求能得到的最多的钱

直接贪心,哪个比较贵就选哪个做,剩下的材料再做另一个

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=2e5+;
int T,n,a,b,va,vb;
int main()
{
T=read();
while(T--)
{
n=read(),a=read(),b=read();
va=read(),vb=read();
if(va>vb) { int t=min(a,n/); printf("%d\n",va*t+vb*min(b,(n-t*)/)); }
else { int t=min(b,n/); printf("%d\n",vb*t+va*min(a,(n-t*)/)); }
}
return ;
}

B. Square Filling

题意:

给一个矩阵,求把一个空矩阵进行一些操作后能否得到给定矩阵

操作为选择一个 $2*2$ 的子矩阵并把里面的数全部变成 $1$,不要求最少次数,如果能则输出具体操作

显然枚举所有左上角看看能不能操作,能的话就尽量操作

最后判断一下是否得到给定矩阵就行了

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=;
int n,m,a[N][N],b[N][N];
vector <int> X,Y;
int main()
{
n=read(),m=read();
for(int i=;i<=n;i++)
for(int j=;j<=m;j++) a[i][j]=read();
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
if(a[i][j]&&a[i+][j]&&a[i][j+]&&a[i+][j+])
{
X.push_back(i); Y.push_back(j);
b[i][j]=b[i+][j]=b[i][j+]=b[i+][j+]=;
}
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++) if(a[i][j]&&!b[i][j]) { printf("-1\n"); return ; }
int ans=X.size(); printf("%d\n",ans);
for(int i=;i<ans;i++) printf("%d %d\n",X[i],Y[i]);
return ;
}

C. Gas Pipeline

题意:

铺水管,需要支柱和管道,各有价格,从 $0$ 铺到 $n$ 求最小花费

管道高度可以为 $1$ 或 $2$,高度为 $1$ 时只要一个支柱,为 $2$ 时要两个,管道高度变化的时候要格外一个管道

某些位置强制管道高度为 $2$

显然考虑 $dp$,设 $f[i][0/1]$ 当前铺到位置 $i$ ,高度为 $1,2$ 时的最小花费,转移显然,具体看代码,注意$long\ long$

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=2e5+;
const ll INF=1e18;
int T,n,va,vb;
char s[N];
ll f[N][];
int main()
{
T=read();
while(T--)
{
n=read(),va=read(),vb=read();
scanf("%s",s+);
f[][]=vb; f[][]=INF;//初始高度必须为1
for(int i=;i<=n;i++)
{
f[i][]=min(f[i-][]+va+vb,f[i-][]+va*+vb);
f[i][]=min(f[i-][]+va*+vb*,f[i-][]+va+vb*);
if(s[i]==''||s[i+]=='') f[i][]=INF;
}
printf("%lld\n",f[n][]);
}
return ;
}

D. Number Of Permutations

题意:

给一个数列 $a$ ,求合法排列方案数,不合法指 $a$ 的某一排列中某一维单调不减

见计数想容斥

先考虑一个很 $naive$ 的东西,给一个数列求单调不减的排列数,值同样的数也看成不同的

显然每个值互相之间不能交换,只能同一个值之间乱换,同一个值的贡献就是 这个值的所有数全排列,整个数列的答案就是每个值贡献乘法原理乘起来

回到原问题,数列变成两维了,感觉合法不好求,考虑求出不合法的方案

显然答案就是:全排列方案数 减 强制一个不合法方案数 加 两个都不合法方案数,然后就变成求单调不减的排列数了

两个都不合法的方案数也很好求,具体看代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=6e5+,mo=;
int n;
ll fac[N],ans;
struct dat{
int a,b;
}d[N];
inline bool cmp1(const dat &A,const dat &B) { return A.a!=B.a ? A.a<B.a : A.b<B.b; }
inline bool cmp2(const dat &A,const dat &B) { return A.b!=B.b ? A.b<B.b : A.a<B.a; }
int main()
{
n=read();
fac[]=; for(int i=;i<=n;i++) d[i].a=read(),d[i].b=read(),fac[i]=fac[i-]*i%mo;
ans=fac[n];//全排列
sort(d+,d+n+,cmp1); ll t=; int cnt=;
for(int i=;i<=n;i++)
{
if(i==||d[i].a==d[i-].a) cnt++;
else t=t*fac[cnt]%mo,cnt=;
}
t=t*fac[cnt]%mo;
ans-=t;//第一维不合法
sort(d+,d+n+,cmp2); t=; cnt=;
for(int i=;i<=n;i++)
{
if(i==||d[i].b==d[i-].b) cnt++;
else t=t*fac[cnt]%mo,cnt=;
}
t=t*fac[cnt]%mo;
ans-=t;/*第二维不合法*/ t=; cnt=;
for(int i=;i<=n;i++)
{
if(i==||(d[i].a==d[i-].a&&d[i].b==d[i-].b)) cnt++;
else t=t*fac[cnt]%mo,cnt=;
if(i!=&&d[i].a<d[i-].a) t=;//注意可能不存在两维同时不减的情况
}
t=t*fac[cnt]%mo;
ans+=t;//两维都不合法
printf("%lld\n",(ans%mo+mo)%mo);
return ;
}

E. XOR Guessing

人生第一道交互题 $2333$

让你猜一个 $[0,2^{14}-1]$ 的数,你只能询问两次,每次你给出 $100$ 个数,系统会在你给的 $100$ 个数里面随便找一个值 $v$ 并返回答案与 $v$ 的异或值

要如何通过两次询问确定这个答案,询问时你给出的所有数必须互不相同

考虑一下如果能全给出 $0$ ,那么答案很显然,这样问一次就够了

考虑先确定答案二进制下的前半段,那么我们只要给出 $100$ 个二进制下高的 $7$ 位全为 $0$ 的数,不论系统返回什么值,高位的 $7$ 位就一定能确定

然后我们再问低位的 $7$ 位,同样给出 $100$ 个二进制下 低的 $7$ 位全为 $0$ 的数即可

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
int ans;
int main()
{
cout<<"? ";
for(int i=;i<=;i++)cout<<i<<" "; cout<<<<endl;
int t; cin>>t;
ans=t>>;
cout<<"? ";
for(int i=;i<=;i++) cout<<(i<<)<<" "; cout<<(<<)<<endl;
int res; cin>>res;
ans=(ans<<)|(res ^ ((res>>)<<) );
cout<<"! "<<ans<<endl;
return ;
}

F. Remainder Problem

题意:

给一个长度为 $5*10^5$ 的数列,初始全为 $0$,进行不超过 $5*10^5$ 次询问

把某个位置值加上一个数,或者询问所有 位置模 $x$ 意义下等于 $y$ 的位置的数值之和

发现如果 $x$ 一直很大,那么我们直接暴力枚举即可,如果 $x$ 一直很小,我们只要随便开个二维数组维护一下就行

考虑分类讨论一下,把询问分成大的和小的,大的就暴力枚举,小的就从二维数组里面查询

分界点取 $\sqrt {n}$ 或者某个差不多的数即可,复杂度 $O(n \sqrt {n})$

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=5e5,M=;
int n;
ll A[N+],sum[M+][M+];
int main()
{
n=read(); int opt,a,b;
for(int i=;i<=n;i++)
{
opt=read(),a=read(),b=read();
if(opt==)
{
A[a]+=b;
for(int i=;i<=M;i++) sum[i][a%i]+=b;
}
if(opt==)
{
if(a>M)
{
ll ans=;
for(int i=b;i<=N;i+=a) ans+=A[i];
printf("%lld\n",ans);
}
else printf("%lld\n",sum[a][b]);
}
}
return ;
}

G. Indie Album

比赛的时候竟然没看出来 $woc$,[NOI2011]阿狸的打字机 了解一下,差不多的做法

佛了

Educational Codeforces Round 71 (Rated for Div. 2) Solution的更多相关文章

  1. Educational Codeforces Round 71 (Rated for Div. 2)-F. Remainder Problem-技巧分块

    Educational Codeforces Round 71 (Rated for Div. 2)-F. Remainder Problem-技巧分块 [Problem Description] ​ ...

  2. Educational Codeforces Round 71 (Rated for Div. 2)-E. XOR Guessing-交互题

    Educational Codeforces Round 71 (Rated for Div. 2)-E. XOR Guessing-交互题 [Problem Description] ​ 总共两次询 ...

  3. Educational Codeforces Round 71 (Rated for Div. 2)E. XOR Guessing

    一道容斥题 如果直接做就是找到所有出现过递减的不同排列,当时硬钢到自闭,然后在凯妹毁人不倦的教导下想到可以容斥做,就是:所有的排列设为a,只考虑第一个非递减设为b,第二个非递减设为c+两个都非递减的情 ...

  4. Educational Codeforces Round 71 (Rated for Div. 2) E XOR Guessing (二进制分组,交互)

    E. XOR Guessing time limit per test1 second memory limit per test256 megabytes inputstandard input o ...

  5. [暴力] Educational Codeforces Round 71 (Rated for Div. 2) B. Square Filling (1207B)

    题目:http://codeforces.com/contest/1207/problem/B   B. Square Filling time limit per test 1 second mem ...

  6. [贪心,dp] Educational Codeforces Round 71 (Rated for Div. 2) C. Gas Pipeline (1207C)

    题目:http://codeforces.com/contest/1207/problem/C   C. Gas Pipeline time limit per test 2 seconds memo ...

  7. Educational Codeforces Round 71 (Rated for Div. 2)

    传送门 A.There Are Two Types Of Burgers 签到. B.Square Filling 签到 C.Gas Pipeline 每个位置只有"高.低"两种状 ...

  8. Remainder Problem(分块) Educational Codeforces Round 71 (Rated for Div. 2)

    引用:https://blog.csdn.net/qq_41879343/article/details/100565031 下面代码写错了,注意要上面这种.查:2  800  0,下面代码就错了. ...

  9. XOR Guessing(交互题+思维)Educational Codeforces Round 71 (Rated for Div. 2)

    题意:https://codeforc.es/contest/1207/problem/E 答案guessing(0~2^14-1) 有两次机会,内次必须输出不同的100个数,每次系统会随机挑一个你给 ...

随机推荐

  1. fok函数

    一.fork函数是什么 fork函数将运行着的程序分成2个(几乎)完全一样的进程.如下图: 进程1在进程关系中我们称之为父进程,进程2就是通过fork产生的,我们叫他子进程.这两个进程在fork执行完 ...

  2. MySQL的概述和基础(学习整理)

    1. 数据库基本概念 数据库(DataBase,DB)是用来存储和管理数据的仓库.与其他种类存储和管理数据的方式有所不同的是,数据库是兼持久化存储数据.便捷存储管理数据.使用统一的方式操作数据库几个特 ...

  3. php-fpm(绕过open_basedir,结合ssrf)

    环境的安装->https://www.cnblogs.com/zaqzzz/p/11870489.html 1.nginx的畸形访问 因为安装的是php7.0,所以需要手动修改一下(版本低的时候 ...

  4. win10+mysql8.0安装

    一.下载 mysql8.0 windows zip包下载地址: https://dev.mysql.com/downloads/mysql/   1540951981(1).png 二.安装 1.解压 ...

  5. win10系统在执行“ vagrant box add centos7 vagrant-centos-7.box”添加box时,报错“Vagrant failed to initialize at a very early stage: Failed to locate the powershell executable on the available PATH. ”

    这个意思是:在有效的路径中未能执行PowerShell命令. 请检查PowerShell的安装和有效的路径,然后再尝试重新运行这个命令. 在环境变量path中添加powershell的路径,例如:C: ...

  6. python —— 生成器

    通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素 ...

  7. Ubuntu 18.04安装arm-linux-gcc交叉编译器(超简单,附安装包下载地址)

    目前网上搜索发现,最多人安装的是4.4.3版本的: arm-linux-gcc-4.4.3.tar.gz下载地址:https://pan.baidu.com/s/1rAIBASIRZAXl-P1UOW ...

  8. jQuery源码解读----part 1

    来源:慕课网 https://www.imooc.com/video/4392 jQuery整体架构 jQuery按我的理解分为五大块,选择器.DOM操作.事件.AJAX与动画, 那么为什么有13个模 ...

  9. smarty建的mvc环境

    ================================搭建MVC结构================================基于MVC,解耦合 (高内聚,低耦合),优点:易维护.易扩 ...

  10. Build Telemetry for Distributed Services之OpenTracing指导:C#

    官网链接:https://opentracing.io/guides/ 官方微博:https://medium.com/opentracing Welcome to the OpenTracing G ...