ABC354
A
link
模拟整个过程即可。
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
int h;
cin >> h;
int day = 1ll,g = 0ll;
while(g < h){
g += (1ll<<day);
day++;
}
cout << day;
return 0;
}
B
link
名字排序后输出第\(T%N+1\)个即可。
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
string s[105];
int c;
int q;
signed main(){
cin >> n;
for(int i = 1;i <= n;++ i)
cin >> s[i] >> c,q += c;
q %= n;
sort(s+1,s+1+n);
cout << s[q+1];
return 0;
}
C
link
我们把这两个数看做这个位置的两个属性。
我们把其中一个属性排序,对于每一个位置找到后面另一个属性比它小的这个位置/那个位置就可以删掉了。
这个可以倒着来,从\(n\)到\(1\),走过一个数把这个数取到最小值中,其他的判断是否大于最小值即可。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n;
struct nd{
int a,c,w;
}t[200005];
bool f[200005];
int mn = 0x3f3f3f3f,cn;
bool cmp(nd x,nd y){
return x.a < y.a;
}
signed main(){
cin >> n;
for(int i = 1;i <= n;++ i)
cin >> t[i].a >> t[i].c,t[i].w = i;
sort(t+1,t+1+n,cmp);
for(int i = n;i >= 1;-- i){
if(t[i].c > mn) f[t[i].w] = 1,cn++;
mn = min(mn,t[i].c);
}
cout << n-cn << endl;
for(int i = 1;i <= n;++ i){
if(!f[i]) cout << i << " ";
}
return 0;
}
D
link
以下图红框中的为周期,算出其中每一个格子出现了几次即可。
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a,b,c,d;
const int mn = 1e9+4;
int p[3][5] = {{0,0,0,0,0},
{0,2,1,0,1},
{0,1,2,1,0}};
int ans;
signed main(){
cin >> a >> b >> c >> d;
for(int i = 1;i <= 2;++ i){
for(int j = 1;j <= 4;++ j){
int sx = (c-j+4+mn)/4-(a-j+4+mn)/4;
int sy = (d-i+2+mn)/2-(b-i+2+mn)/2;
ans += sx*sy*p[i][j];
}
}
cout << ans;
return 0;
}