A
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
using namespace std;
#define N 100000
#define LL long long
#define INF 0xfffffff
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>;
int n,m;
int main()
{
int n,m,i,j;
cin>>n>>m;
if(m>n)
cout<<n<<endl;
else
{
int o = ;
while(n)
{
n--;
o++;
if(o%m==) n++;
}
cout<<o<<endl;
}
return ;
}
B
枚举和值
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
using namespace std;
#define N 100000
#define LL long long
#define INF 0xfffffff
#define M 1000000000
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>;
int o[N];
int judge(LL x)
{
int ans = ;
while(x)
{
ans+=x%;
x/=;
}
return ans;
}
int main()
{
int a,b,c,i,j;
cin>>a>>b>>c;
int g = ;
for(i = ; i <= ; i++)
{
LL k = (LL)b*pow(i*1.0,a)+c;
if(judge(k)==i&&k>&&k<M)
o[++g] = k;
}
cout<<g<<endl;
if(g)
{ sort(o+,o+g+);
for(i = ; i < g ; i ++)
cout<<o[i]<<" ";
cout<<o[i]<<endl;
}
return ;
}
C
二分高度,之后用高度减去原有高度,就可以知道每株花被浇了多少水,用线段树维护一下就可以得到最少浇水的次数。
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
using namespace std;
#define N 100010
#define LL long long
#define INF 0xfffffff
#define M 1000200000
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>;
int a[N],o[N];
LL s[N<<];
int n,m,w;
void build(int l,int r,int w)
{
s[w] = ;
if(l==r)
{
s[w] = o[l];
return ;
}
int m = (l+r)>>;
build(l,m,w<<);
build(m+,r,w<<|);
}
void down(int w,int m)
{
if(s[w])
{
s[w<<] += s[w];
s[w<<|] += s[w];
s[w] = ;
}
}
void update(int a,int b,int d,int l,int r,int w)
{
if(a<=l&&b>=r)
{
s[w]+=d;
return ;
}
down(w,r-l+);
int m = (l+r)>>;
if(a<=m) update(a,b,d,l,m,w<<);
if(b>m) update(a,b,d,m+,r,w<<|);
}
LL query(int p,int l,int r,int w)
{
if(l==r)
return s[w];
down(w,r-l+);
int m = (l+r)>>;
if(p<=m) return query(p,l,m,w<<);
else return query(p,m+,r,w<<|);
}
int cal(int k)
{
int i,j;
for(i = ; i <= n; i++)
if(k>a[i]) o[i] = k-a[i];
else o[i] = ;
build(,n,);
LL num = ;
for(i = ; i <= n; i++)
{
int pp = query(i,,n,); if(pp>) {update(i,min(n,i+w-),-pp,,n,);num+=pp;} if(num>m) return ;
}
if(num<=m) return ;
return ;
}
int main()
{
int i,j;
cin>>n>>m>>w;
for(i = ; i <= n; i++)
scanf("%d",&a[i]);
int low = ,high = M,mid;
int ans = ;
while(low<=high)
{
mid = (low+high)>>;
if(cal(mid)==)
high = mid-;
else
{
low = mid+;
ans = max(ans,mid);
}
}
cout<<ans<<endl;
return ;
}
D
对于
k=1 ,ans = L。
连续偶奇异或是为1的 比如10 11 12 13等 ,而奇偶则是不一定的
k= 2, 如果l%2==0,ans = L^(L+1)=1 ,否则要根据R-L+1的取值决定
k= 4 ,如果L%2=0,ans = L^(L+1)^(L+2)^(L+3) = 0,否则如果R-L+1>4 也是为偶奇偶奇=0的,若R-L+1=4 就可转化为3的时候做。
k=3 ,有可能为1也有可能为0 ,假设L-R范围内的三个数x,y,z异或为0,x,y,z不同,就设x>y>z,那么x,y已确定,那么就是尽可能让z大,
比如
x 100110001111 那么y值的第一位一定为1,不然z就为1就不符合假设y>z了,因为y<x,所以之后遇到x为0的位,y,z也是为0的,一旦再遇到一位1,就可以把y置为0,z置为1,再之后z就可以一直为1,而y的变化可以依据x,z而定。
x 100110001111...1
y 100001110000...0
z 000111111111...1
这样z将获得<R的最大值,再与L相比较就可以知道结果了。
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
using namespace std;
#define N 100000
#define LL long long
#define INF 0xfffffff
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>;
LL a[];
int di[];
void judge(LL l,LL r)
{
LL x = r;
LL i;
int g = ;
while(x)
{
di[g++] = x%;
x/=;
}
LL y = ;
LL z = ;
int flag = ;
y+=((LL)<<(g-));
for(i = g- ; i >= ; i--)
{
if(di[i])
{
flag = ;
z += ((LL)<<i);
}
else if(flag)
{
z+=((LL)<<i);
y+=((LL)<<i);
}
}
if(z>=l)
{
cout<<"0\n";
cout<<"3\n";
cout<<r<<" "<<y<<" "<<z<<endl;
}
else
{
cout<<"1\n";
cout<<"2\n";
if(l%)
cout<<l+<<" "<<l+<<endl;
else
cout<<l<<" "<<l+<<endl;
}
}
int main()
{
LL l,r,i,k;
cin>>l>>r>>k;
if(r==l)
{
cout<<l<<endl;
cout<<"1\n";
cout<<l<<endl;
return ;
}
if(l%==)
{
if(r-l+==||k<=)
{
if(k==)
{
cout<<l<<endl;
cout<<"1\n";
cout<<l<<endl;
}
else
{
cout<<"1\n";
cout<<"2\n";
cout<<l<<" "<<l+<<endl;
}
}
else if(r-l+==||k==)
{
judge(l,r);
}
else
{
cout<<"0\n";
cout<<"4\n";
for(i = l ; i < l + ; i++)
cout<<i<<" ";
puts("");
}
}
else
{
if(r-l+==||k<=)
{
if(k==||(r-l+==&&(l^(l+))>l))
{
cout<<l<<endl;
cout<<"1\n";
cout<<l<<endl;
}
else
{
if(r-l+==)
{
cout<<(l^(l+))<<endl;
cout<<"2\n";
cout<<l<<" "<<l+<<endl;
}
else
{
cout<<"1\n";
cout<<"2\n";
cout<<l+<<" "<<l+<<endl;
}
}
}
else if(r-l+==||k==)
{
judge(l,r);
}
else if(r-l+==)
{
int flag = ;
judge(l,r);
}
else
{
cout<<"0\n";
cout<<"4\n";
for(i = l+ ; i < l+ ; i++)
cout<<i<<" ";
puts("");
} }
return ;
}