1001 Answers
一道超简单的题,可是我们并没有看出Ci不大于2的深意。。。原来Ci中只要有1,而且Mi不是太SB为负数就行。。。而如果没有1,只要判奇偶就行了。
#include
#include
#include
#include
#include
#include
#include
#include
#define mem(a,b) memset(a,b,sizeof(a))
#define FOR(a,b,i) for(i=a;i<=b;++i)
#define For(a,b,i) for(i=a;i'9');
ret=c-'0';
while((c=getchar())>='0'&&c<='9')
{
ret=ret*10+(c-'0');
}
}
inline void OT(int a)
{
if(a>=10)
{
OT(a/10);
}
putchar(a%10+'0');
}
int t[100001],c[100001];
int main()
{
int n,q,m,i;
bool flag;
while(scanf("%d%d",&n,&q)!=EOF)
{
flag=false;
For(0,n,i)
{
RD(t[i]);
}
For(0,n,i)
{
RD(c[i]);
if(c[i]==1)
{
flag=true;
}
}
while(q--)
{
scanf("%d",&m);
if(m<=0)
{
printf("NO\n");
}
else if(flag==true)
{
printf("YES\n");
}
else if(m%2==1)
{
printf("NO\n");
}
else if(m%2==0)
{
printf("YES\n");
}
}
}
return 0;
}
一上来看的就是这题,K神说是Splay树就交给他了。。结果最后也没出来,,,看solution吐血。。。一个栈搞定,,一定要这样吗!!!
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define mem(a,b) memset(a,b,sizeof(a))
#define FOR(a,b,i) for(i=a;i<=b;++i)
#define For(a,b,i) for(i=a;i'9');
ret=c-'0';
while((c=getchar())>='0'&&c<='9')
{
ret=ret*10+(c-'0');
}
}
inline void OT(int a)
{
if(a>=10)
{
OT(a/10);
}
putchar(a%10+'0');
}
stack q1,q2;
int a[1000001],sum;
void init()//初始化,清空栈
{
while(!q1.empty())
{
q1.pop();
}
while(!q2.empty())
{
q2.pop();
}
}
void Add(int k)//加入操作
{
q1.push(k);
sum+=k;
int m=q1.size();
a[m]=max(a[m-1],sum);
}
bool Delete(int &k)//删除操作
{
if(q1.empty())
{
return false;
}
k=q1.top();
q1.pop();
sum-=k;
return true;
}
int main()
{
int n,i,j,k;
char str[2];
a[0]=-100000000000;
while(scanf("%d",&n)!=EOF)
{
init();
sum=0;
while(n--)
{
scanf("%s",str);
if(str[0]=='I')
{
scanf("%d",&k);
Add(k);
}
else if(str[0]=='D')
{
Delete(k);
}
else if(str[0]=='L')
{
if(Delete(k))
{
q2.push(k);
}
}
else if(str[0]=='R')//用栈的操作直接模拟出光标的状态
{
if(q2.empty())
{
continue;
}
k=q2.top();
q2.pop();
Add(k);
}
else if(str[0]=='Q')//最后询问也只要直接输出就行了
{
scanf("%d",&k);
printf("%d\n",a[k]);
}
}
}
return 0;
}
博弈,大家要有限制地取,所以si + min(max(-sj,A + B - s1 - m(j) + 1) : j > i)。。知道这个就行了
#include
#include
#include
#include
#include
#include
#include
#include
#define mem(a,b) memset(a,b,sizeof(a))
#define FOR(a,b,i) for(i=a;i<=b;++i)
#define For(a,b,i) for(i=a;i'9');
ret=c-'0';
while((c=getchar())>='0'&&c<='9')
{
ret=ret*10+(c-'0');
}
}
inline void OT(int a)
{
if(a>=10)
{
OT(a/10);
}
putchar(a%10+'0');
}
int c[1000001];
long long s[1000001];
int main()
{
int n,a,b,i;
long long m,si,zero=0;
while(scanf("%d%d%d",&n,&a,&b)!=EOF)
{
for(i=0; i=0; i--)
{
s[i]=s[i+1]+c[i];
}
m=c[n-1];
si=min(zero,max(-s[n-1],-s[0]+a+b-m+1));
for(i=n-2; i>=0; i--)
{
m=s[i]+si;
si=min(si,max(-s[i],-s[0]+a+b-m+1));
}
if(a>=m)
{
printf("ALICE\n");
}
else
{
printf("BOB\n");
}
}
return 0;
}
一条公式题。。运用费马小定理解决2^(n-1)。。。难点在于n=10^100000。。。所以需要用字符串输入处理加上预处理。
#include
#include
#include
#include
#include
#include
#include
#include
#define mem(a,b) memset(a,b,sizeof(a))
#define FOR(a,b,i) for(i=a;i<=b;++i)
#define For(a,b,i) for(i=a;i'9');
ret=c-'0';
while((c=getchar())>='0'&&c<='9')
{
ret=ret*10+(c-'0');
}
}
inline void OT(int a)
{
if(a>=10)
{
OT(a/10);
}
putchar(a%10+'0');
}
char str[100001];
long long tmp[100001];
__int64 pw(__int64 x,__int64 y)//快速幂取模
{
__int64 res=1;
x=x%N;
while(y>0)
{
if(y%2==1)
{
res=(res*x)%N;
}
x=(x*x)%N;
y/=2;
}
return res%N;
}
void f()
{
int i;
tmp[0]=2;
for(i=1;i<100001;i++)
{
tmp[i]=pw(tmp[i-1],10);
}
}
void g(int l)
{
int i=l-1;
while(i>=0&&str[i]=='0')
{
str[i]='9';
i--;
}
str[i]-=1;
}
int main()
{
f();
int i,l;
__int64 sum;
while(scanf("%s",str)!=EOF)
{
l=strlen(str);
g(l);
sum=1;
for(i=l-1;i>=0;i--)
{
sum=(sum*pw(tmp[l-i-1],str[i]-'0'))%N;//费马小定理的运用
}
printf("%I64d\n",sum);
}
return 0;
}
喜闻乐见,不喜勿喷~