比賽總結
這次div1打得還是很慘,2個小時裏一直在wa A題,wa了七八次才ac,罰時太慘。。。
手速真的非常重要啊
A. Fight the Monster
題目鏈接
http://codeforces.com/contest/487/problem/A
題目大意
奧特曼打小怪獸,每局開始時,雙方都會掉血,各自掉
思路
剛開始我很sb地去寫了個二分,結果數據太硬,如果直接暴力枚舉奧特曼的三個參數的大小的話,要麼範圍枚舉小了會wa,要麼範圍枚舉大了又會TLE
其實沒必要二分,也沒必要把奧特曼的三個參數都枚舉,只需要枚舉
代碼
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#define INF 0x7fffffffffffffff
using namespace std;
typedef long long int LL;
LL HPy,ATKy,DEFy,HPm,ATKm,DEFm,h,a,d;
LL ans=INF;
inline void check()
{
for(LL aa=0;aa<=1000;aa++)
for(LL dd=0;dd<=1000;dd++)
{
LL hh;
ATKy+=aa;
DEFy+=dd;
LL lifey,lifem;
if(max((LL)0,ATKy-DEFm)==(LL)0)
{
ATKy-=aa;
DEFy-=dd;
continue;
}
else
{
lifem=HPm/max((LL)0,ATKy-DEFm);
if(HPm%max((LL)0,ATKy-DEFm)) lifem++;
}
if(max((LL)0,ATKm-DEFy)==(LL)0) hh=(LL)0;
else
{
lifey=1+lifem*max((LL)0,ATKm-DEFy);
if(HPy<lifey) hh=lifey-HPy;
else hh=0;
}
ATKy-=aa;
DEFy-=dd;
if(hh*h+aa*a+dd*d<ans) ans=hh*h+aa*a+dd*d;
}
}
int main()
{
scanf("%I64d%I64d%I64d%I64d%I64d%I64d%I64d%I64d%I64d",&HPy,&ATKy,&DEFy,&HPm,&ATKm,&DEFm,&h,&a,&d);
check();
printf("%I64d\n",ans);
return 0;
}
B. Strip
題目鏈接
http://codeforces.com/contest/487/problem/B
題目大意
給你一個序列
思路
膜用線段樹幹掉此題的各位大爺。。。
蒟蒻只會用set亂搞。。。
首先我們求出
然後我們再求出
代碼
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <set>
#define MAXN 110000
#define INF 0x3f3f3f3f
using namespace std;
//int maxv[MAXN<<2],minv[MAXN<<2];
int a[MAXN],n;
int f[MAXN],L[MAXN]; //L[i]=右端點爲i,左端點最遠劃分的位置
multiset<int>bst;
int main()
{
int l,s;
scanf("%d%d%d",&n,&s,&l);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int now=1;
for(int i=1;i<=n;i++)
{
while(!bst.empty()) //bst裏保存的是[now,i-1]裏的點
{
int minv=*bst.begin(),maxv=*(--bst.end()); //[now,i-1]裏的最大值和最小值
minv=min(minv,a[i]),maxv=max(maxv,a[i]);
if(maxv-minv<=s) break;
bst.erase(bst.lower_bound(a[now]));
now++;
}
L[i]=now;
bst.insert(a[i]);
}
bst.clear(); //之後multiset裏保存的是每個位置上的f值
now=0; //multiset裏保存的是[now,i-1]的f值
for(int i=1;i<=n;i++)
{
if(i-l>=0) bst.insert(f[i-l]);
while(now<=i-l&&now<L[i]-1&&!bst.empty())
{
//cout<<now<<endl;
bst.erase(bst.lower_bound(f[now]));
now++;
}
if(bst.empty())
f[i]=INF;
else f[i]=*bst.begin()+1;
}
if(f[n]>=INF) printf("-1\n");
else printf("%d\n",f[n]);
return 0;
}
C. Prefix Product Sequence
題目鏈接
http://codeforces.com/contest/487/problem/C
題目大意
定義前綴和
思路
顯然若
其他情況下,顯然
代碼
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#define MAXN 110000
using namespace std;
typedef long long int LL;
LL a[MAXN],rev[MAXN];
int n;
bool isPrime(int x)
{
for(int i=2;i*i<=x;i++)
if(!(x%i)) //!!!!!!
return false;
return true;
}
int main()
{
scanf("%d",&n);
if(n==4)
{
printf("YES\n1\n3\n2\n4\n");
return 0;
}
if(!isPrime(n))
{
printf("NO\n");
return 0;
}
printf("YES\n");
rev[1]=1;
for(int i=2;i<=n;i++)
rev[i]=rev[n%i]*rev[n%i]%n*i%n*(n/i)%n*(n/i)%n;
a[1]=1,a[n]=n;
for(int i=2;i<n;i++) a[i]=i*rev[i-1]%n;
for(int i=1;i<=n;i++) printf("%I64d\n",a[i]);
return 0;
}