C.小迢的盒子
题目链接
解法1:稍微快一点
#include <bits/stdc++.h>
using namespace std;
string out, s = "TYUTICPC";
int n, mid, len, cnt;
string f(int y, char c) {
string full(mid, '*'), blank(mid, ' '), blank1(len - 2, ' '), ans;
if (y == 0 && (c == 'T' || c == 'I' || c == 'C' || c == 'P') ||
y == mid && c == 'P' ||
y == len - 1 && (c == 'U' || c == 'I' || c == 'C'))
return full + "*" + full; //写一横
if (y && (c == 'T' || c == 'I') || y >= mid && c == 'Y')
return blank + "*" + blank;
if (y && c == 'C' || c == 'P' && y > mid)
return "*" + blank + blank;
if (c == 'U' || c == 'P' && y < mid)
return "*" + blank1 + "*";
for (int i = 0; i < len; i++)
ans += " *"[i == y || y == len - 1 - i];
return ans; //写Y的上半部分
}
int main() {
while (cin >> n) {
if (cnt++)
cout << "\n";
mid = n + 1, len = 3 + 2 * n;
for (int i = 0; i < len; i++) {
out = "";
for (int j = 0; j < 8; j++)
out += " |"[!j] + f(i, s[j]);
cout << out << "\n";
}
}
}
解法二:稍微慢一点
#include <iostream>
using namespace std;
int n;
void print1() {
cout << "|";
for (int i = 1; i <= 2 * n + 3; i++)
cout << '*'; //第一行的T的上面
cout << " *";
for (int i = 1; i <= 2 * n + 1; i++)
cout << ' '; //第一行的Y的上面
cout << "* *";
for (int i = 1; i <= 2 * n + 1; i++)
cout << ' '; //第一行的U的上面
cout << "* ";
for (int i = 1; i <= 2 * n + 3; i++)
cout << '*'; //第一行的T的上面
cout << ' ';
for (int i = 1; i <= 2 * n + 3; i++)
cout << '*';
cout << ' ';
for (int i = 1; i <= 2 * n + 3; i++)
cout << '*';
cout << ' ';
for (int i = 1; i <= 2 * n + 3; i++)
cout << '*';
cout << ' ';
for (int i = 1; i <= 2 * n + 3; i++)
cout << '*';
cout << "\n";
}
void print2() {
for (int l = 1; l <= n; l++) {
cout << '|';
for (int i = 1; i <= n + 1; i++)
cout << ' ';
cout << '*';
for (int i = 1; i <= n + 2 + l; i++)
cout << ' ';
cout << '*';
for (int i = 1; i <= 1 + 2 * n - 2 * l; i++)
cout << ' ';
cout << '*';
for (int i = 1; i <= l + 1; i++)
cout << ' ';
cout << '*';
for (int i = 1; i <= 2 * n + 1; i++)
cout << ' '; // U的上面
cout << "* ";
for (int i = 1; i <= n + 1; i++)
cout << ' ';
cout << '*';
for (int i = 1; i <= n + 2; i++)
cout << ' ';
for (int i = 1; i <= n + 1; i++)
cout << ' ';
cout << '*';
for (int i = 1; i <= n + 2; i++)
cout << ' ';
cout << '*';
for (int i = 1; i <= 2 * n + 3; i++)
cout << ' ';
cout << '*';
for (int i = 1; i <= 2 * n + 1; i++)
cout << ' ';
cout << "* *";
for (int i = 1; i <= 2 * n + 2; i++)
cout << ' ';
cout << '\n';
}
}
void print3() {
cout << '|';
for (int i = 1; i <= n + 1; i++)
cout << ' ';
cout << '*';
for (int i = 1; i <= 3 + n * 2; i++)
cout << ' ';
cout << '*';
for (int i = 1; i <= n + 2; i++)
cout << ' ';
cout << '*';
for (int i = 1; i <= 1 + n * 2; i++)
cout << ' ';
cout << '*';
for (int i = 1; i <= 2 + n; i++)
cout << ' ';
cout << '*';
for (int i = 1; i <= 3 + n * 2; i++)
cout << ' ';
cout << '*';
for (int i = 1; i <= n + 2; i++)
cout << ' ';
cout << '*';
for (int i = 1; i <= 3 + n * 2; i++)
cout << ' ';
for (int i = 1; i <= 3 + n * 2; i++)
cout << '*';
cout << " *";
for (int i = 1; i <= 2 + n * 2; i++)
cout << ' ';
cout << '\n';
}
void print4() {
for (int l = 1; l <= n; l++) {
putchar('|');
for (int i = 1; i <= n + 1; i++)
putchar(' ');
putchar('*');
for (int i = 1; i <= 3 + n * 2; i++)
putchar(' ');
putchar('*');
for (int i = 1; i <= n + 2; i++)
putchar(' ');
putchar('*');
for (int i = 1; i <= 1 + n * 2; i++)
putchar(' ');
putchar('*');
for (int i = 1; i <= 2 + n; i++)
putchar(' ');
putchar('*');
for (int i = 1; i <= 3 + n * 2; i++)
putchar(' ');
putchar('*');
for (int i = 1; i <= n + 2; i++)
putchar(' ');
putchar('*');
for (int i = 1; i <= 3 + n * 2; i++)
putchar(' ');
putchar('*');
for (int i = 1; i <= 3 + n * 2; i++)
putchar(' ');
putchar('*');
for (int i = 1; i <= 2 + n * 2; i++)
putchar(' ');
putchar('\n');
}
}
void print5() {
putchar('|');
for (int i = 1; i <= n + 1; i++)
putchar(' ');
putchar('*');
for (int i = 1; i <= 3 + n * 2; i++)
putchar(' ');
putchar('*');
for (int i = 1; i <= n + 2; i++)
putchar(' ');
for (int i = 1; i <= 3 + n * 2; i++)
putchar('*');
for (int i = 1; i <= n + 2; i++)
putchar(' ');
putchar('*');
for (int i = 1; i <= n + 2; i++)
putchar(' ');
for (int i = 1; i <= 3 + n * 2; i++)
putchar('*');
putchar(' ');
for (int i = 1; i <= 3 + n * 2; i++)
putchar('*');
printf(" *");
for (int i = 1; i <= 3 + n * 2; i++)
putchar(' ');
for (int i = 1; i <= 3 + n * 2; i++)
putchar('*');
printf("\n\n");
}
int main() {
while (cin >> n) {
print1(), print2(), print3(), print4(), print5();
}
return 0;
}
题解:找到规律暴力输出就行……
K.库特莉亚夫卡的排序
#include <bits/stdc++.h>
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <bitset>
#include <stack>
#include <set>
#include <map>
#include <random>
using namespace std;
typedef long long ll;
//typedef pair<ll,int> P;
const int INF=0x3f3f3f3f;
const ll mod=1e9+7;
template<class A>void read(A&a){
a=0;int c=getchar(),f=0;
for(;!isdigit(c);c=getchar()) f|=c=='-';
for(;isdigit(c);c=getchar()) a=a*10+(c^48);
if(f) a=-a;
}
template<class A,class ...B>
void read(A&a,B&...b){read(a);read(b...);}
//read(x,y,z);
template<class T>
inline void print(T x)
{
if(x<0) x=~x+1,putchar('-');
if(x>9) print(x/10);
putchar(x%10+'0');
}
const int N=100000+10;
int n,m;
int a[N],f[N];
vector<int> vec[N];
int id[N];
int getf(int x)
{
if(f[x]==x) return x;
else return f[x]=getf(f[x]);
}
void unio(int x,int y)
{
int fx=getf(x),fy=getf(y);
if(fx==fy) return ;
f[fx]=fy;
}
int main()
{
read(n,m);
for(int i=1;i<=n;i++) read(a[i]),f[i]=i;
for(int i=1;i<=m;i++)
{
int x,y;
read(x,y);
unio(x,y);
}
for(int i=1;i<=n;i++)
{
id[i]=getf(i);
vec[id[i]].push_back(a[i]);
}
for(int i=1;i<=n;i++)
{
if(vec[i].size()) sort(vec[i].begin(),vec[i].end());
}
for(int i=n;i>=1;i--)
{
a[i]=*vec[id[i]].rbegin();
vec[id[i]].pop_back();
}
int f=0;
for(int i=2;i<=n;i++)
{
if(a[i]>=a[i-1]) ;
else {f=1;break;}
}
if(f) printf("No\n");
else printf("Yes\n");
}
题解:好像是用了并查集吧,没仔细看过
L.密码
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
int get(int n)
{
int i,s=0;
for(i=n/4*4;i<=n;i++)s^=i;
return s;
}
int main()
{
int n,l,r,ans=0;
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&l,&r);
ans=(ans+(get(l-1)^get(r)))%mod;
}
printf("%d\n",ans);
return 0;
}
题解:区间异或和的规律就是每4个数(从0开始的连续4个数)异或和为0,于是我们只要求最后面几个数的异或和就行了。