【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的更多相关文章

  1. 【codeforces】【比赛题解】#960 CF Round #474 (Div. 1 + Div. 2, combined)

    终于打了一场CF,不知道为什么我会去打00:05的CF比赛…… 不管怎么样,这次打的很好!拿到了Div. 2选手中的第一名,成功上紫! 以后还要再接再厉! [A]Check the string 题意 ...

  2. 【codeforces】【比赛题解】#937 CF Round #467 (Div. 2)

    没有参加,但是之后几天打了哦,第三场AK的CF比赛. CF大扫荡计划正在稳步进行. [A]Olympiad 题意: 给\(n\)个人颁奖,要满足: 至少有一个人拿奖. 如果得分为\(x\)的有奖,那么 ...

  3. 【codeforces】【比赛题解】#869 CF Round #439 (Div.2)

    良心赛,虽然我迟了半小时233333. 比赛链接:#869. 呃,CF的比赛都是有背景的……上次是<哈利波特>,这次是<物语>…… [A]巧妙的替换 题意: Karen发现了石 ...

  4. 【codeforces】【比赛题解】#849 CF Round #431 (Div.2)

    cf的比赛越来越有难度了……至少我做起来是这样. 先看看题目吧:点我. 这次比赛是北京时间21:35开始的,算是比较良心. [A]奇数与结束 "奇数从哪里开始,又在哪里结束?梦想从何处起航, ...

  5. 【codeforces】【比赛题解】#950 CF Round #469 (Div. 2)

    剧毒比赛,至少涨了分对吧.: ( [A]Left-handers, Right-handers and Ambidexters 题意: 有\(l\)个右撇子,\(r\)个左撇子,\(a\)个双手都惯用 ...

  6. 【codeforces】【比赛题解】#931 CF Round #468 (Div. 2)

    因为太迟了,所以没去打. 后面打了Virtual Contest,没想到拿了个rank 3,如果E题更快还能再高,也是没什么想法. [A]Friends Meeting 题意: 在数轴上有两个整点\( ...

  7. 【codeforces】【比赛题解】#862 CF Round #435 (Div.2)

    这次比赛打得很舒服,莫名得了个Rank41,涨了219的Rating,就比较优秀.不过还是没有闫神厉害啊.题目链接::P. [A]MEX 题意: Evil博士把Mahmoud和Ehab绑架到了邪恶之地 ...

  8. 【codeforces】【比赛题解】#868 CF Round #438 (Div.1+Div.2)

    这次是Div.1+Div.2,所以有7题. 因为时间较早,而且正好赶上训练,所以机房开黑做. 然而我们都只做了3题.:(. 链接. [A]声控解锁 题意: Arkady的宠物狗Mu-mu有一只手机.它 ...

  9. 【codeforces】【比赛题解】#854 CF Round #433 (Div.2)

    cf一如既往挺丧 看丧题点我! [A]分数 Petya是数学迷,特别是有关于分数的数学.最近他学了所谓一个分数被叫做“真分数”当且仅当其分子小于分母,而一个分数被叫做“最简分数”当且仅当其分子分母互质 ...

随机推荐

  1. 用python和unittest编写app自动化测试用例

    import unittest import webdriver import time class Test(unittest.TestCase): @classmethod def setUpCl ...

  2. https和http/2

    http://geek.csdn.net/news/detail/188003 HTTPS协议原理分析 HTTPS协议需要解决的问题 HTTPS作为安全协议而诞生,那么就不得不面对以下两大安全问题: ...

  3. 怎么解决Xing欲

    怎么解决Xing欲 来源:微信号 王路在隐身 这是知乎上的一道问题.原题叫<和尚怎么解决性欲>. 本来由出家人回答更合适,但估计出家人一般不太愿意回答. 我看了几十个答案,几乎都是在调侃出 ...

  4. DB2 Vs MySQL系列 | MySQL与DB2的数据类型对比

    随着MySQL数据库的应用越来越广泛,DB2向MySQL数据库的迁移需求也越来越多.进行数据库之间迁移的时候,首先遇到的并且也是最基本最重要的就是两种数据库数据类型之间的转换. 相关阅读: 从商用到开 ...

  5. 【BZOJ2731】三角形覆盖问题

    想象一条平行于\(y\)轴的扫描线,从低往高扫描.如何确定关键高度才能使每两个关键高度之间分割出的图形易于计算呢? 关键高度有:三角形底边高度.三角形上顶点高度.三角形交点的高度. ​ 如此分割,我们 ...

  6. ThinkPHP 5.x远程命令执行漏洞分析与复现

    0x00 前言 ThinkPHP官方2018年12月9日发布重要的安全更新,修复了一个严重的远程代码执行漏洞.该更新主要涉及一个安全更新,由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的 ...

  7. netbeans工具使用xdebug断点调试php源码

    对有有经验的程序员,使用echo.print_r().print_f().var_dump()等函数足以调试php代码,如果需要在IDE工具中使用断点调试,xdebug就是一个非常好的php调试工具. ...

  8. Andrioid Studio生成jar, aar包

    在Android Studio中对一个自己库进行生成操作时将会同时生成*.jar与*.aar文件.分别存储位置:*.jar:库/build/intermediates/bundles/debug(re ...

  9. jq获取兄弟节点

    $('#id').siblings() 当前元素所有的兄弟节点$('#id').prev() 当前元素前一个兄弟节点$('#id').prevaAll() 当前元素之前所有的兄弟节点$('#id'). ...

  10. POI上传,导入excel文件到服务器1

    首先说一下所使用的POI版本3.8,需要用的的Jar包: dom4j-1.6.1.jarpoi-3.8-20120326.jarpoi-ooxml-3.8-20120326.jarpoi-ooxml- ...