A
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200100;
int main(){
int k;
cin>>k;
cout<<k*k*3<<endl;
}
B
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200100;
int main(){
ll n,d;
cin>>n>>d;
d=2*d+1;
cout<<n/d+bool(n%d);
return 0;
}
C
贪心,只需考虑最大值和次大值
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200100;
int w[N];
int a[N];
multiset<int>se;
int main(){
int n;
cin>>n;
for( int i=1;i<=n;i++){
scanf("%d",&w[i]);
a[i]=w[i];
}
sort(w+1,w+1+n);
for( int i=1;i<=n;i++){
if(a[i]==w[n]){
printf("%d\n",w[n-1]);
}
else {
printf("%d\n",w[n]);
}
}
return 0;
}
D
数位dp
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100100;
const ll mod=1e9+7;
ll dp[N][12][15];//第i位,本位填j,余数是k
ll remain[N];
//10,100,1000整除13后的余数
string s;
void cal_remain(){
remain[1]=1;
for( int i=2;i<=100010;i++){
remain[i]=remain[i-1]*10%13;
remain[i]%=mod;
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin>>s;
reverse(s.begin(),s.end());
cal_remain();
for( int i=0;i<s.size();i++){
if(s[i]=='?'){
for( int j=0;j<=9;j++){
ll yushu=j*remain[i+1]%13;
for( int k=0;k<=12;k++){
if(i==0){
if(j==k){
dp[i][j][k]=1;
}
}
else{
dp[i][j][(yushu+k)%13]+=dp[i-1][10][k];
}
}
}
for( int j=0;j<=12;j++){
for( int k=0;k<=9;k++)
dp[i][10][j]+=dp[i][k][j]%mod;
dp[i][10][j]%=mod;
}
}
else{
int x=s[i]-'0';
for( int j=0;j<=9;j++){
ll yushu=j*remain[i+1]%13;
if(j!=x) continue;
for( int k=0;k<=12;k++){
if(i==0){
if(j==k)
dp[i][j][k]=1;
}
else{
dp[i][j][(yushu+k)%13]+=dp[i-1][10][k]%mod;
}
}
}
for( int j=0;j<=12;j++){
for( int k=0;k<=9;k++)
dp[i][10][j]+=dp[i][k][j];
dp[i][10][j]%=mod;
}
}
}
ll ans=0;
for( int i=0;i<=9;i++){
ans+=dp[s.size()-1][i][5];
}
cout<<ans%mod<<endl;
return 0;
}
E
set维护最大值(icpc昆明站签到题)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200100;
int w[N];
int a[N];
multiset<int>se;
int main(){
int n;
cin>>n;
se.insert(1e9);
for( int i=1;i<=n;i++){
scanf("%d",&w[i]);
}
int ans=0;
for( int i=1;i<=n;i++){
if(w[i]<=*se.begin()){
se.insert(w[i]);
ans++;
}
else {
multiset<int>::iterator it=se.lower_bound(w[i]);
while(*it>=w[i]){
--it;
}
se.erase(it);
se.insert(w[i]);
}
}
cout<<ans<<endl;
return 0;
}
F