A.Reverse
按照题意模拟即可
#include <bits/stdc++.h>
using i64 = long long ;
const int BufferSize=1<<16;
char buffer[BufferSize],*head,*tail;
inline char Getchar() {
if(head==tail) {
int l=fread(buffer,1,BufferSize,stdin);
tail=(head=buffer)+l;
}
return *head++;
}
inline int read() {
int x=0,f=1;char c=Getchar();
for(;!isdigit(c);c=Getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=Getchar()) x=(x<<3)+(x<<1)+(c^48);
return x*f;
}
void print(int x)
{
if(x>9) print(x/10);
putchar(x%10|'0');
}
void solve(){
int n=read();
std::vector<int>a(n);
for(auto &t:a)t=read(),t--;
for(int i=0;i<n;i++)
{
if(a[i]!=i){
for(int j=i+1;j<n;j++){
if(a[j]==i){
reverse(a.begin()+i,a.begin()+j+1);
for(auto &t:a)print(t+1),putchar(' ');
putchar('\n');
return ;
}
}
}
}
for(auto &t:a)print(t+1),putchar(' ');
putchar('\n');
}
int main()
{
int t=read();
while(t--){
solve();
}
return 0;
}
B.Odd Swap Sort
无限次交换相邻和为奇数,是否可以排好序。
很明显的性质相同奇偶时左边的数不能转移到右边。因为如果可以转移它们一定会相邻,但不满足相邻和为奇数时可以交换。
#include <bits/stdc++.h>
using i64 = long long ;
const int BufferSize=1<<16;
char buffer[BufferSize],*head,*tail;
inline char Getchar() {
if(head==tail) {
int l=fread(buffer,1,BufferSize,stdin);
tail=(head=buffer)+l;
}
return *head++;
}
inline int read() {
int x=0,f=1;char c=Getchar();
for(;!isdigit(c);c=Getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=Getchar()) x=(x<<3)+(x<<1)+(c^48);
return x*f;
}
void print(int x)
{
if(x>9) print(x/10);
putchar(x%10|'0');
}
void solve(){
int n=read();
std::vector<int>a,b;
while(n--){
int x=read();
if(1&x)a.push_back(x);
else b.push_back(x);
}
if(std::is_sorted(a.begin(),a.end())&&std::is_sorted(b.begin(),b.end())){
printf("YES\n");
}else{
printf("NO\n");
}
}
int main()
{
int t=read();
while(t--){
solve();
}
return 0;
}
C.Inversion Graph
对于
i
<
j
,
a
[
i
]
>
a
[
j
]
i<j,a[i]>a[j]
i<j,a[i]>a[j]时可以连边组成相同颜色,输出最后有多少种不同的颜色。
此题不用并查集也行。对于
a
,
b
,
c
a,b,c
a,b,c三个块如果
a
a
a和
c
c
c连边,
b
b
b和
c
c
c连边,那么
a
a
a和
b
b
b连边。
最后统计下区间的个数即可。
#include <bits/stdc++.h>
using i64 = long long ;
const int BufferSize=1<<16;
char buffer[BufferSize],*head,*tail;
inline char Getchar() {
return getchar();
if(head==tail) {
int l=fread(buffer,1,BufferSize,stdin);
tail=(head=buffer)+l;
}
return *head++;
}
inline int read() {
int x=0,f=1;char c=Getchar();
for(;!isdigit(c);c=Getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=Getchar()) x=(x<<3)+(x<<1)+(c^48);
return x*f;
}
void print(int x)
{
if(x>9) print(x/10);
putchar(x%10|'0');
}
void solve(){
int n=read();
std::vector<int>a(n);
for(auto &t:a)t=read()-1;
int ans=0,l=-1,r=-1;
for(int i=0;i<n;i++){
int u=i,v=a[i];
if(u>v)std::swap(u,v);
if(u>r){
ans++;
l=u,r=v;
}
l=std::min(l,u);
r=std::max(r,v);
}
print(ans);
putchar('\n');
}
int main()
{
int t=read();
while(t--){
solve();
}
return 0;
}
D.Big Brush
根据题意模拟即可最后倒着输出。
#include <bits/stdc++.h>
using i64 = long long ;
const int BufferSize=1<<16;
char buffer[BufferSize],*head,*tail;
inline char Getchar() {
return getchar();
if(head==tail) {
int l=fread(buffer,1,BufferSize,stdin);
tail=(head=buffer)+l;
}
return *head++;
}
inline int read() {
int x=0,f=1;char c=Getchar();
for(;!isdigit(c);c=Getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=Getchar()) x=(x<<3)+(x<<1)+(c^48);
return x*f;
}
void print(int x)
{
if(x>9) print(x/10);
putchar(x%10|'0');
}
void print(char x){
putchar(x);
}
constexpr int N = 1e3+10 ;
int a[N][N];
struct node{
int x,y,col;
};
bool vis[N][N];
int n,m;
int check(int x,int y){
if(x<=0||y<=0||x>=n||y>=m)return -1;
std::set<int>se;
for(int i=x;i<x+2;i++)
for(int j=y;j<y+2;j++){
if(vis[i][j])continue;
se.insert(a[i][j]);
}
if(se.size()!=1)return -1;
return *se.begin();
}
bool st[N][N];
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
a[i][j]=read();
}
std::queue<node>q;
std::function<void(int,int)>init=[&](int x,int y){
for(int i=x;i<x+2;i++)
for(int j=y;j<y+2;j++)
vis[i][j]=true;
};
for(int i=1;i<n;i++)
for(int j=1;j<m;j++){
int ans=check(i,j);
if(ans!=-1){
q.push({i,j,ans});
init(i,j);
}
}
std::stack<node>sta;
while(!q.empty()){
node t=q.front();q.pop();
if(st[t.x][t.y])continue;
st[t.x][t.y]=true;
sta.push(t);
for(int i=t.x-2;i<=t.x+2;i++){
for(int j=t.y-2;j<=t.y+2;j++){
int ans=check(i,j);
if(ans==-1||st[i][j])continue;
q.push({i,j,ans});
init(i,j);
}
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(!vis[i][j])return printf("-1"),0;
print((int)sta.size());
print('\n');
while(!sta.empty()){
auto t=sta.top();sta.pop();
print(t.x);print(' ');print(t.y);print(' ');print(t.col);
print('\n');
}
}