【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是数学迷,特别是有关于分数的数学.最近他学了所谓一个分数被叫做“真分数”当且仅当其分子小于分母,而一个分数被叫做“最简分数”当且仅当其分子分母互质 ...
随机推荐
- JS调用App方法及App调用JS方法
做App内嵌H5项目时,经常会遇到js与App的交互,最普遍的就是方法的互相调用,那么如何实现方法的互相调用呢? 写在前面: 如果只是小项目且后期扩大的可能性不大的时候,可以忽略,可如果是长期项目的话 ...
- Nginx在Linux上的安装和配置
链接:http://www.cnblogs.com/wbyp/p/7737224.html
- PHP-从零开始使用Solr搜索引擎服务(上)
前言: 原文地址: http://www.cnblogs.com/JimmyBright/p/7156069.html 使用搜索引擎,我们常规的数据查询会快很多,还可以对关键词进行中文分词查询,返回一 ...
- Linux进程间通信(消息队列/信号量+共享内存)
写在前面 不得不说,Deadline果真是第一生产力.不过做出来的东西真的是不堪入目,于是又花了一早上重写代码. 实验内容 进程通信的邮箱方式由操作系统提供形如 send()和 receive()的系 ...
- USACO Section 1.5 Superprime Rib 解题报告
题目 题目描述 超级素数的定义如下:如果有个素数我们从右往左依次去掉一位数,每次去掉一位数剩下的数仍然是素数,那么我们称这个数是超级素数.例如7331,这是一个素数,从右往左依次去掉一位数733, 7 ...
- loj2538 「PKUWC2018」Slay the Spire 【dp】
题目链接 loj2538 题解 比较明显的是,由于强化牌倍数大于\(1\),肯定是能用强化牌尽量用强化牌 如果强化牌大于等于\(k\),就留一个位给攻击牌 所以我们将两种牌分别排序,企图计算\(F(i ...
- Reactor模式,或者叫反应器模式 - 为什么用多路io复用提供吞吐量
Reactor这个词译成汉语还真没有什么合适的,很多地方叫反应器模式,但更多好像就直接叫reactor模式了,其实我觉着叫应答者模式更好理解一些.通过了解,这个模式更像一个侍卫,一直在等待你的召唤,或 ...
- HDU 6040 stl
Hints of sd0061 Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others ...
- Discuz!论坛基本搭建
Crossday Discuz! Board(简称 Discuz!)是北京康盛新创科技有限责任公司推出的一套通用的社区论坛软件系统 一.LAMP环境搭建 参考地址:http://www.cnblogs ...
- nltk_29_pickle保存和导入分类器
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&am ...