//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<string>
#include<cstring>
#include<algorithm>
#include<limits.h>
using namespace std;
typedef long long ll;
const ll INF=0x3f3f3f3f;
const ll inf=-0x3f3f3f3f;
int n;
int main(){
cin>>n;
cout<<1998+n<<endl;
return 0;
}
这道题的答案看样例应该还是挺好猜的。其实就是gcd(F(x),F(x+1))先要变成gcd((F(x+1),F(x))),然后变成gcd(F(x),F(x-1)),因为斐波那契F(x+1)=F(x)+F(x-1),所以F(x+1)是肯定小于2*F(x), F(x+1)%F(x)=F(x+1)-F(x)=F(x-1),gcd(F(x),F(x-1))变成gcd(2,1)->gcd(1,0),需要n次,在加一次交换位置,n+1.
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<string>
#include<cstring>
#include<algorithm>
#include<limits.h>
using namespace std;
typedef long long ll;
const ll INF=0x3f3f3f3f;
const ll inf=-0x3f3f3f3f;
int T,n;
int main(){
scanf("%d",&T);
while(T--){
cin>>n;
cout<<n+1<<endl;
}
return 0;
}
C.LCPS
菜.jpg;
D.Campaign
七层循环暴力枚举就可以了,优雅一点就深搜
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<string>
#include<cstring>
#include<algorithm>
#include<limits.h>
using namespace std;
typedef long long ll;
const ll INF=0x3f3f3f3f;
const ll inf=-0x3f3f3f3f;
long long L[10];
long long R[10];
int ans;
int n;
void dfs(int now, int step, long long ll, long long rr) {
//现在点 第几步 到该点的总下线 到该点的总上限
ll += L[now];
rr += R[now];
if (ll <= n && rr >= n){
ans = max(ans, step);
}
if(ll > n){
return ;
}
for (int i = now+1; i <= 7; ++i) {
dfs(i, step+1, ll, rr);
}
}
int main() {
std::ios::sync_with_stdio(false);
int T;
cin >> T;
while (T--) {
ans = 0;
cin >> n;
for (int i = 1; i <= 7; ++i) {
cin >> L[i] >> R[i];
}
for (int i = 1; i <= 7; ++i) {
dfs(i, 1, 0, 0);
}
cout << ans << endl;
}
return 0;
}
排个序,从前往后建造就行了。
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<string>
#include<cstring>
#include<algorithm>
#include<limits.h>
using namespace std;
typedef long long ll;
const ll INF=0x3f3f3f3f;
const ll inf=-0x3f3f3f3f;
const int maxn = 1e3+5;
ll pos[maxn];
ll dis[maxn];
int main() {
std::ios::sync_with_stdio(false);
int T;
cin >> T;
while (T--) {
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; ++i) {
cin >> pos[i];
}
sort(pos+1, pos+1+n);
ll ans = 0;
for (int i = 2; i <= n; ++i) {
int dis = pos[i] - pos[i-1];
ll tmp = 0;
ll tired = 0;
while (dis) {
tmp += tired*2+1;
dis--;
tired++;
}
ans += tmp;
}
cout << ans + k << endl;
}
return 0;
}
F.Pylon Link
二分答案半径,用并查集来维护,如果两点距离小于2*R,那就将他们联通,最后检验是不是都被联通了。爆int还wa了好几发
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<string>
#include<cstring>
#include<algorithm>
#include<limits.h>
using namespace std;
typedef long long ll;
const double inf=2e11;
const int maxn=500+50;
double x[maxn],y[maxn],dis[maxn][maxn];
int f[maxn],n;
int find(int x) {
if(f[x]==x) return f[x];
else return f[x]=find(f[x]);
}
inline void unity(int x,int y) {
int u=find(x),v=find(y);
f[u]=v;
}
bool check(long long mid) {
for(int i=0; i<maxn; i++) f[i]=i;
for(int i=1; i<=n; i++) {
for(int j=i+1; j<=n; j++) {
if(dis[i][j]<=2*mid) {
if(find(i)!=find(j))
unity(i,j);
}
}
}
int ff=find(1);
for(int i=2; i<=n; i++) {
if( find(i)!=ff ) return false;
}
return true;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int line;
cin>>line;
while(line--) {
cin>>n;
double L=inf,R=-1;
for(int i=1; i<=n; i++)
cin>>x[i]>>y[i];
for(int i=1; i<=n; i++)
for(int j=i+1; j<=n; j++) {
dis[i][j]=sqrt( (x[i]-x[j])*(x[i]-x[j]) +(y[i]-y[j])*(y[i]-y[j]) );
L=min(L,dis[i][j]);
R=max(R,dis[i][j]);
}
ll l=0,r=inf;
while(r>l) {
ll mid=(l+r)>>1;
if(check(mid)) r=mid;
else l=mid+1;
}
cout<<l<<endl;
}
return 0;
}
菜.jpg
这个还是很好推的.
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<string>
#include<cstring>
#include<algorithm>
#include<limits.h>
using namespace std;
typedef long long ll;
const ll INF=0x3f3f3f3f;
const ll inf=-0x3f3f3f3f;
const ll mod=998244353;
ll fpow(ll x,ll y) {
ll ans=1;
while(y) {
if(y&1) (ans*=x)%=mod;
(x*=x)%=mod;
y>>=1;
}return ans%mod;
}
int main() {
int line;
scanf("%d",&line);
while(line--) {
int n;
ll res=1;
scanf("%d",&n);
while(n--) {
ll a,b;
scanf("%lld%lld",&a,&b);
res*=((fpow(2,a)-1)+(fpow(2,b)-1));
res%=mod;
}printf("%lld\n",res%mod);
}
return 0;
}
I.Race Sorting
模拟题
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<string>
#include<cstring>
#include<algorithm>
#include<limits.h>
using namespace std;
typedef long long ll;
const ll INF=0x3f3f3f3f;
const ll inf=-0x3f3f3f3f;
vector<int>t;
vector<int>z;
vector<int>p;
vector<int>ans;
int main() {
std::ios::sync_with_stdio(false);
int T;
cin >> T;
while (T--) {
int rank[3];
memset(rank, 0, sizeof(rank));
t.clear();
z.clear();
p.clear();
ans.clear();
int n, tmp;
string s;
cin >> n;
while (n--) {
cin >> tmp >> s >> s;
if (s == "Terran")
t.push_back(tmp);
else if (s == "Zerg")
z.push_back(tmp);
else
p.push_back(tmp);
}
cin >> s;
int pos1 = s.find(',');
int pos2 = s.find(',', pos1+1);
if (s[pos1-1] == 'g') {
rank[2] = 1;
} else if (s[pos1-1] == 'n') {
rank[1] = 1;
} else
rank[0] = 1;
if (s[pos2-1] == 'g') {
rank[2] = 2;
} else if (s[pos2-1] == 'n') {
rank[1] = 2;
} else
rank[0] = 2;
if (rank[0] == 1) {
ans.insert(ans.end(), p.begin(), p.end());
} else if (rank[1] == 1) {
ans.insert(ans.end(), t.begin(), t.end());
} else
ans.insert(ans.end(), z.begin(), z.end());
if (rank[0] == 2) {
ans.insert(ans.end(), p.begin(), p.end());
} else if (rank[1] == 2) {
ans.insert(ans.end(), t.begin(), t.end());
} else
ans.insert(ans.end(), z.begin(), z.end());
if (rank[0] == 0) {
ans.insert(ans.end(), p.begin(), p.end());
} else if (rank[1] == 0) {
ans.insert(ans.end(), t.begin(), t.end());
} else
ans.insert(ans.end(), z.begin(), z.end());
for (int i = 0; i < ans.size(); ++i) {
if (i)
cout << " ";
cout << ans[i];
}
cout << endl;
}
return 0;
}
J.Carrier
签到题
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<string>
#include<cstring>
#include<algorithm>
#include<limits.h>
using namespace std;
typedef long long ll;
const ll INF=0x3f3f3f3f;
const ll inf=-0x3f3f3f3f;
int main() {
int T;
cin>>T;
while(T--) {
int a,b,x,y;
cin>>a>>b>>x>>y;
if(a<350) {
cout<<"You have not enough minerals."<<endl;
continue;
} else if(b<250) {
cout<<"You require more vespene gas."<<endl;
continue;
} else if(x+6>y) {
cout<<"You must construct additional pylons."<<endl;
continue;
} else {
cout<<"Carrier has arrived."<<endl;
continue;
}
}
return 0;
}
K.Technology Tree
深搜一下,记录每个点的需要的矿和瓦斯
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<string>
#include<cstring>
#include<algorithm>
#include<limits.h>
using namespace std;
typedef long long ll;
const ll INF=0x3f3f3f3f;
const ll inf=-0x3f3f3f3f;
const int maxn=2e4+5;
int T,n,q;
int f[maxn];
struct PP {
int k;
int w;
};
vector<int> e[maxn];
PP m[maxn];
PP res[maxn];
int degree[maxn];
bool vis[maxn];
PP dfs(int s) {
if(vis[s]){
return res[s];
}
if(f[s]==s) {
return PP {m[s].k,m[s].w};
} else {
PP tmp=dfs(f[s]);
res[s]=PP{tmp.k+m[s].k,tmp.w+m[s].w};
vis[s]=true;
return res[s];
}
}
int main() {
scanf("%d",&T);
while(T--) {
scanf("%d%d",&n,&q);
for(int i=1; i<=n; ++i) {
cin>>m[i].k>>m[i].w;
if(i==1) {
res[i].k=m[i].k;
res[i].w=m[i].w;
}
}
memset(vis,false ,sizeof(vis));
for(int i=2; i<=n; ++i) {
cin>>f[i];
}
for(int i=2; i<=n; ++i) {
if(!vis[i]){
res[i]=dfs(i);
vis[i]=true;
}
}
int x;
for(int i=1; i<=q; ++i) {
cin>>x;
cout<<res[x].k<<' '<<res[x].w<<endl;
}
}
return 0;
}
L.The Last Stand
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<string>
#include<cstring>
#include<algorithm>
#include<limits.h>
using namespace std;
typedef long long ll;
const ll INF = 0x3f3f3f3f;
const ll inf = -0x3f3f3f3f;
const int maxn = 1e3+5;
ll dp[maxn][maxn];
//到i点 状态为j 的生命值
ll val[maxn];
ll delta[maxn];
ll pos[maxn];
ll dis[maxn];
int main() {
std::ios::sync_with_stdio(false);
int T;
cin >> T;
while (T--) {
ll n, m;
memset(dp, 0, sizeof(dp));
cin >> n >> m >> dp[0][0];
for (int i = 1; i <= n; ++i) {
cin >> pos[i] >> val[i] >> delta[i];
dis[i] = pos[i] - pos[i-1];
}
dis[n+1] = m-pos[n];
for (int j = 1; j <= n; ++j)
dp[0][j] = dp[0][0];
for (int i = 1; i <= n; ++i) {
for (int j = 0; j < i; ++j) {
if (dp[i-1][j] > 0) {
dp[i][j] = dp[i-1][j] + dis[i]*delta[j];
}
if (dp[i][j] < 1)
dp[i][j] = inf;
if (dp[i][j] > 0)
dp[i][i] = max(dp[i][i], dp[i][j] + val[i]);
if (dp[i][i] < 1)
dp[i][i] = inf;
}
}
ll ans = 0;
for (int j = 0; j <= n; ++j) {
if (dp[n][j] > 0)
ans = max(ans, dp[n][j] + dis[n+1]*delta[j]);
}
cout << ans << endl;
}
return 0;
}