Codeforces Round #390 (Div. 2) A+B+D!
A. Lesha and array splitting
水题模拟。(0:10)
题意:给你一个n个元素的数组,求能否把这个数组分成若干连续小段,使得每段的和不为0。如有多种解输出任意一个。
思路:搞一个前缀和,如果这个数列的和不为0那么就直接输出一个区间左为1右为n。如果数列和为0那么找一个点前面的和不为0且后面的和也不为0,直接输出这两个区间。
int a[N],sum[N];
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(sum,0,sizeof(sum));
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
}
if(sum[n])
{
printf("YES\n");
printf("1\n1 %d\n",n);
}
else
{
int x=0;
for(int i=1;i<n;i++)
{
if(sum[i]&&(sum[n]-sum[i])!=0)
{
x=i;
break;
}
}
if(x)
{
printf("YES\n");
if(x!=n) printf("2\n");
else printf("1\n");
printf("1 %d\n",x);
if(x<n) printf("%d %d\n",x+1,n);
}
else printf("NO\n");
}
}
return 0;
}
B. Ilya and tic-tac-toe game
暴力或者搜索都行。(0:45)
题意:在4*4的棋盘上下三子棋, 只要有三个连续的就算赢。现在轮到Ilya下子了,Ilya的棋子是x。问只下一步是否能赢。
思路:所有的情况貌似也不多,全部特判就行,不过要蛮细心的。
string str[5];
int judge(int i,int j)
{
if((i-1)>=0&&str[i-1][j]=='x'&&(i-2)>=0&&str[i-2][j]=='x') return 1;
if((i-1)>=0&&str[i-1][j]=='x'&&(i+1)<4&&str[i+1][j]=='x') return 1;
if((i+1)<4&&str[i+1][j]=='x'&&(i+2)<4&&str[i+2][j]=='x') return 1;
// printf("1\n"); if((j-1)>=0&&str[i][j-1]=='x'&&(j+1)<4&&str[i][j+1]=='x') return 1;
if((j-1)>=0&&str[i][j-1]=='x'&&(j-2)>=0&&str[i][j-2]=='x') return 1;
if((j+1)<4&&str[i][j+1]=='x'&&(j+2)<4&&str[i][j+2]=='x') return 1;
//printf("2\n"); if(i+1<4&&i-1>=0&&j-1>=0&&j+1<4&&str[i-1][j-1]==str[i+1][j+1]&&str[i-1][j-1]=='x') return 1;
if(i+1<4&&i-1>=0&&j-1>=0&&j+1<4&&str[i+1][j-1]==str[i-1][j+1]&&str[i+1][j-1]=='x') return 1;
//printf("3\n"); if(i-2>=0)
{
if(j-2>=0)
{
if(str[i-1][j-1]=='x'&&str[i-2][j-2]=='x') return 1;
}
if(j+2<4)
{
if(str[i-1][j+1]=='x'&&str[i-2][j+2]=='x') return 1;
}
}
if(i+2<4)
{
if(j+2<4)
{
if(str[i+1][j+1]=='x'&&str[i+2][j+2]=='x') return 1;
}
if(j-2>=0)
{
if(str[i+1][j-1]=='x'&&str[i+2][j-2]=='x') return 1;
}
}
// printf("4\n");
return 0;
}
void fun()
{
int f=1;
for(int i=0;i<4&&f;i++)
for(int j=0;j<4&&f;j++)
if(str[i][j]=='.'&&judge(i,j)) f=0;
if(!f) printf("YES\n");
else printf("NO\n"); }
int main()
{
for(int i=0;i<4;i++)
cin>>str[i];
fun();
return 0;
}
D. Fedor and coupons
唉,好气啊,一个半小时A不出这道题。
题意:有n种优惠券,每种有一个优惠区间,也即是说编号在l到r的商品可以受到优惠。现在要你挑出k种优惠券,使得都能用这k种优惠券的商品数量越多越好。商品都是独一无二的。
思路:就是k个区间求交集最大范围。所有区间按左端点从小到大排序,然后用优先队列维护右端点最小值。满足k个区间并且两端点差值最大即可。
被尺取法误导了一下,以为用RMQ求【i,i+k】区间的右端点最小值然后得出差值最大,一直WA在第5组。比完赛才知道用优先队列维护。
struct node
{
ll l,r;
int i;
} a[N];
int n,k;
int cmp(node a,node b)
{
return a.l<b.l;
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
for(int i=1; i<=n; i++)
{
scanf("%I64d%I64d",&a[i].l,&a[i].r);
a[i].i=i;
}
sort(a+1,a+n+1,cmp);
ll ma=0,r=0,l=0;
priority_queue<ll,vector<ll>,greater<ll> >que;//最小值优先;
for(int i=1; i<=n; i++)
{
que.push(a[i].r);
int siz=(int)que.size();
if(siz>k) que.pop();
ll len=que.top()-a[i].l+1;
// printf("%I64d %I64d %I64d\n",a[i].l,que.top(),len);
if(siz>=k&&len>ma)
{
l=a[i].l;
r=que.top();
ma=len;
}
}
printf("%I64d\n",ma);
if(ma)
{
for(int i=1; i<=n&&k; i++)
{
if(a[i].l<=l&&a[i].r>=r)
{
printf("%d ",a[i].i);
k--;
}
}
}
else
{
for(int i=1; i<=k; i++)
printf("%d ",i);
}
printf("\n");
}
return 0;
}
Codeforces Round #390 (Div. 2) A+B+D!的更多相关文章
- Codeforces Round #390 (Div. 2) D. Fedor and coupons(区间最大交集+优先队列)
http://codeforces.com/contest/754/problem/D 题意: 给定几组区间,找k组区间,使得它们的公共交集最大. 思路: 在k组区间中,它们的公共交集=k组区间中右端 ...
- Codeforces Round #390 (Div. 2) C. Vladik and chat(dp)
http://codeforces.com/contest/754/problem/C C. Vladik and chat time limit per test 2 seconds memory ...
- Codeforces Round #390 (Div. 2) A. Lesha and array splitting
http://codeforces.com/contest/754/problem/A 题意: 给出一串序列,现在要把这串序列分成多个序列,使得每一个序列的sum都不为0. 思路: 先统计一下不为0的 ...
- Codeforces Round #390 (Div. 2)
时隔一个月重返coding…… 期末复习了一个月也不亏 倒是都过了…… 就是计组61有点亏 复变68也太低了 其他都还好…… 假期做的第一场cf 三道题 还可以…… 最后room第三 standing ...
- Codeforces Round #390 (Div. 2) E(bitset优化)
题意就是一个给出2个字符矩阵,然后进行匹配,输出每个位置的匹配的结果 (超出的部分循环处理) 一种做法是使用fft,比较难写,所以没有写 这里使用一个暴力的做法,考虑到一共只出现26个字符 所以使用一 ...
- Codeforces Round #390 (Div. 2) A B C D
这是一场比较难的div2 ... 比赛的时候只出了AB A很有意思 给出n个数 要求随意的把相邻的数合并成任意多数 最后没有为0的数 输出合并区间个数与区间 可以想到0可以合到任何数上并不改变该数的性 ...
- Codeforces Round #390 (Div. 2) D
All our characters have hobbies. The same is true for Fedor. He enjoys shopping in the neighboring s ...
- Codeforces Round #390 (Div. 2) B
Ilya is an experienced player in tic-tac-toe on the 4 × 4 field. He always starts and plays with Xs. ...
- Codeforces Round #390 (Div. 2) A
One spring day on his way to university Lesha found an array A. Lesha likes to split arrays into sev ...
随机推荐
- tomcat启动时自动运行代码
原文链接:http://jingpin.jikexueyuan.com/article/49660.html 作者: 一直向北 发布时间:2015-07-13 11:12:13 方法1:tomcat ...
- IE6常见CSS解析Bug和hack
第一:图片间隙 a:div中的图片间隙: 描述:在div中插入图片时,图片会将div下方撑大3像素 hack1:将<div>和<img>写在一行 hack2:将<img& ...
- dos命令-环境变量-数据类型-命名规范
JAVA第一天笔记--dos命令-环境变量-数据类型-命名规范 1.能够阐述JDK和JRE之间区别 JDK(Java Development Kit)是提供给开发人员使用的JAVA开发工具包(java ...
- iOS上线check_list
iOS 上线前 check_list 类型 序号 检查项 结果(pass/no) 安装 卸载 1 非越狱环境下的安装.卸载 2 越狱环境下的安装.卸载 3 安装文件检查,无泄漏用户信息的隐患 4 卸载 ...
- 洛谷 P2126 Mzc家中的男家丁
题目背景 mzc与djn的…还没有众人皆知,所以我们要来宣传一下. 题目描述 mzc家很有钱(开玩笑),他家有n个男家丁,现在mzc要将她们全都聚集起来(干什么就不知道了).现在知道mzc与男家丁们互 ...
- C语言指针系列 - 一级指针.一维数组,二级指针,二维数组,指针数组,数组指针,函数指针,指针函数
1. 数组名 C语言中的数组名是一个特殊的存在, 从本质上来讲, 数组名是一个地址, 我们可以打印一个指针的值,和打印一个数组的值来观察出这个本质: int nArray[10] ={ 0 }; in ...
- UVA 1661 Equation (后缀表达式,表达式树,模拟,实现)
题意:给出一个后缀表达式f(x),最多出现一次x,解方程f(x) = 0. 读取的时候用一个栈保存之前的结点,可以得到一颗二叉树,标记出现'X'的路径,先把没有出现'X'的子树算完,由于读取建树的时候 ...
- Vue和SuperSlide做轮播效果
使用这个插件做轮播需要的js应该知道,就是vue.js和jquery.SuperSlide.2.1.1.js 下载地址: vue:https://vuejs.org/js/vue.js 这里直接Ctr ...
- Codeforces Round #273 (Div. 2)-C. Table Decorations
http://codeforces.com/contest/478/problem/C C. Table Decorations time limit per test 1 second memory ...
- python之道05
1.写代码,有如下列表,按照要求实现每一个功能 li = ["alex", "WuSir", "ritian", "barry&q ...