A map签到
#include<bits/stdc++.h>
#define len(s) (int)s.size()
using namespace std;
//#define int long long
const int N = 10;
void solve(){
int a[N];
int n, k;
cin >> n;
for (int i = 1; i < 4; i ++ )
cin >> a[i];
map<int,int>mp;
mp[n]++;
mp[a[n]]++;
mp[a[a[n]]]++;
if(mp[1]==1&&mp[2]==1&&mp[3]==1)
cout << "YES"<< endl;
else
cout << "NO"<<endl;
}
signed main(){
int t;
cin >> t;
while(t--){
solve();
}
return 0;
}
B
前缀和
您正在测试新的秘密Terraria更新。这次更新将增加任务到游戏!
简单地说,世界地图可以表示为一个长度为n的数组,其中世界的第i列高度为ai。
有m个任务需要你去测试。其中第j个由两个整数sj和tj表示。在这个任务中,你必须从列sj到列tj。在任务开始时,你出现在sj列。
在一次移动中,可以从x列移动到x−1列或x+1列。在这个版本中,你有幽灵靴,它可以让你飞行。因为这是一个测试版,所以它们有漏洞,所以它们只允许你在上升时飞行,并且有无限的飞行时间。当你从高度为p的一列移动到高度为q的一列时,你将获得一定的掉落伤害。如果高度p大于高度q,你将获得p−q掉落伤害,否则你将获得0伤害。
对于每个给定的任务,确定你在这个任务中可以获得的最低掉落伤害。
输入
输入的第一行包含两个整数n和m(2≤n≤105;1≤m≤105)——分别是世界中的列数和需要测试的任务数。
输入的第二行包含n个整数a1,a2,…,an(1≤ai≤109),其中ai为世界第i列的高度。
接下来的m行描述了任务。其中第j个包含两个整数sj和tj(1≤sj,tj≤n;sj≠tj),这意味着在第j个任务期间,你必须从列sj移动到列tj。
注意,sj可以大于tj。
输出
打印整数。第j个应该是你在完成第j个任务时所能获得的最小掉落伤害。
#include<bits/stdc++.h>
#define len(s) (int)s.size()
using namespace std;
#define int long long
const int N = 1e6;
int a[N],b[N],c[N];
int n;
void solve(){
int l,r;
cin >> l>>r;
if(l<r)
cout << b[r]-b[l]<<endl;
else
cout << c[r]-c[l]<<endl;
}
signed main(){
cin >> n;
int t;
cin >> t;
for (int i = 1; i <= n; i ++ )
cin >> a[i];
for (int i = 1; i <= n; i ++ )
{b[i]=b[i-1];if(a[i]<a[i-1])b[i]+=(a[i-1]-a[i]);}
for (int i = n; i >=1; i -- )
{c[i]=c[i+1];if(a[i]<a[i+1])c[i]+=(a[i+1]-a[i]);}
/*for (int i = 1; i <= n; i ++ )
cout << b[i]<<' '<<c[i]<<endl;*/
while(t--){
solve();
}
return 0;
}
C
对于每个测试用例,如果用括号替换问号的方法是唯一的,那么打印“YES”,这样得到的序列就是一个RBS。如果有不止一种方法,那么打印“NO”!
前缀和?哈有啥呢?test2 wa!
/*
By skyzo, contest: Educational Codeforces Round 132 (Rated for Div. 2), problem: (C) Recover an RBS, Wrong answer on test 2, #, Copy
*/
#include<bits/stdc++.h>
#define len(s) (int)s.size()
using namespace std;
#define int long long
const int N = 1e6;
int a[N],b[N],c[N];
int n;
int cnt;
string s;
bool cat()
{
if(n%2==1)
return false;
if(s[0]==')')
return false;
if(s[n-1]=='(')
return false;
if(n==2)
return true;
b[0]=1;
for (int i = 1; i < n-1; i ++ )
{
b[i]=b[i-1]+a[i];
if(b[i]<0)
return false;
}
b[n-1]=b[n-2]-1;
/*for (int i = 0; i < n; i ++ )
cout << b[i]<<' ';*/
if(b[n-1]==cnt||-b[n-1]==cnt)
return true;
return false;
}
void solve(){
cin >> s;
n=len(s);
//cout<<s[0]<<endl;
cnt=0;
a[0]=1;
a[n-1]=-1;
for (int i = 1; i < n-1; i ++ )
{
if(s[i]=='(')
a[i]=1;
if(s[i]==')')
a[i]=-1;
if(s[i]=='?')
{a[i]=0;cnt++;}
//cout << b[i]<<' ';
}
bool dog=cat();
if(dog==true)
cout << "YES"<<endl;
else
cout << "NO"<<endl;
}
signed main(){
int t;
cin >> t;
while(t--){
solve();
}
return 0;
}