Codeforces Round #626 (Div. 2, based on Moscow Open Olympiad in Informatics)

A. Even Subset Sum Problem

题意

给出一串数,找到其中的一些数使得他们的和为偶数

题解

水题,找到一个偶数或者两个奇数就好了

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#define def 110
using namespace std; long a[def]; int main()
{ long _,ans0,ans1,ans2,n,i;
for(scanf("%ld",&_);_;_--){
scanf("%ld",&n);
ans0=ans1=ans2=-1;
for(i=1;i<=n;i++){
scanf("%ld",&a[i]);
if(a[i]%2==0)
ans0=i;
else if(ans1==-1)
ans1=i;
else ans2=i;
}
if(ans0==-1&&(ans1==-1||ans2==-1))
printf("-1\n");
else if(ans0!=-1)
printf("1\n%ld\n",ans0);
else
printf("2\n%ld %ld\n",ans1,ans2);
}
return 0;
}

B. Count Subrectangles

题意

给出\(a\)和\(b\)两个数列,构造一个矩阵\(c\),使得\(c_{i,j}=a_i*b_j\),求矩阵\(c\)中有多少个面积为\(k\)的小矩阵里的值全为1

题解

根据矩阵\(c\)的构造原理可知,每一行相邻元素的连续性由\(b\)决定,每一列的连续性由\(a\)决定,所以可以分别记录下到每个位置到上一个0的长度\(lena\)和\(lenb\),那么当前点为顶点能构成的最大矩阵就是\(lena*lenb\),最后枚举一下小矩阵的边长就好了

代码

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<set>
#define ll long long
#define lowbit(i) ((i)&-(i))
#define def 40010
using namespace std; ll sum[def],a[def],b[def];
set<ll>st; void add(long x,long y)//用树状数组加速在b中的查询
{
for(;x<def;x+=lowbit(x))
sum[x]+=y;
} ll query(long x)
{ long ans=0;
for(;x;x-=lowbit(x))
ans+=sum[x];
return ans;
} int main()
{ ll n,m,i,j;
ll ans=0,k;
scanf("%lld%lld%lld",&n,&m,&k);
for(i=1;i<=sqrt(k);i++)
if(k%i==0){
st.insert(i);
st.insert(k/i);
}
for(i=1;i<=n;i++){
scanf("%lld",&a[i]);
if(a[i])
a[i]+=a[i-1];
}
for(i=1;i<=m;i++){
scanf("%lld",&b[i]);
if(b[i]){
b[i]+=b[i-1];
add(b[i],1);
}
}
for(i=1;i<=n;i++)
if(a[i]){
for(auto q:st)
if(a[i]>=k/q&&q<=m)
ans+=query(m)-query(q-1);
}
printf("%lld\n",ans);
return 0;
}

C. Unusual Competitions

题意

给定一个括号序列,每次可以选择一个区间\([l,r]\)来重排,耗时\(r-l+1\),求最少需要多少时间使其变得正常(左右括号完全匹配)

题解

因为时间只跟区间长度有关,跟内容无关,故只要找到不正常的区间来重排就好了

对于一个\(num['(']==num[')']\)的区间,如果其中存在一个点,在这个点上\(num['(']<num[')']\),那么这个区间就是一个不正常的区间

枚举一遍,O(n)解决

代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; int main()
{ long long n,i,num=0,ans=0,l=0;
bool t=false;
string s;
cin>>n>>s;
for(i=0;i<n;i++){
if(s[i]=='(')
num++;
else
num--;
if(num<0)t=true;
if(!num){
if(t)
ans+=i-l+1;
l=i+1;
t=false;
}
}
if(num)
printf("-1\n");
else
printf("%lld\n",ans);
return 0;
}

最新文章

  1. 使用Html5+C#+微信 开发移动端游戏详细教程 :(三)使用html5引擎搭建游戏框架
  2. C#连接mysql数据库插入数据后获取自增长主键ID值
  3. Python socket模拟HTTP请求
  4. android数据库(随apk一起发布数据库)
  5. java_list&lt;String&gt; string[]拼接json
  6. TimePicker控件、帧动画、补间动画
  7. c# 硬件开源神器netduino的开发中慎用Cpu.Pin
  8. velocity的宏
  9. ServletConfig使用
  10. 给自己的QQ群开启腾讯官方的群聊机器人
  11. *更新*无需root,一条命令强制全屏模式
  12. BZOJ_4378_[POI2015]Logistyka_树状数组
  13. 让 CDN 更省流量的 Brotli 算法详解
  14. 11G新特性 -- flashback data archive(1)
  15. VMware vSphere 创建虚拟机步骤及三种磁盘规格
  16. bzoj 4568: [Scoi2016]幸运数字
  17. HDU 3790 最短路径问题 (最短路)
  18. 【分库分表】sharding-jdbc—解决的问题
  19. Eclipse如何设置编译文件.class输出路径
  20. 【转】C# 视频监控系列(13):H264播放器——控制播放和截图

热门文章

  1. maven中 pom 文件各个标签的作用
  2. 使用lambda表达式优雅你的事务代码
  3. DOCKER中centos7的中文支持
  4. sql语句查询成绩表各科前三名
  5. web中间件之nginx
  6. 【React.js小书】动手实现 React-redux(五):Provider - 方志
  7. IO流框架
  8. Word目录生成
  9. iOS中如何实现准确的倒计时程序 &middot; 九十里
  10. react router为什么推荐使用browserHistory而不推荐hashHistory?