补题链接:Dashboard - Codeforces Round 984 (Div. 3) - Codeforces
A. Quintomania
思路
模拟题,每相邻两个数差的绝对值都是5或7则暑促yes,否则输出no
代码
void solve(){
int n; cin>>n;
vector<int>a(n+10);
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<n;i++){
int t=abs(a[i+1]-a[i]);
if(t==5||t==7){
continue;
}else{
cout<<"NO\n";return;
}
}
cout<<"YES\n";
}
B. Startup
思路
把相同品牌的加在一起后排序,输出前min(k,n)个最大的之和
代码
#include<bits/stdc++.h>
using namespace std;
#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define int long long
#define ull unsigned long long
#define bit __builtin_popcountll
#define lowbit(x) ((x)&-(x))
typedef pair<int,int> pll;
const int N=2e5+10;
const int INF=0x3f3f3f3f3f3f3f3f;
const int inf=INT_MIN;
const int mod=998244353;
const int base=283;
int n,k;
struct node{
int b,c;
}p[N];
void solve(){
cin>>n>>k;
vector<int>b(k+10,0);
for(int i=1;i<=k;i++){
cin>>p[i].b>>p[i].c;
b[p[i].b]+=p[i].c;
}
sort(b.begin()+1,b.begin()+1+k);
int sum=0;
for(int i=k;i>=1;i--){
n--;
sum+=b[i];
if(n<=0) break;
}
cout<<sum<<"\n";
}
signed main() {
vcoistnt
int _=1;
cin>>_;
while(_--) {
solve();
}
return 0;
}
C. Anya and 1100
思路
由于要是每次改变一次就重新统计1100子串的数量肯定会T的,所以仔细想一下发现每次要改变一个位置的数只与这个位置附近7个字符有关,只需要判断一下改变此位置的数是否能形成新的1100字串或者破坏掉原来的1100子串即可
代码
#include<bits/stdc++.h>
using namespace std;
#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define int long long
#define ull unsigned long long
#define bit __builtin_popcountll
#define lowbit(x) ((x)&-(x))
typedef pair<int,int> pll;
const int N=2e5+10;
const int INF=0x3f3f3f3f3f3f3f3f;
const int inf=INT_MIN;
const int mod=998244353;
const int base=283;
void solve(){
string s;
cin>>s;
int n=s.size();
s=" "+s;
int cnt=0;
for(int i=1;i<=n-3;i++){
if(s[i]=='1'&&s[i+1]=='1'&&s[i+2]=='0'&&s[i+3]=='0'){
cnt++;
}
}
int q;
cin>>q;
while(q--){
int x,t;
cin>>x>>t;
if((s[x]-'0')==t){
if(cnt){
cout<<"YES\n";
}else{
cout<<"NO\n";
}
}else{
if(s[x]=='1'){
if((s[x+1]=='1'&&s[x+2]=='0'&&s[x+3]=='0')||(x>=2&&s[x-1]=='1'&&s[x+1]=='0'&&s[x+2]=='0')){
cnt--;
}
s[x]='0';
if((x>=3&&s[x-1]=='1'&&s[x-2]=='1'&&s[x+1]=='0')||(x>=4&&s[x-1]=='0'&&s[x-2]=='1'&&s[x-3]=='1')){
cnt++;
}
if(cnt){
cout<<"YES\n";
}else{
cout<<"NO\n";
}
}else{
if((x>=3&&s[x-1]=='1'&&s[x-2]=='1'&&s[x+1]=='0')||(x>=4&&s[x-1]=='0'&&s[x-2]=='1'&&s[x-3]=='1')){
cnt--;
}
s[x]='1';
if((s[x+1]=='1'&&s[x+2]=='0'&&s[x+3]=='0')||(x>=2&&s[x-1]=='1'&&s[x+1]=='0'&&s[x+2]=='0')){
cnt++;
}
if(cnt){
cout<<"YES\n";
}else{
cout<<"NO\n";
}
}
}
}
}
signed main() {
vcoistnt
int _=1;
cin>>_;
while(_--) {
solve();
}
return 0;
}
D. I Love 1543
思路
赛时的时候调了挺久的,其实只要把每一层放在一个vector数组里面,然后把每个数遍历至于循环的部分%v.size()即可
代码
#include<bits/stdc++.h>
using namespace std;
#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define int long long
#define ull unsigned long long
#define bit __builtin_popcountll
#define lowbit(x) ((x)&-(x))
typedef pair<int,int> pll;
const int N=2e5+10;
const int INF=0x3f3f3f3f3f3f3f3f;
const int inf=INT_MIN;
const int mod=998244353;
const int base=283;
void solve(){
int n,m;
cin>>n>>m;
string s[n+10];
for(int i=1;i<=n;i++){
cin>>s[i];
s[i]=" "+s[i];
}
int t=1,x=n,y=m;
int ans=0;
while(t<=x&&t<=y){
vector<char>v;
for(int i=t;i<=y;i++){
v.push_back(s[t][i]);
}
for(int i=t+1;i<=x;i++){
v.push_back(s[i][y]);
}
for(int i=y-1;i>=t;i--){
v.push_back(s[x][i]);
}
for(int i=x-1;i>=t+1;i--){
v.push_back(s[i][t]);
}
int len=v.size();
for(int i=0;i<len;i++){
if(v[i]=='1'&&v[(i+1)%len]=='5'&&v[(i+2)%len]=='4'&&v[(i+3)%len]=='3'){
ans++;
}
}
t++,x--,y--;
}
cout<<ans<<"\n";
}
signed main() {
vcoistnt
int _=1;
cin>>_;
while(_--) {
solve();
}
return 0;
}
E. Reverse the Rivers
思路
太菜了调了半天哈哈可以看出来我当时有多难受
先根据题意处理一下数组,然后再用二分卡一下范围,范围不合法输出-1,合法输出最小
代码
#include<bits/stdc++.h>
using namespace std;
#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define int long long
#define ull unsigned long long
#define bit __builtin_popcountll
#define lowbit(x) ((x)&-(x))
#define vi vector<int>
#define vb vector<bool>
typedef pair<int,int> pll;
const int N=2e5+10;
const int INF=0x3f3f3f3f3f3f3f3f;
const int inf=INT_MIN;
const int mod=998244353;
const int base=283;
void solve(){
int n,k,q;cin>>n>>k>>q;
vector<vector<int>> mp(k+10,vector<int>(n+10,0));
for(int i=1;i<=n;i++){
for(int j=1;j<=k;j++){
cin>>mp[j][i];
mp[j][i]|=mp[j][i-1];
}
}
while(q--){
int m;
cin>>m;
int L=1,R=n;
while(m--){
int r,c;
char o;
cin>>r>>o>>c;
if(o=='>'){
int t=upper_bound(mp[r].begin()+1,mp[r].begin()+1+n,c)-mp[r].begin();
L=max(L,t);
}else{
int t=lower_bound(mp[r].begin()+1,mp[r].begin()+1+n,c)-mp[r].begin()-1;
//对就是这个-1卡的我(泪目了)
R=min(R,t);
}
}
if(L>R){
cout<<"-1\n";
}else{
cout<<L<<"\n";
}
}
}
signed main() {
vcoistnt
int _=1;
// cin>>_;
while(_--) {
solve();
}
return 0;
}