昨晚听说有教做人场,去补了下玩。

大概我的水平能做个5/6的样子?

(不会二进制Trie啊,我真菜)

A.

傻逼题。大概可以看成向量加法,判断下就好了。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int x1,x2,yy1,y2,x,y;
int main(){
scanf("%d%d%d%d%d%d",&x1,&yy1,&x2,&y2,&x,&y);
int dx=abs(x1-x2),dy=abs(yy1-y2);
if((abs(dx/x-dy/y)%==)&&(dx%x==)&&(dy%y==))puts("YES");
else puts("NO");
}

B.

找符合要求的最小三元组乘积出现次数。

sort一下随便搞搞就行了。

#include<bits/stdc++.h>
#define N 100010
typedef long long ll;
using namespace std;
ll a[N];int n;ll minv;
inline ll read(){
ll f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int main(){
n=read();
for(int i=;i<=n;i++)a[i]=read();
sort(a+,a+n+);ll cnt=;
for(int i=;i<=n;i++)if(a[i]==a[])cnt++;
if(a[]==a[])cout<<(cnt-)*(cnt-)*cnt/<<endl;
else if(a[]==a[])cout<<(cnt-)*cnt/<<endl;
else cout<<cnt<<endl;
}

C.

第一反应数位dp,反正也可做。

数位记忆化搜索大概也行的样子。

但是可以显然地证明一个性质:x + 1 - sumd(x + 1) ≥ x - sumd(x)

这就满足了一个单调性,按照出题人的想法是可以二分答案。

但是可以直接枚举最大的范围嘛!干嘛非要写个二分答案

而且这么写跑得飞快。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,s;
inline bool check(ll x){
ll res=x;
while(res){x-=res%;res/=;}
return x>=s;
}
int main(){
cin>>n>>s;ll maxv=min(n,s+),sum=;
for(ll i=s;i<=maxv;i++)if(check(i))++sum;
cout<<n-maxv+sum<<endl;
}

D.

用单调栈维护一个"一个数向左向右最大可以做max与min能管的距离"

好久不上语文课了表达能力=0

实在不行看官方题解吧。

#include<bits/stdc++.h>
#define N 1000005
#define inf 1000000007
typedef long long ll;
using namespace std;
int n,a[N];
ll ans1,ans2,ans;
stack<int>s1,s2;
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int main(){
n=read();
s1.push();s2.push();
for(int i=;i<=n;i++){
a[i]=read();a[]=;
while(s1.top()&&a[i]<a[s1.top()]){
int top=s1.top();s1.pop();
ans1-=1LL*a[top]*(top-s1.top());
}
ans1+=1LL*a[i]*(i-s1.top());s1.push(i);
a[]=inf;
while(s2.top()&&a[i]>a[s2.top()]){
int top=s2.top();s2.pop();
ans2-=1LL*a[top]*(top-s2.top());
}
ans2+=1LL*a[i]*(i-s2.top());s2.push(i);
ans+=ans2-ans1;
}
cout<<ans<<endl;
}

E.

我太菜了,以前居然没见过这种在二进制字典树上的贪心……

建一个二进制的字典树,然后贪心一下看能不能搞成1就行了。

具体的我日后可能得写个blog介绍下Trie的贪心。

#include<bits/stdc++.h>
#define N 3000005
using namespace std;
int size[N],ch[N][],n,cnt,a,b,type;
inline void ins(int x,int add){
int now=;
for(int i=;i>=;i--){
bool v=((x>>i)&);
if(!ch[now][v])ch[now][v]=++cnt;
now=ch[now][v];
size[now]+=add;
}
}
inline void query(int x,int y){
int ans=,now=,val=;
for(int i=;i>=&&now;i--){
bool xbit=((x>>i)&),ybit=((y>>i)&);
val+=val;
if(ybit){
ans+=size[ch[now][xbit]];now=ch[now][!xbit];
val+=!xbit;
}
else{now=ch[now][xbit];val+=xbit;}
}
printf("%d\n",ans);
}
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int main(){
cnt=;n=read();
while(n--){
int opt=read(),x=read();
if(opt==)ins(x,);
if(opt==)ins(x,-);
if(opt==){
int y=read();
query(x,y);
}
}
}

F.

看到mex突然激动,感觉可能是个DS题。

果然是。

第一反应主席树求一下就好,后来想下,主席树也是没有必要的。

直接线段树维护就行。

类似于取反,求最左节点的操作。

值域过大可以选择动态开点或者离散化。

我就写了个离散化……

类似的分解的操作的题bzoj都有,如果一下子看不懂这篇

可以QQ找我问几个原题。

#include<bits/stdc++.h>
#define N 300005
#define lson (o<<1)
#define rson (o<<1|1)
using namespace std;
typedef long long ll;
ll a[N];
struct Query{ll l,r,opt;}Q[N];
int n,len;
struct Segment_Tree{
int sumv[N<<],addv[N<<],rev[N<<];
inline void pushup(int o){sumv[o]=sumv[lson]+sumv[rson];}
inline void puttag(int o,int l,int r,int add,int re){
if(re){
if(addv[o]==-)rev[o]^=,sumv[o]=r-l+-sumv[o];
else addv[o]^=,sumv[o]=r-l+-sumv[o];
}
else if(add!=-){
rev[o]=;addv[o]=add;sumv[o]=(r-l+)*add;
}
}
inline void pushdown(int o,int l,int r){
int mid=(l+r)>>;
puttag(lson,l,mid,addv[o],rev[o]);
puttag(rson,mid+,r,addv[o],rev[o]);
addv[o]=-;rev[o]=;
}
void build(int o,int l,int r){
if(l==r){addv[o]=-;return;}
int mid=(l+r)>>;
build(lson,l,mid);build(rson,mid+,r);
addv[o]=-;
}
int querymex(int o,int l,int r){
if(l==r)return l;
int mid=(l+r)>>;pushdown(o,l,r);
if(sumv[lson]<mid-l+)return querymex(lson,l,mid);
else return querymex(rson,mid+,r);
}
void change(int o,int l,int r,int ql,int qr,int add,int re){;
if(ql<=l&&r<=qr){puttag(o,l,r,add,re);return;}
int mid=(l+r)>>;pushdown(o,l,r);
if(ql<=mid)change(lson,l,mid,ql,qr,add,re);
if(qr>mid)change(rson,mid+,r,ql,qr,add,re);
pushup(o);
}
}T;
inline ll read(){
ll f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int main(){
n=read();
for(int i=;i<=n;i++){
Q[i].opt=read();Q[i].l=read();Q[i].r=read();
}
a[]=;
for(int i=;i<=n;i++)a[*i-]=Q[i].l,a[*i]=Q[i].r,a[*i+]=Q[i].r+;
sort(a+,a+n*+);
len=;
for(int i=;i<=*n+;++i)if(a[i]!=a[i-]) a[++len]=a[i];
T.build(,,len);
for(int i=;i<=n;i++){
int x=lower_bound(a+,a+len+,Q[i].l)-a,y=lower_bound(a+,a+len+,Q[i].r)-a;
if(Q[i].opt==)T.change(,,len,x,y,,);
if(Q[i].opt==)T.change(,,len,x,y,,);
if(Q[i].opt==)T.change(,,len,x,y,-,);
printf("%lld\n",a[T.querymex(,,len)]);
}
}

啊最后总结下吧。

姿势水平还不够,还得学习一个。

数据结构要学会活学活用,用现有的水平解决一些不是很常规的问题。

dp什么的思维还是不够,要学习一个。

不过这场的外国人居然出了两个DS?

但是可能外国的DS水平不如我国?这个Trie题讲道理可能在国内只有T2的难度吧。

最后一个Segment-Tree可以算奇奇怪怪的常规应用的组合。

所以还是要熟练呀~

Educational Codeforces Round 23 补题小结的更多相关文章

  1. Educational Codeforces Round 27 补题

    题目链接:http://codeforces.com/contest/845 A. Chess Tourney 水题,排序之后判断第n个元素和n+1个元素是不是想等就可以了. #include < ...

  2. cordforce Educational Codeforces Round 47 补题笔记 <未完>

    题目链接 http://codeforces.com/contest/1009 A. Game Shopping 直接模拟即可,用了一个队列来存储账单 #include <iostream> ...

  3. Educational Codeforces Round 12补题 经典题 再次爆零

    发生了好多事情 再加上昨晚教育场的爆零 ..真的烦 题目链接 A题经典题 这个题我一开始推公式wa 其实一看到数据范围 就算遍历也OK 存在的问题进制错误 .. 思路不清晰 两个线段有交叉 并不是端点 ...

  4. Educational Codeforces Round 22 补题 CF 813 A-F

    A The Contest 直接粗暴贪心 略过 #include<bits/stdc++.h> using namespace std; int main() {//freopen(&qu ...

  5. Educational Codeforces Round 23 A-F 补题

    A Treasure Hunt 注意负数和0的特殊处理.. 水题.. 然而又被Hack了 吗的智障 #include<bits/stdc++.h> using namespace std; ...

  6. Educational Codeforces Round 15 套题

    这套题最后一题不会,然后先放一下,最后一题应该是大数据结构题 A:求连续最长严格递增的的串,O(n)简单dp #include <cstdio> #include <cstdlib& ...

  7. Educational Codeforces Round 21 A-E题题解

    A题      ............太水就不说了,贴下代码 #include<string> #include<iostream> #include<cstring& ...

  8. Educational Codeforces Round 23 E. Choosing The Commander trie数

    E. Choosing The Commander time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  9. Educational Codeforces Round 23

    A题 分析:注意两个点之间的倍数差,若为偶数则为YES,否则为NO #include "iostream" #include "cstdio" #include ...

随机推荐

  1. bzoj2257[POI2011]Programming Contest

    首先可以费用流建图,左边一堆点表示人,右边一堆点表示题,源点向每个人连floor(t/r)条边,费用依次为r,2r,3r….然后写了一个卡不过去,动态加边也卡不过去,然后我想:这里一定有一些不为人知的 ...

  2. BZOJ4300 绝世好题(动态规划)

    设f[i][j]为前i个数中所选择的最后一个数在第j位上为1时的最长序列长度,转移显然. #include<iostream> #include<cstdio> #includ ...

  3. BZOJ4152 AMPPZ2014 The Captain(最短路)

    事实上每次走到横坐标或纵坐标最接近的点一定可以取得最优方案.于是这样连边跑最短路就可以了. #include<iostream> #include<cstdio> #inclu ...

  4. [洛谷P5075][JSOI2012]分零食

    题目大意:有$m(m\leqslant10^8)$个人站成一排,有$n(n\leqslant10^4)$个糖果,若第$i$个人没有糖果,那么第$i+1$个人也没有糖果.一个人有$x$个糖果会获得快乐值 ...

  5. [洛谷P3224][HNOI2012]永无乡

    题目大意:给你$n$个点,每个点有权值$k$,现有两种操作: 1. $B\;x\;y:$将$x,y$所在联通块合并2. $Q\;x\;k:$查询第$x$个点所在联通块权值第$k$小是哪个数 题解:线段 ...

  6. [AHOI2014/JSOI2014]支线剧情 有上下界费用流

    ---题面--- 题解: 第一眼费用流,,然后想了好久怎么建图,,,最后发现是最小费用可行流的板子题.... 其实还没有很懂这个算法,所以这里只是摆一下步骤,以后再补理解吧. 首先一个思路就是转换图, ...

  7. BZOJ4517 & 洛谷4071:[SDOI2016]排列计数——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4517 https://www.luogu.org/problemnew/show/P4071 求有 ...

  8. 牛客网 提高组第8周 T2 推箱子 解题报告

    推箱子 链接: https://ac.nowcoder.com/acm/contest/176/B 来源:牛客网 题目描述 在平面上有\(n\)个箱子,每个箱子都可以看成一个矩形,两条边都和坐标轴平行 ...

  9. php ul li 分类

    <?phpfunction do_tree($arr,$pid){ echo "<ul>"; foreach ($arr as $key => $value ...

  10. Navicat新建查询快捷键

    在Navicat中,我们选中一个表,双击打开,这是如果要新建查询这个表的sql语句,可以直接用快捷键  ctrl+q 会自动打开查询窗口,并直接写好 sql:select * from (当前打开的表 ...