【codeforces】【比赛题解】#950 CF Round #469 (Div. 2)
剧毒比赛,至少涨了分对吧。: (
【A】Left-handers, Right-handers and Ambidexters
题意:
有\(l\)个右撇子,\(r\)个左撇子,\(a\)个双手都惯用的人。
要让他们组成两个队伍,一边用左手,一边用右手,这两个队伍人数要相同。
问最大人数。
题解:
随便搞……
- #include<bits/stdc++.h>
- using namespace std;
- int l,r,a;
- int main(){
- scanf("%d%d%d",&l,&r,&a);
- if(l>r) swap(l,r);
- if(l+a<=r) {printf("%d",(l+a)*2); return 0;}
- printf("%d",(l+a+r)/2*2);
- return 0;
- }
【B】Intercepted Message
题意:
有两个数组\(x_1,x_2,\cdots,x_n\),\(y_1,x_2,\cdots,y_m\)。
要把这两个数组分成若干个子串(个数相等,从左到右一一对应)。
并且每个对应子串的和相等,问最多子串个数。
题解:
贪心,双指针扫过去。
- #include<bits/stdc++.h>
- #define F(i,a,b) for(int i=(a);i<=(b);++i)
- int n,m,ans;
- int a[100001],b[100001];
- int main(){
- scanf("%d%d",&n,&m);
- F(i,1,n) scanf("%d",a+i);
- F(i,1,m) scanf("%d",b+i);
- int l=1,sum1=0,sum2=0;
- F(i,1,n){
- sum1+=a[i];
- while(sum2+b[l]<=sum1) sum2+=b[l] ,++l;
- if(sum2==sum1) ++ans, sum1=sum2=0;
- }
- printf("%d",ans);
- return 0;
- }
【C】Zebras
题意:
给定一个01串,把它分成若干个子序列的并,不重复不遗漏。
并且要满足每个子序列都是斑马序列。
斑马序列的定义是,以0开始,01交替出现,并且以0结尾的字符串。
如果可行,输出任意方案,不可行输出-1。
题解:
set暴力上贪一波心。01分开set,能选就选。
- #include<bits/stdc++.h>
- #define F(i,a,b) for(int i=(a);i<=(b);++i)
- #define F2(i,a,b) for(int i=(a);i<(b);++i)
- using namespace std;
- int n;
- int arr[200007],tot,cnt;
- char str[200007];
- vector<int> ans[200007];
- set<int> st1,st2;
- set<int>::iterator iter;
- int main(){
- scanf("%s",str+1);
- n=strlen(str+1);
- F(i,1,n) if(str[i]=='0') st1.insert(i); else st2.insert(i);
- while(!st1.empty()){
- ++tot;
- int lst=*st1.lower_bound(0);
- st1.erase(lst);
- ans[tot].push_back(lst);
- while(1){
- int tmp1,tmp2;
- iter=st2.lower_bound(lst);
- if(iter==st2.end()) break;
- tmp1=*iter;
- iter=st1.lower_bound(tmp1);
- if(iter==st1.end()) break;
- tmp2=*iter;
- st2.erase(tmp1), st1.erase(tmp2);
- ans[tot].push_back(tmp1);
- ans[tot].push_back(tmp2);
- lst=tmp2;
- }
- }
- if(!st2.empty()){puts("-1"); return 0;}
- printf("%d\n",tot);
- F(i,1,tot){
- printf("%d ",ans[i].size());
- F2(j,0,ans[i].size()) printf("%d ",ans[i][j]);
- puts("");
- }
- return 0;
- }
【D】A Leapfrog in the Array
题意:略复杂,看原来的题面。
题解:
瞎找规律。
当前的len一开始为n,如果位置pos在这一串的"固定点"(一开始为奇数位)上,直接输出。
否则进行一波跳,len大致减半,pos大致减半,固定点的奇偶性随着len的奇偶性改变,答案加上跳过的数。
这么一波分类讨论一下就OK。
- #include<bits/stdc++.h>
- #define F(i,a,b) for(int i=(a);i<=(b);++i)
- typedef long long ll;
- ll n; int q;
- int main(){
- scanf("%lld%d",&n,&q);
- F(i,1,q){
- ll x, ans=0, len=n;
- int k=0;
- scanf("%lld",&x);
- while(x%2==k){
- ans+=k==0?(len+1)/2:len/2;
- x=(x+k)/2;
- int len2=len;
- len=k==0?len/2:(len+1)/2;
- k^=(len2&1);
- }
- printf("%lld\n",ans+(x+(k^1))/2);
- }
- return 0;
- }
【E】Data Center Maintenance
题意:略复杂,看原来的题面。
题解:
对于两个数据中心,如果有一个数据保存在这两个数据中心中,并且这两个数据中心的维护时间差1小时,那么如果其中一个时间小的移动了维护时间,另一个必然也要移动。
这是一个连锁反应,我们先把这种关系连成有向图。
那么对于一个圈,要不然全部取要不然全部不取。所以先强连通分量缩一波点。
然后得到一个DAG,那么如果取了一个点,它之后的所有点就都要取了,所以最佳策略是取出度为0的点。
那么就算做完了。
- #include<bits/stdc++.h>
- #define F(i,a,b) for(int i=a;i<=(b);++i)
- #define dF(i,a,b) for(int i=a;i>=(b);--i)
- #define eF(h,i,u) for(int i=h[u];i;i=nxt[i])
- using namespace std;
- int n,m,H,Ans;
- int Ut[100001];
- int h[100001],h2[100001],nxt[500001],to[500001],tot;
- inline void ins(int x,int y){nxt[++tot]=h[x];to[tot]=y;h[x]=tot;}
- inline void ins2(int x,int y){nxt[++tot]=h2[x];to[tot]=y;h2[x]=tot;}
- bool vis[100001];
- int dfn[100001],idf[100001],siz[100001],SCC[100001],Out[100001],cnt,CCn;
- int h3[100001];
- inline void ins3(int x,int y){nxt[++tot]=h3[x];to[tot]=y;h3[x]=tot;}
- bool check(int Ut1,int Ut2){return (Ut2-Ut1+H)%H==1;}
- void init(){
- int x,y;
- scanf("%d%d%d",&n,&m,&H);
- F(i,1,n) scanf("%d",Ut+i);
- F(i,1,m){
- scanf("%d%d",&x,&y);
- if(check(Ut[x],Ut[y])) ins(x,y),ins2(y,x);
- if(check(Ut[y],Ut[x])) ins(y,x),ins2(x,y);
- }
- }
- void DFS1(int u){
- vis[u]=1;
- eF(h,i,u)
- if(!vis[to[i]]) DFS1(to[i]);
- dfn[u]=++cnt; idf[cnt]=u;
- }
- void DFS2(int u){
- vis[u]=1; SCC[u]=CCn; ++siz[CCn]; ins3(CCn,u);
- eF(h2,i,u)
- if(!vis[to[i]]) DFS2(to[i]);
- }
- void Kosaraju(){
- F(i,1,n) if(!vis[i]) DFS1(i);
- memset(vis,0,sizeof vis);
- dF(i,n,1) if(!vis[idf[i]]) ++CCn, DFS2(idf[i]);
- F(u,1,CCn){
- eF(h3,i,u)
- eF(h,j,to[i])
- if(SCC[to[j]]!=u)
- Out[u]=1; goto ed;
- ed : ;
- }
- siz[Ans=0]=n+1;
- F(i,1,CCn) if(!Out[i]&&siz[Ans]>siz[i]) Ans=i;
- }
- int main(){
- init();
- Kosaraju();
- printf("%d\n",siz[Ans]);
- eF(h3,i,Ans) printf("%d ",to[i]);
- return 0;
- }
【codeforces】【比赛题解】#950 CF Round #469 (Div. 2)的更多相关文章
- 竞赛题解 - CF Round #524 Div.2
CF Round #524 Div.2 - 竞赛题解 不容易CF有一场下午的比赛,开心的和一个神犇一起报了名 被虐爆--前两题水过去,第三题卡了好久,第四题毫无头绪QwQ Codeforces 传送门 ...
- Codeforces Round #469 (Div. 2)
Codeforces Round #469 (Div. 2) 难得的下午场,又掉分了.... Problem A: 怎么暴力怎么写. #include<bits/stdc++.h> #de ...
- CF Round #551 (Div. 2) D
CF Round #551 (Div. 2) D 链接 https://codeforces.com/contest/1153/problem/D 思路 不考虑赋值和贪心,考虑排名. 设\(dp_i\ ...
- CF Round #510 (Div. 2)
前言:没想到那么快就打了第二场,题目难度比CF Round #509 (Div. 2)这场要难些,不过我依旧菜,这场更是被\(D\)题卡了,最后\(C\)题都来不及敲了..最后才\(A\)了\(3\) ...
- CF Round #600 (Div 2) 解题报告(A~E)
CF Round #600 (Div 2) 解题报告(A~E) A:Single Push 采用差分的思想,让\(b-a=c\),然后观察\(c\)序列是不是一个满足要求的序列 #include< ...
- cf Round#273 Div.2
题目链接,点击一下 Round#273 Div.2 ================== problem A Initial Bet ================== 很简单,打了两三场的cf第一 ...
- 【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发现了石 ...
随机推荐
- python3 执行AES加密方法
cmd执行命令:pip install pycryptodome # -*- coding: utf-8 -*- # __author__ = 'Carry' import base64 from C ...
- mysql中LIKE和REGEXP
mysql中LIKE和REGEXP都可以用来字符匹配 正则表达式REGEXP是为复杂搜索指定模式的强大方式. like用法 LIKE一般与通配符(%)和(_)两个使用 如例 SELECT prod ...
- [UOJ391] 鸽举选仕
我把这题推荐给yyb让他把这题做它的T2他竟然不要QwQ....... 题目大意: 下发八个题目和对应的八份代码,请构造数据Hack下发代码. Task1 下发代码用了一些神奇做法实现A + B = ...
- jQuery map和each用法
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 第五周linux学习笔记
第五章 系统调用 5.1 与内核通信 系统调用在用户空间进程和硬件设备之间添加了一个中间层.该层主要作用有三个. 它为用户空间提供了一种硬件的抽象接口. 系统调用保 证了系统的毡定和安全. 在第 3 ...
- bzoj 2178 自适应Simpson积分
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #i ...
- Linux下vim 快捷键
vim按d表示剪切 按dd剪切一行 vim命令:命令模式 /关键字 n继续向下查找vim的多行注释: 1.按ctrl + v进入 visual block模式 2.按上下选中要注释的行 3.按大写字母 ...
- 团体程序设计天梯赛-练习集 L1-031. 到底是不是太胖了
比较两个实型的数: 若两者相等,也许用a>/b会出错... 我又想到了codeforces有很多这样的坑... #include <stdio.h> #include <std ...
- 使用 laravel 的 queue 必须知道的一些事
1. 在修改 queue 相关代码后,必须要使用 php artisan queue:restart 来重启队列服务,否则所做的修改可能不会生效(没法重现了,按理说应该和使用 queue:listen ...
- java程序实现鼠标绘图
import java.awt.*; import javax.swing.*; class Gstudy extends JFrame{ private int x1,y1,x2,y2; priva ...