标签:lan 存在 偶数 sub enc 差分 tps 维护 代码
题意:给我一个表达式 :\(x+2x+4x+8x+...+2^{k-1}=n,n<=1e9,k>=2\),给了我们n的值让我求是否存在 一个x值使上登山成立?
分析:我可以对公式进行一些变形:\(x=n/(1+2+4+..+2^{k-1})\),由于我们知道\(n<1e9\), 那2的31次就已经超过了1e9了,所以我们直接爆类枚举\(1+2+4+...+2^{k-1}\)的和,使两项相除结果为整数,这个整数就是我们要的ans
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
void fre() { freopen("A.txt","r",stdin); freopen("Ans.txt","w",stdout); }
#define ll long long
const int mxn = 105;
int n, k, m;
int main()
{
/* fre(); */
int t;
scanf("%d", &t);
while(t --)
{
ll n;
scanf("%lld", &n);
int k = 2;
int tmp = 2;
while(n%(2*tmp - 1))
{
tmp*= 2;
k ++;
}
printf("%lld\n", n/(2*tmp - 1));
}
return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
void fre() { freopen("A.txt","r",stdin); freopen("Ans.txt","w",stdout); }
#define ll long long
const int mxn = 105;
int n, k, m;
int main()
{
/* fre(); */
int t;
scanf("%d", &t);
while(t --)
{
int n;
scanf("%d", &n);
n/=2;
if(n%2)
printf("NO\n");
else
{
printf("YES\n");
int sum = 0;
for(int i = 1; i <= n; i ++)
{
sum += 2*i;
printf("%d ", 2*i);
}
int s = 0;
for(int i = 1; i <= n; i ++)
{
if(i != n)
{
printf("%d ", 2*i - 1);
s += 2*i - 1;
}
else
{
printf("%d\n", sum - s);
}
}
}
}
return 0;
}
题意:给我一个一个长度为n的序列ar,其元素值有正有负,让我从ar中找出一个字序列br,而br中相邻的元素符号不同,问在这个我们能在ar中能找到的最长序列br的基础上,br中所有的元素和的值最大是多少?
代码:这一题让我求的最大和是建立在 br最长的基础上
,那我们就可就要保证对于连续相同的符号的数字我们只保留最大的那个,这样我们就能构造出来最长br,并且br 元素和也是最大的
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
void fre() { freopen("A.txt","r",stdin); freopen("Ans.txt","w",stdout); }
#define ll long long
#define INF 0x3f3f3f3f
const int mxn = 2e5 + 10;
int n, k, m;
ll ar[mxn];
int main()
{
/* fre(); */
int t;
scanf("%d", &t);
while(t --)
{
int n;
scanf("%d", &n);
ll tmp;
int par = 1;
ar[1] = 0;
for(int i = 1; i <= n; i ++)
{
scanf("%lld", &tmp);
if(ar[par] >= 0 && tmp > ar[par])
ar[par] = tmp;
else if(ar[par] >= 0 && tmp < 0)
ar[++ par] = tmp;
else if(ar[par] < 0 && tmp < 0 && tmp > ar[par])
ar[par] = tmp;
else if(ar[par] < 0 && tmp >= 0)
ar[++ par] = tmp;
}
ll sum = 0;
for(int i = 1; i <= par; i ++)
sum += ar[i];
printf("%lld\n", sum);
}
return 0;
}
Codeforces Round #636 (Div. 3)(A~E)
标签:lan 存在 偶数 sub enc 差分 tps 维护 代码
原文地址:https://www.cnblogs.com/lql-nyist/p/12774375.html