传送门


A. Maxim and Biology

  题意:

    给出一个串s,问最少需要多少步操作使得串s包含"ACTG"这个子串,输出最少操作次数;

  题解:

    枚举每个位置 i,求出将 i,i+1,i+2,i+3 变为 "ACTG" 所需的最少操作次数即可;

AC代码:

 #include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a)) int n;
char s[]; int Step(char x1,char x2)//求解x1变为x2所需的最少操作步骤
{
if(x1 <= x2)
return min(x2-x1,x1-'A'+'Z'-x2+);
else
return min(x1-x2,'Z'-x1+x2-'A'+);
}
//求解以index位置开始使得其连续的四个字符变为"ACTG"所需的最小操作步骤
int F(int index)
{
int ans=;
ans += Step(s[index],'A');
ans += Step(s[index+],'C');
ans += Step(s[index+],'T');
ans += Step(s[index+],'G');
return ans;
}
int Solve()
{
int ans=INF;
int len=strlen(s);
for(int i=;i+ <= len;++i)
ans=min(ans,F(i));
return ans;
}
int main()
{
// freopen("C:\\Users\\hyacinthLJP\\Desktop\\in&&out\\contest","r",stdin);
while(~scanf("%d",&n))
{
scanf("%s",s);
printf("%d\n",Solve());
}
return ;
}

B. Dima and a Bad XOR

  题意:

    给出一个 n*m 的矩阵a[][],每一行任选一个元素,判断选出的这 n 个元素的异或和是否大于0;

    如果存在大于0的选法,输出 "TAK" ,并且输出每一行选择的元素的列标;

    如果不存在,输出 "NIE";

  题解:

    令 ans = a[1][1]^a[2][1]^........^a[n][1];

    ①ans > 0 : 输出 n 个 1

    ②ans == 0 : 判断是否可以将a[1][1] 或 a[2][1] 或 ..... 或 a[n][1] 变成同一行的其他元素;

            如果可以,输出 "TAK",并将任意一个a[ i ][1]变为同行中的其他元素;

          反之,输出"NIE";

AC代码:

 #include<bits/stdc++.h>
using namespace std; int n,m;
int a[][];
int tmp[]; bool isSat()//判断是否存在去重后的元素个数 > 1 的行
{
for(int i=;i <= n;++i)
{
/**
如果想要从tmp[1]位置作为起始位置,第一个参数为tmp+1
a[i]数组第一个位置的下标为a[i][1],所以第二个参数为a[i]+1
第三个参数不是指数组个数,而是指要复制的数据的总字节数长度
*/
memcpy(tmp+,a[i]+,m*sizeof(int));//将a[i]数组拷贝给tmp数组
sort(tmp+,tmp+m+);
int t=unique(tmp+,tmp+m+)-tmp;//去重
t--;
if(t > )
return true;
}
return false;
}
void Solve()
{
int ans=;
for(int i=;i <= n;++i)
ans ^= a[i][]; if(ans != || ans == && isSat())
{
printf("TAK\n");
bool flag=(ans != );//如果ans != 0,输出n个1
for(int i=;i <= n;++i)
{
if(!flag)
{
for(int j=;j <= m;++j)
if(a[i][j] != a[i][])
{
flag=true;//如果ans=0,找到第一个相异与a[i][1]的元素的列标即可
printf("%d ",j);
break;//记得break,不然,printf("%d ",j) 可能会调用多次
}
if(!flag)
printf("1 ");
}
else
printf("1 ");
}
printf("\n");
}
else
printf("NIE\n");
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=;i <= n;++i)
for(int j=;j <= m;++j)
scanf("%d",a[i]+j);
Solve();
}
return ;
}

 


C. Problem for Nazar

  题意:

    给定奇数集和偶数集;

    现构造一个数组:

    先取奇数集中 20 个元素1,再取偶数集中 21 个元素2,4;

    再取奇数集中 22素 {3,5,7,9},再取偶数集中 23 个元素 {6,8,10……};

    ............

    得到  {1,2,4,3,5,7,9,6,8,10,12……} ;

    问这个数组的某一区间 [l,r] 的区间和是多少,并对1e9+7取模。

  思路一:

    分别求出区间[l,r]对应的 {oddS,oddE},{evenS,evenE}

    oddS:区间[l,r]的第一个奇数

    oddE:区间[l,r]的最后一个奇数

    evenS,evenE同理;

    

    (oddSum:{oddS,....,oddE}之间的奇数个数,evenSum同理)

    最后输出ans%mod即可;

AC代码:

 #include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mod=1e9+; ll l,r; ll fOdd(int x)///找2^x个连续的奇数开始的奇数
{
ll tot=((1ll*<<x)-)/;
return +(tot<<);
}
ll fEven(int x)///找2^x个连续的偶数开始的偶数
{
ll tot=((1ll*<<x)-)/;
return +(tot<<);
}
ll quickPower(ll _a,ll _b,ll _mod)
{
ll ans=;
while(_b)
{
if(_b&)
ans=ans*_a%mod;
_a=(_a*_a)%mod;
_b >>= ;
}
return ans;
}
ll Solve()
{
int x,y;
for(x=;(1ll*<<(x+))- < l;++x);///包含l的最大的x
for(y=;(1ll*<<(y+))- < r;++y);///包含r的最大的y ll oddS=!(x&)/**判断x是否为偶数*/ ? fOdd(x)+(l-(1ll*<<x))*:fOdd(x+);
ll evenS=(x&)/**判断x是否为奇数*/ ? fEven(x)+(l-(1ll*<<x))*:fEven(x+); ll oddE=!(y&) ? fOdd(y)+(r-(1ll*<<y))*:fOdd(y+)-;
ll evenE=(y&) ? fEven(y)+(r-(1ll*<<y))*:fEven(y+)-; ll ans=;
if(oddE >= oddS)
{
ll n=((oddE-oddS)>>)+;
ll d=oddE+oddS;
///被除数2可以将其约掉(d肯定为偶数)
///也可以用逆元进行除法取模
///我用的是逆元除法取模(有点麻烦)
ans += ((n%mod)*(d%mod)%mod)*(quickPower(,mod-,mod))%mod;
}
if(evenE >= evenS)
{
ll n=((evenE-evenS)>>)+;
ll d=evenE+evenS;
ans += ((n%mod)*(d%mod)%mod)*(quickPower(,mod-,mod))%mod;
}
return ans%mod;
}
int main()
{
// freopen("C:\\Users\\hyacinthLJP\\Desktop\\in&&out\\contest","r",stdin);
scanf("%lld%lld",&l,&r);
printf("%lld\n",Solve());
return ;
}

 思路二:

    前 i 个偶数的和为 i*(i+1)

    前 i 个奇数的和为 i*i

    求解出前 r 个奇数,偶数个数,求出答案

    求解出前 l-1 个奇数,偶数个数,求出答案,两者做差便是最终答案

AC代码:

 #include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mod=1e9+; ll l,r; ll Solve(ll x)///分别求解出[1,x]中奇数个数,偶数个数
{
ll oddSum=;
ll evenSum=;
for(int i=;;i++)
{
if((1ll*<<(i+))- >= x)///包含x的最大的2^i
{
if(i&)
evenSum += (x-(1ll*<<i)+)%mod;
else
oddSum += (x-(1ll*<<i)+)%mod;
break;
}
if(i&)
evenSum += (1ll*<<i)%mod;
else
oddSum += (1ll*<<i)%mod;
evenSum %= mod;
oddSum %= mod;
}
///[1,x]的区间和
return (evenSum%mod*(evenSum+)%mod%mod+oddSum%mod*(oddSum%mod)%mod)%mod;
}
int main()
{
// freopen("C:\\Users\\hyacinthLJP\\Desktop\\in&&out\\contest","r",stdin);
scanf("%lld%lld",&l,&r); ///注意,取模做减法有可能变成负值,需要再加个mod,再模一次mod
printf("%lld\n",(Solve(r)-Solve(l-)+mod)%mod); return ;
}

Codeforces Round #553 (Div. 2)的更多相关文章

  1. Codeforces Round #553 (Div. 2) D题

    题目网址:http://codeforces.com/contest/1151/problem/D 题目大意:给出n组数对,(ai , bi),调整这n组数对的位置,最小化 ∑(ai*( i -1)+ ...

  2. Codeforces Round #553 (Div. 2) C题

    题目网址:http://codeforces.com/contest/1151/problem/C 题目大意:给定奇数集和偶数集,现构造一个数组,先取奇数集中一个元素1,再取偶数集二个元素2,4,再取 ...

  3. Codeforces Round #553 (Div. 2) B题

    题目网址:http://codeforces.com/contest/1151/problem/B 题目大意:给定一个n*m的矩阵,问是否可以从每一行中选择一个数,使得这n个数异或大于0,如果可以还要 ...

  4. Codeforces Round #553 (Div. 2) A题

    题目网址:http://codeforces.com/contest/1151/problem/A 题目大意:给定一个由大写字母构成的字符串和它的长度,有这样的操作,使任意一个字母变成与其相邻的字母, ...

  5. Codeforces Round #553 (Div. 2) C

    C. Problem for Nazar time limit per test 1 second memory limit per test 256 megabytes input standard ...

  6. Codeforces Round #553 (Div. 2) E 贡献

    https://codeforces.com/contest/1151/problem/E 题意 一条长n的链,每个点上有值\(a[i]\),定义\(f(l,r)\)为该区间的\(值\)所代表的点留下 ...

  7. Codeforces Round #553 (Div. 2) C 等差数列求和 + 前缀和

    https://codeforces.com/contest/1151/problem/C 题意 有两个等差数列(1,3,5,..),(2,4,6,...),两个数列轮流取1,2,4,...,\(2^ ...

  8. Codeforces Round #553 (Div. 2) C. Problem for Nazar 数学

    题意:从奇数列 1 3 5 7 9 ....  偶数列2 4 6 8 10...分别轮流取 1 2 4 ....2^n 个数构成新数列 求新数列的区间和 (就一次询问) 思路:首先单次区间和就是一个简 ...

  9. Codeforces Round #553 (Div. 2) D. Stas and the Queue at the Buffet 贪心+公式转化

    题意 给出n个pair (a,b) 把它放在线性序列上 1--n 上 使得  sum(a*(j-1)+b*(n-j))  最小 思路 :对式子进行合并 同类项 有:    j*(a-b)+  (-a+ ...

随机推荐

  1. 使用sqlyog或者navicat连接mysql提示1862错误解决

    mysql的bin目录下执行  mysqladmin -uroot -p password 依次输入旧密码.新密码.确认新密码 修改后重新使用sqlyog或navicat连接成功 问题解决!

  2. Tomcat开启SSL协议支持

    一.生成keyStore 要使用ssl connector,必须先创建一个keystore.他包含了服务器中被客户端用于验证服务器的数字证书.一旦客户端接受了这个证书,客户端就可以使用public k ...

  3. ubuntu16.04系统深度学习开发环境、常用软件环境(如vscode、wine QQ、 360wifi驱动(第三代暂无))搭建相关资料

    事后补充比较全面的(找对资料真的省一半功夫):https://www.jianshu.com/p/5b708817f5d8?from=groupmessage Ubuntu16.04 + 1080Ti ...

  4. VMware虚拟机系统无法使用桥接联网

    1.环境 VMware 14.1.1 虚拟系统:Windows Server 2008 32位 2.解决办法 打开虚拟网络编辑器 有红框中的提示出现时,就点击更改设置 点击桥接模式,在VMnet信息中 ...

  5. nginx内置变量总结

    nginx内置变量 2019-02-28 变量名称 变量用途 $atg_PARAMETER      客户端GET请求中   PARAMETER字段的值                        ...

  6. About Pull Strings 英语走后门议论文

    About pull strings Author : Pleiades_Antares 1. From ancient times to the present, the "going b ...

  7. 【笔记】Python集成开发环境——PyCharm 2018.3下载、注册、帮助文档

    [博客导航] [Python导航] 前言 使用好的开发环境将有效提高编程效率,在Python使用上我是小白,所以特意请教了从事语言处理的成同学,告知我,推荐使用Pycharm和IntelliJ. 目前 ...

  8. formatter的使用

    1.目的 如图所示,实现行编辑栏中的编辑删除,以及在时间建议中显示上中下旬 可参考easyui官方文档中所写的关于datagrid列属性:http://www.jeasyui.net/plugins/ ...

  9. Python简单的多线程demo:常用写法

    简单多线程实现:启动50个线程,并计算执行时间. import threading import time def run(n): time.sleep(3) print("task:&qu ...

  10. Netty(RPC高性能之道)原理剖析

    转载:http://blog.csdn.net/zhiguozhu/article/details/50517551 1,Netty简述 Netty 是一个基于 JAVA NIO 类库的异步通信框架, ...