【codeforces】【比赛题解】#920 Educational CF Round 37
【A】浇花
题意:
一个线段上每个整点都有花,有的点有自动浇花的喷水器,有问几秒能浇完所有的花。
题解:
大模拟
#include<cstdio>
#include<cstring>
#include<algorithm>
#define F(i,a,b) for(int i=(a);i<=(b);++i)
#define F2(i,a,b) for(int i=(a);i<(b);++i)
#define dF(i,a,b) for(int i=(a);i>=(b);--i)
#define dF2(i,a,b) for(int i=(a);i>(b);--i)
#include<cmath>
#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<set>
#include<map>
#define ll long long
#define eF(i,u) for(int i=h[u];i;i=nxt[i])
using namespace std;
const int INF=0x3f3f3f3f;
inline int Abs(int X){return X<?-X:X;}
inline int Gcd(int X,int Y){return Y?Gcd(Y,X%Y):X;}
inline ll Gcd(ll X,ll Y){return Y?Gcd(Y,X%Y):X;}
inline int Max(int X,int Y){return X<Y?Y:X;}
inline int Min(int X,int Y){return X<Y?X:Y;}
inline ll Max(ll X,ll Y){return X<Y?Y:X;}
inline ll Min(ll X,ll Y){return X<Y?X:Y;}
inline int Pow(int base,ll exp,int _mod){int _ans=;for(;exp;exp>>=,base=(ll)base*base%_mod)exp&?_ans=(ll)_ans*base%_mod:;return _ans;}
inline ll Pow(ll base,ll exp,ll _mod){ll _ans=;for(;exp;exp>>=,base=base*base%_mod)exp&?_ans=_ans*base%_mod:;return _ans;}
int n,q,Ans;
int a[],b[];
int main(){
int T;
scanf("%d",&T);
while(T--){
Ans=;
scanf("%d%d",&n,&q);
F(i,,q) scanf("%d",a+i);
F(i,,n){
int k=;
F(j,,q){
k=Min(k,Abs(i-a[j]));
}
Ans=Max(Ans,k);
}
printf("%d\n",Ans+);
}
return ;
}
【B】排队喝茶
题意:
有\(n\)个人排队喝茶,第\(i\)个人\(l_i\)时刻来排队,如果\(r_i\)时刻还没有排到他,他就走了,问每个人喝到茶的时间或者他没有喝到茶。
题解:
大模拟,每个人是否走了可以到他了再判断。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define F(i,a,b) for(int i=(a);i<=(b);++i)
#define F2(i,a,b) for(int i=(a);i<(b);++i)
#define dF(i,a,b) for(int i=(a);i>=(b);--i)
#define dF2(i,a,b) for(int i=(a);i>(b);--i)
#include<cmath>
#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<set>
#include<map>
#define ll long long
#define eF(i,u) for(int i=h[u];i;i=nxt[i])
using namespace std;
const int INF=0x3f3f3f3f;
inline int Gcd(int X,int Y){return Y?Gcd(Y,X%Y):X;}
inline ll Gcd(ll X,ll Y){return Y?Gcd(Y,X%Y):X;}
inline int Max(int X,int Y){return X<Y?Y:X;}
inline int Min(int X,int Y){return X<Y?X:Y;}
inline ll Max(ll X,ll Y){return X<Y?Y:X;}
inline ll Min(ll X,ll Y){return X<Y?X:Y;}
inline int Pow(int base,ll exp,int _mod){int _ans=;for(;exp;exp>>=,base=(ll)base*base%_mod)exp&?_ans=(ll)_ans*base%_mod:;return _ans;}
inline ll Pow(ll base,ll exp,ll _mod){ll _ans=;for(;exp;exp>>=,base=base*base%_mod)exp&?_ans=_ans*base%_mod:;return _ans;}
int n,q;
int l[],r[],Ans[];
int que[],L,R;
int main(){
int T;
scanf("%d",&T);
while(T--){
L=, R=;
scanf("%d",&n);
memset(Ans,,sizeof Ans);
F(i,,n) scanf("%d%d",l+i,r+i);
int i=;
F(t,,){
while(l[i]==t) que[++R]=i, ++i;
while(L<=R&&r[que[L]]<t) ++L;
if(L<=R) Ans[que[L++]]=t;
}
F(j,,n) printf("%d ",Ans[j]); puts("");
}
return ;
}
【C】交换相邻元素
题意:
一个1到n的排列,你可以交换某些相邻位置的值,问能否交换成上升序列。
题解:
连续的一串可以交换的,就表示这一串可以直接排序,那么我们把所有连续的一段都各自排序,看最终的数组是否升序即可。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define F(i,a,b) for(int i=(a);i<=(b);++i)
#define F2(i,a,b) for(int i=(a);i<(b);++i)
#define dF(i,a,b) for(int i=(a);i>=(b);--i)
#define dF2(i,a,b) for(int i=(a);i>(b);--i)
#include<cmath>
#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<set>
#include<map>
#define ll long long
#define eF(i,u) for(int i=h[u];i;i=nxt[i])
using namespace std;
const int INF=0x3f3f3f3f;
inline int Gcd(int X,int Y){return Y?Gcd(Y,X%Y):X;}
inline ll Gcd(ll X,ll Y){return Y?Gcd(Y,X%Y):X;}
inline int Max(int X,int Y){return X<Y?Y:X;}
inline int Min(int X,int Y){return X<Y?X:Y;}
inline ll Max(ll X,ll Y){return X<Y?Y:X;}
inline ll Min(ll X,ll Y){return X<Y?X:Y;}
inline int Pow(int base,ll exp,int _mod){int _ans=;for(;exp;exp>>=,base=(ll)base*base%_mod)exp&?_ans=(ll)_ans*base%_mod:;return _ans;}
inline ll Pow(ll base,ll exp,ll _mod){ll _ans=;for(;exp;exp>>=,base=base*base%_mod)exp&?_ans=_ans*base%_mod:;return _ans;}
int n,q;
int a[],b[];
int main(){
scanf("%d",&n);
F(i,,n) scanf("%d",a+i);
char ch;
F2(i,,n) if((ch=getchar())!=''&&ch!='') --i; else b[i]=ch-'';
int lst=;
F(i,,n){
if(!b[i]) sort(a+lst,a+i+), lst=i+;
} sort(a+lst,a+n+);
F(i,,n) if(a[i]!=i) {puts("NO"); return ;}
puts("YES");
return ;
}
【D】水缸
题意:
有一些容量无限的水缸,初始时每个水缸中各自有一些水,你有一个容积为k的勺子,问你能否通过用勺子舀水让一个水缸中的水变成要求的V体积?
题解:
考虑把所有的水缸的水和要求的V体积都对勺子容积k取模。
那么如果有一些水缸中的水相加,再对k取模,等于V对k取模的结果,我们就确定最终的V体积的水来自这些水缸。
那么用\(f[i][j]\)表示前\(i\)个水缸中能否相加达到\(j\)容积(\(j\)对\(k\)取模)。
特别地,\(f[i][j]=1\)表示这一个水缸不需要选,\(f[i][j]=2\)表示这一个水缸可以选。
那么最终确定结果时可以反推回来,确定选取哪些水缸。
之后的事情主要是分类讨论,注意输出格式。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define F(i,a,b) for(int i=(a);i<=(b);++i)
#define F2(i,a,b) for(int i=(a);i<(b);++i)
#define dF(i,a,b) for(int i=(a);i>=(b);--i)
#define dF2(i,a,b) for(int i=(a);i>(b);--i)
#include<cmath>
#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<set>
#include<map>
#define ll long long
#define eF(i,u) for(int i=h[u];i;i=nxt[i])
using namespace std;
const int INF=0x3f3f3f3f;
inline int Gcd(int X,int Y){return Y?Gcd(Y,X%Y):X;}
inline ll Gcd(ll X,ll Y){return Y?Gcd(Y,X%Y):X;}
inline int Max(int X,int Y){return X<Y?Y:X;}
inline int Min(int X,int Y){return X<Y?X:Y;}
inline ll Max(ll X,ll Y){return X<Y?Y:X;}
inline ll Min(ll X,ll Y){return X<Y?X:Y;}
inline int Pow(int base,ll exp,int _mod){int _ans=;for(;exp;exp>>=,base=(ll)base*base%_mod)exp&?_ans=(ll)_ans*base%_mod:;return _ans;}
inline ll Pow(ll base,ll exp,ll _mod){ll _ans=;for(;exp;exp>>=,base=base*base%_mod)exp&?_ans=_ans*base%_mod:;return _ans;}
int n,k,v;
int a[],b[],sum,s2;
int f[][];
int Ans[];
int main(){
scanf("%d%d%d",&n,&k,&v);
F(i,,n) scanf("%d",a+i), sum+=a[i], b[i]=a[i], a[i]%=k;
// F(i,1,n) printf("%d ",a[i]); puts("");
if(sum<v) {puts("NO"); return ;}
f[][]=;
F(i,,n){
F2(j,,k){
if(f[i-][j]){
f[i][j]=;
if(j+a[i]<k) f[i][j+a[i]]=;
else f[i][j+a[i]-k]=;
}
}
}
// F(i,1,n){
// F2(j,0,k){
// printf("%d ",f[i][j]);
// }
// puts("");
// }
if(f[n][v%k]==) puts("NO");
else{
puts("YES");
int now=v%k;
int u=-, unu=-;
dF(i,n,){
if(f[i][now]==) Ans[i]=, now=(now-a[i]+k)%k;
}
// printf("ans:"); F(i,1,n) printf("%d ",Ans[i]); puts("");
F(i,,n) if(!Ans[i]) unu=i; else u=i;
// printf("u : %d, unu : %d\n",u,unu);
if(u==-){
F(i,,n) if(b[i]>) printf("%d %d 1\n",(b[i]-)/k+,i);
if(v>) printf("%d 1 2\n",v/k);
}
else if(unu==-){
F(i,,n) if(b[i]>) printf("%d %d 1\n",(b[i]-)/k+,i);
if(sum-v>) printf("%d 1 2\n",(sum-v)/k);
}
else{
int s1=b[u],s2=b[unu];
F(i,,n){
if(Ans[i]==&&i!=u&&b[i]>) printf("%d %d %d\n",(b[i]-)/k+,i,u), s1+=b[i];
if(Ans[i]==&&i!=unu&&b[i]>) printf("%d %d %d\n",(b[i]-)/k+,i,unu), s2+=b[i];
}
if(s2>=k) printf("%d %d %d\n",s2/k,unu,u); s1+=s2/k*k;
if(s1-v>=k) printf("%d %d %d\n",(s1-v)/k,u,unu);
}
}
return ;
}
【E】连通分量?
题意:
从一个\(n\)个点的无向完全图中删去\(m\)条边,问现在图中连通分量个数和每个连通分量大小。
题解:
看了别人的博才发现这题其实非常简单暴力。
就是暴力BFS,不过下一个点要从还没到过的点的集合中枚举,就这么简单。
为什么不会TLE?我们算一下时间复杂度:
每个点都只会经过一次,也只会遍历一次。那么遍历当前点时,要花多少时间呢?
在剩下的点中枚举,就是枚举到没有删除的边就会把这个点加入队列吧,每个点只要加入了队列它就不会被再搜到,所以枚举点的复杂度是\(O(log\;n)\)的,因为我使用了STL的set容器。
但是如果搜到了被删除的边呢?这样的边可以保证只会被搜到最多2m次,从一条边的两端点出发。
那么最终复杂度是\(O(n(log\;n+log\;m))\),非常巧妙。
#include<cstdio>
#define F(i,a,b) for(int i=(a);i<=(b);++i)
#include<set>
using namespace std;
inline int Max(int X,int Y){return X<Y?Y:X;}
inline int Min(int X,int Y){return X<Y?X:Y;}
int n,m;
set<int> vv;
set<pair<int,int> > st;
bool vis[200001];
int que[200001],l,r;
int Ans[200001],ans;
int main(){
scanf("%d%d",&n,&m);
int x,y; F(i,1,m) scanf("%d%d",&x,&y), st.insert(make_pair(Min(x,y),Max(x,y)));
F(i,1,n) vv.insert(i);
F(i,1,n){
if(!vis[i]){
vis[i]=1; vv.erase(i);
que[l=r=1]=i;
while(l<=r){
int u=que[l++];
for(set<int>::iterator j=vv.begin();j!=vv.end();){
if(!st.count(make_pair(Min(u,*j),Max(u,*j))))
que[++r]=*j, vis[*j]=1, vv.erase(j++);
else ++j;
}
}
++Ans[r]; ++ans;
}
}
printf("%d\n",ans);
F(i,1,n) while(Ans[i]--) printf("%d ",i);
return 0;
}
【codeforces】【比赛题解】#920 Educational CF Round 37的更多相关文章
- 【codeforces】【比赛题解】#960 CF Round #474 (Div. 1 + Div. 2, combined)
终于打了一场CF,不知道为什么我会去打00:05的CF比赛…… 不管怎么样,这次打的很好!拿到了Div. 2选手中的第一名,成功上紫! 以后还要再接再厉! [A]Check the string 题意 ...
- 【codeforces】【比赛题解】#937 CF Round #467 (Div. 2)
没有参加,但是之后几天打了哦,第三场AK的CF比赛. CF大扫荡计划正在稳步进行. [A]Olympiad 题意: 给\(n\)个人颁奖,要满足: 至少有一个人拿奖. 如果得分为\(x\)的有奖,那么 ...
- 【codeforces】【比赛题解】#869 CF Round #439 (Div.2)
良心赛,虽然我迟了半小时233333. 比赛链接:#869. 呃,CF的比赛都是有背景的……上次是<哈利波特>,这次是<物语>…… [A]巧妙的替换 题意: Karen发现了石 ...
- 【codeforces】【比赛题解】#849 CF Round #431 (Div.2)
cf的比赛越来越有难度了……至少我做起来是这样. 先看看题目吧:点我. 这次比赛是北京时间21:35开始的,算是比较良心. [A]奇数与结束 "奇数从哪里开始,又在哪里结束?梦想从何处起航, ...
- 【codeforces】【比赛题解】#950 CF Round #469 (Div. 2)
剧毒比赛,至少涨了分对吧.: ( [A]Left-handers, Right-handers and Ambidexters 题意: 有\(l\)个右撇子,\(r\)个左撇子,\(a\)个双手都惯用 ...
- 【codeforces】【比赛题解】#931 CF Round #468 (Div. 2)
因为太迟了,所以没去打. 后面打了Virtual Contest,没想到拿了个rank 3,如果E题更快还能再高,也是没什么想法. [A]Friends Meeting 题意: 在数轴上有两个整点\( ...
- 【codeforces】【比赛题解】#862 CF Round #435 (Div.2)
这次比赛打得很舒服,莫名得了个Rank41,涨了219的Rating,就比较优秀.不过还是没有闫神厉害啊.题目链接::P. [A]MEX 题意: Evil博士把Mahmoud和Ehab绑架到了邪恶之地 ...
- 【codeforces】【比赛题解】#868 CF Round #438 (Div.1+Div.2)
这次是Div.1+Div.2,所以有7题. 因为时间较早,而且正好赶上训练,所以机房开黑做. 然而我们都只做了3题.:(. 链接. [A]声控解锁 题意: Arkady的宠物狗Mu-mu有一只手机.它 ...
- 【codeforces】【比赛题解】#854 CF Round #433 (Div.2)
cf一如既往挺丧 看丧题点我! [A]分数 Petya是数学迷,特别是有关于分数的数学.最近他学了所谓一个分数被叫做“真分数”当且仅当其分子小于分母,而一个分数被叫做“最简分数”当且仅当其分子分母互质 ...
随机推荐
- 手写简单的promise
function Promise(fn) { var that = this; this.status = "pedding"; this.value = undefined; / ...
- mapreduce方式操作hbase
一.导入数据到hbase 1.配置hbase-site.xml指向hdfs <configuration> <property> <name>hbase.rootd ...
- VUE开发一个图片轮播的组件
完成效果图如下: vue开发的思路主要是数据绑定,代码如下: <template> <div ref="root" style="user-select ...
- [UVALive 2678] Subsequence
图片加载可能有点慢,请跳过题面先看题解,谢谢 在切水题的道路上狂奔,一发不可收拾... 这道题好像不用写什么题解吧,吐个槽什么的算了 一眼题,大佬们都不屑于做,只有我这种弱菜才来写这种题目玩儿 记个前 ...
- BZOJ 4753 [Jsoi2016]最佳团体 | 树上背包 分数规划
BZOJ 4753 [Jsoi2016]最佳团体 | 树上背包 分数规划 又是一道卡精度卡得我头皮发麻的题-- 题面(--蜜汁改编版) YL大哥是24OI的大哥,有一天,他想要从\(N\)个候选人中选 ...
- 解题:USACO15JAN Grass Cownoisseur
解题 首先缩点没啥可说的,然后考虑枚举这次逆行的边.具体来说在正常的图和反图上各跑一次最长路,然后注意减掉起点的贡献,用拓扑排序实现(我这里瞎写了个Bellman_Ford,其实在DAG上这好像和拓扑 ...
- 解题:POI 2008 Plot purchase
题面 原来看过然后没做,结果板板把这道题改了改考掉了,血亏=.= 首先看看有没有符合条件的点.如果没有开始寻找解,先把所有的大于$2*k$的点设为坏点,然后求最大子矩形,只要一个最大子矩形的权值和超过 ...
- 【agc003D】Anticube
Portal --> agc003D Description 给你\(n\)个数,要从里面选出最多的数满足这些选出来的数中任意两个数的乘积都不是立方数 Solution (为什么感觉最近这种解法 ...
- PHP获取图片主题颜色
(1)工具类:pictureColor.php class pictureColor{ /** * 获取颜色使用库类型 */ public $type = 'gd'; ...
- 浏览器json数据格式化
在浏览器上作接口测试的时候看到json 格式的数据是密密麻麻的一片,眼睛都花了.. 如: 设置方法: chrome 的右上角选择,然后--- 更多工具--- 扩展程序 ---- JSO ...