您的位置:首页 > 大数据 > 人工智能

2015 ACM/ICPC Asia Regional Shanghai Online

2015-09-27 20:04 483 查看
1008 An easy problem

解题思路:一颗线段树单点更新后求乘积。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<ctime>
#define LL long long
#define db double
#define EPS 1e-15
#define inf 1e16
#define pa pair<int,int>

using namespace std;

const int maxn=155555;
LL sum[maxn*4+4];
int add;
int a[maxn];
int L,R;
int MOD;
int p;
void pushup(int rt){
sum[rt]=sum[rt<<1]*sum[rt<<1|1]%MOD;
}
void build(int l,int r,int x){
if (l==r){
sum[x]=1;
return ;
}
int m=(l+r)>>1;
build(l,m,x<<1);
build(m+1,r,x<<1|1);
pushup(x);
}
void update(int l,int r,int x){
if (l==r){
sum[x]=add;
return ;
}
int mid=(l+r)>>1;
if (p<=mid) update(l,mid,x<<1);
else update(mid+1,r,x<<1|1);
pushup(x);
}
LL query(int l,int r,int x){
LL ret=1;
if (L<=l && r<=R) return sum[x];
int mid=(l+r)>>1;
if (L<=mid) ret*=query(l,mid,x<<1)%MOD;
if (R>mid) ret*=query(mid+1,r,x<<1|1)%MOD;
return ret%MOD;
}
int main(){
int T,o=0;
scanf("%d",&T);
while (T--){
int q;
printf("Case #%d:\n",++o);
scanf("%d%d",&q,&MOD);
build(1,q,1);
for (int i=1;i<=q;i++){
int op,u;
scanf("%d%d",&op,&u);
if (op==1){
p=i; add=u;
update(1,q,1);
L=1,R=i;
printf("%I64d\n",query(1,q,1)%MOD);
}
else {
p=u; add=1;
update(1,q,1);
L=1; R=i;
printf("%I64d\n",query(1,q,1)%MOD);
}
}
}
return 0;
}


1009 Explore Track of Point

解题思路:依靠脑洞我们可以得出这个轨迹是一条过等腰三角形内心和两个底点的弧,然后利用初中几何知识计算即可。

证明见此处 http://blog.csdn.net/Baileys0530/article/details/48753151
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<ctime>
#define LL long long
#define db double
#define EPS 1e-15
#define inf 1e16
#define pa pair<int,int>

using namespace std;

struct node{
db x,y;
}A,B,C,M;
db dis(node a,node b){
return sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2));
}
int main(){
int T,o=0;
scanf("%d",&T);
while (T--){
scanf("%lf%lf%lf%lf%lf%lf", &A.x, &A.y, &B.x, &B.y, &C.x, &C.y);
M.x=(B.x+C.x)/2, M.y=(B.y+C.y)/2;
db a=dis(B,C)/2, b=dis(A,B), h=dis(A,M);
db r=a*h/(a+b);
db R=(a*a-r*r)/r/2+r;
db ans=(2*R)*asin(a/R);
ans+=h;
printf("Case #%d: %.4f\n",++o,ans);
}
return 0;
}


1010 A Sweet Journey

解题思路:对每一段遇到沼泽之前积累的体力值和走过沼泽浪费的体力值,如果小于0则提前积累出相应的体力,对每段都这样计算。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<ctime>
#define LL long long
#define db double
#define EPS 1e-1
#define inf 1e16
#define pa pair<int,int>

using namespace std;
#define maxn 100010
int l[maxn],r[maxn];
int main(){
int T,jj=1;
scanf("%d",&T);
while (T--){
int n,A,B,L;
scanf("%d%d%d%d",&n,&A,&B,&L);
memset(l,0,sizeof(l));
memset(r,0,sizeof(r));
for (int i=1;i<=n;i++){
scanf("%d%d",&l[i],&r[i]);
}
int ans=0,res=0;
ans+=(l[1]-0)*B-(r[1]-l[1])*A;
if(ans<0) res+=fabs(ans),ans=0;
for(int i=2;i<=n;i++){
ans+=(l[i]-r[i-1])*B-(r[i]-l[i])*A;
if(ans<0) res+=fabs(ans),ans=0;
}
printf("Case #%d: %d\n",jj++,res);
}
}


1011 Can you find it

给定 C,k1, b1, k2 找出所有的(a, b)满足 ak1⋅n+b1+ bk2⋅n−k2+1 =
0 (mod C)(n = 1, 2, 3, ...) (1<=a, b <C)。

解题思路:把n取1和2,得到两个式子,上下除一除,猜一猜,得到b^(k2)
= a^(k1),验证即可。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<ctime>
#define LL long long
#define db double
#define EPS 1e-1
#define inf 1e16
#define pa pair<int,int>

using namespace std;

LL pow_mod(int a,int n,int mod){
if (n==0) return 1;
LL x=pow_mod(a,n/2,mod);
LL ans=(LL)x*x%mod;
if (n%2==1) ans=ans*a%mod;
return ans;
}
int main(){
int b1,k1,k2,mod;
int cas=1;
while (scanf("%d%d%d%d",&mod,&k1,&b1,&k2)!=EOF){
printf("Case #%d:\n",cas++);
bool flag=false;
for (int i=1;i<mod;i++){
LL tmp=pow_mod(i,k1+b1,mod);
int b=mod-tmp;
LL tta=pow_mod(i,k1,mod);
LL ttb=pow_mod(b,k2,mod);
if (tta==ttb){
flag=true;
printf("%d %d\n",i,b);
}
}
if (!flag) printf("-1\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: