【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是数学迷,特别是有关于分数的数学.最近他学了所谓一个分数被叫做“真分数”当且仅当其分子小于分母,而一个分数被叫做“最简分数”当且仅当其分子分母互质 ...
随机推荐
- Python教程:丛入门到实践
一.特殊用法的函数 name = "python very good" print(name.title()) 方法是python可对数据执行的操作.每个方法后面都跟着一对括号. ...
- 【BZOJ4869】【SHOI2017】相逢是问候
Description BZOJ传送门 Solution 这题涉及到指数嵌套堆叠,可能可以用欧拉函数解决. 试想一个数\(a_i\)经过\(k\)次操作后会变成什么? \[ k个c\;\; \begi ...
- 洛谷 P1436 棋盘分割 解题报告
P1436 棋盘分割 题目描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的两部分中的任意一块继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共 ...
- 【bzoj4013】 HNOI2015—实验比较
http://www.lydsy.com/JudgeOnline/problem.php?id=4013 (题目链接) 题意 给出$n$个数的$m$个大小关系,问它们之间可以形成的单调不降的序列有多少 ...
- 使用mshta.exe绕过应用程序白名单(多种方法)
0x00 简介 很长一段时间以来,HTA文件一直被web攻击或在野恶意软件下载程序用作恶意程序的一部分.HTA文件在网络安全领域内广为人知,从红队和蓝队的角度来看,它是绕过应用程序白名单有价值的“ ...
- UVA.11806 Cheerleaders (组合数学 容斥原理 二进制枚举)
UVA.11806 Cheerleaders (组合数学 容斥原理 二进制枚举) 题意分析 给出n*m的矩形格子,给出k个点,每个格子里面可以放一个点.现在要求格子的最外围一圈的每行每列,至少要放一个 ...
- IntelliJ IDEA详细配置和使用教程-字体、编码和基本设置
IDEA使用--字体.编码和基本设置 https://blog.csdn.net/frankcheng5143/article/details/50779149 IntelliJ IDEA详细配置和使 ...
- 移动端图片轮播—swipe滑动插件
swipe是一个轻量级的移动滑动组件,它可以支持精确的触滑移动操作,能解决移动端对滑动的需求. swipe插件的使用主要有四大块: 一.html <div id='slider' class=' ...
- codeforces div1 & div2 参与人员分数统计
Analysis helps to see the nature of things.
- 团体程序设计天梯赛 L1-049. 天梯赛座位分配(测试数据+不同方法)
Data: /*33 2 1#11 4 7 10 13 16 19 22 25 2831 33 35 37 39 41 43 45 47 4951 53 55 57 59 61 63 65 67 69 ...