#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>
#include <ctype.h>
#include <limits.h>
#define EPS 1e-9 //浮点比较
#define MOD 998244353 //取模运算
#define MAX_LL 1000010//大型数组
#define MAX_L 1010 //小型数组
#define MAX_N 11 //矩阵阶数
#define PI 3.141592653//通用常数
#define EU 2.718281828//通用常数
#define in int
#define ll long long
#define db double
#define ch char
#define vd void
#define uin unsigned int
#define ull unsigned long long
#define uch unsigned char
#define br break
#define cn continue
#define rt return
#define sc scanf
#define pr printf
//支持单元输入
#define scin(x) sc("%d", &(x))
#define scll(x) sc("%lld", &(x))
#define scdb(x) sc("%lf", &(x))
//支持空白略去
#define scch(x) sc(" %c", &(x))
#define scst(x) sc(" %s", (x))
//支持二元输入
#define scin2(x,y) sc("%d%d", &(x), &(y))
#define scll2(x,y) sc("%lld%lld", &(x), &(y))
#define scdb2(x,y) sc("%lf%lf", &(x), &(y))
//支持一元输出
#define prin(x) pr("%d", x)
#define prll(x) pr("%lld", x)
#define prdb(x) pr("%lf", x)
#define prch(x) pr("%c", x)
#define prst(x) pr("%s", x)
//支持一元换行输出
#define prinn(x) pr("%d\n", x)
#define prlln(x) pr("%lld\n", x)
#define prdbn(x) pr("%lf\n", x)
#define prchn(x) pr("%c\n", x)
#define prstn(x) pr("%s\n", x)
//支持一元精度输出
#define prdbr(x, r) pr("%.*lf", (r), (x))
//支持一元精度换行输出
#define prdbnr(x, r) pr("%.*lf\n", (r), (x))
//支持换行输出
#define prn pr("\n")
//支持空格输出
#define prb pr(" ")
//支持最值判断
#define MIN(a,b) ((a) < (b) ? (a) : (b))
#define MAX(a,b) ((a) > (b) ? (a) : (b))
//支持浮点相等判断
#define CEPS(a, b) (fabs((a) - (b)) < EPS)
/*
C7A:
以行或空格分割单词
P1:每个单词首字母大写:toupper(str[0])
P2:将空格替换为换行输出P1后单词
A1:单字符读入法:while(c=getchar()!=EOF),实际为全缓冲区输入后依次执行后续程序
首字符大写:标记法:初始化flag=1;大写一次后置0,空格和换行符后再置1,且转换行
否则均采用putchar(c)输出
A2:字符串读入法:while(scst(name)!=EOF),实际全部读入缓冲区
scst接受一次空格或换行分割的字符串,执行一次toupper及输出str,缓冲区内再匹配
*/
/*
C7B
二维数组模拟矩阵,四重循环执行操作
第一二曾循环负责记录元素位置输出矩阵形状(i,j)由题易得ans[][]的边长为m-n+1;
P1:全局:x[n][n]卷积;y[m][m]待处理矩阵;ans[][]输出矩阵
P2:函数cnn(in m,in n)
四重循环[0,m-n+1][0,m-n+1]遍历左上卷积元素可达位置
[0,n-1][0,n-1]负责实现卷积核与对应位置计算
观察规律y[][]的偏移[i+k][j+l]
P3:输入输出与调用
*/
/*
C7C
A1:动态维护当前字符长度,直接采用指针偏移法获取新字符串
P1:全局s[];全局ans[],全局lans
P2:执行n次字符串输入:
循环内scst(s);
strcat(ans+lans)(初始0偏移);
lans+=strlen(s)(补上新字符长度);
P3:tmp中间变量交换ans[p-1]和ans[q-1]
A2:双循环模拟strcat
scst(s);
ls=strlen(s);
for(in i=0;i<ls;i++)
ans[lans++]=s[i]
*/
/*
C7D
Self:
P1:对于每组读入的字符串s,首先对于s[0]进行判断
switch-case:s[0]=='c',换用sscanf(s,"%[^[]%d];",temp,&num)
P2:总B:char类型为1B单位;all=num*1
P3:调用合法拆分函数
all:if(all>=(1<<30))
{
prlln(sz/(1<<30));//GB段有多少
sz%=(1<<30);抹去GB段
}
以此类推
*/
/*
C7E
P1:全部小写化由原串s1转为s2;关键字key[]
P2:fgets(s1),for循环内全部tolower
P3:对于组数n
scst(key);in keylen=strlen(key)
ch *p=s2;
P4:只要p=strstr(p,key)!=NULL,即有该子串
对s1对应位置置*
s1[p-s2+i]='*'//p-s2为偏移量
P5:p++;//从下一个字符开始匹配
*/
/*
C7F
*/
/*
C7G
P1:找最小线段
P2:判断每个点与其他点的距离是否为正方体特征可重集
*/
/*
C7H-skip
*/
/*
C7I
*/
/*
C7J-skip
*/
/*
E7A
in len=strlen(s)
prstn(s+len-k)可自动尾删k个字符
然而:题解所用的gets已弃用,而fgets最后有换行符
但是:最后一组数据末尾不一定有换行符,避免基于此操作
*/
//#include<stdio.h>
//#include<string.h>
//int main() {
// int T, k;
// char s[1008];
// scanf("%d", &T);
// while (T--)
// {
// scanf("%d", &k);
// fgets(s,sizeof(s),stdin);
// if (s[strlen(s) - 1] == '\n')
// {
// s[strlen(s) - 1] = '\0';
// }
// printf("%s\n", s + strlen(s) - k);
// }
//}
/*
E7B
以下三种写法等价:
1.vd f(ll arr[],in size)
2.vd f(ll*arr,in size)
3.vd f(ll arr[num],in size)//num代任意给定数,会被忽略
对于多为数,以下两种写法等价
1.vd f(ll arr[][10]) //此处10有意义,不会被忽略
2.vd f(ll (*arr)[10])//与1中表达等价的数组指针
附二重指针(需要额外传长宽参数)
1.vd f(ll**arr)
*/
/*
E7C
*/
//in main()
//{
// in n;
// scin(n);
// in x;
// in cnt = 0;
// for (in i = 0; i < n; i++)
// {
// scin(x);
// uch* p = (uch*)&x;
// for (in j = 0; j < 4; j++)
// {
// pr("%02x",p[j]);
// prb;
// if (p[j] == 114)
// {
// cnt++;
// }
// }
// prn;
// }
// prin(cnt);
// rt 0;
//}
/*
E7D
*/
//ch s[100005];
//in main()
//{
// in n;
// scin(n);
// while (n--)
// {
// in m, k;
// scin2(m, k);
// scst(s);
// in ans = 0;
// for (in i = 0; s[i] != '\0'; i++)
// {
// ans = (ans * m + s[i] - '0') % k;
// }
// prinn(ans);
// }
// rt 0;
//}
/*
E7E
*/
/*
E7G
P1:一个计算器函数:
vd cal(in 操作数1,in 操作数2,in x,ch c(操作符号))
{
根据c的加减乘除确定对s1[x]=s1[op1]?s1[op2]
}
???
*/
/*
E7H-skip
*/
/*
E7I-skip
*/
/*
E7J-skip
*/
/*
C8B
*/
typedef in(*cmp_fn)(const vd*, const vd*);
vd swap(ll* a, ll* b)
{
ll temp = *a;
*a = *b;
*b = temp;
}
in llcmp_up(const vd* a, const vd* b)
{//int升序
ll x = *(const ll*)a;
ll y = *(const ll*)b;
if (x < y) rt - 1;
if (x > y) rt 1;
rt 0;
}
//快速排序(in版)(优化重复;cmp升序版;单元;嵌swap;嵌自定义cmp)[l,r]
vd quick_csort_3w(ll arr[], in l, in r, cmp_fn cmp)
{//调用时:quick_csort_3w(arr,l,r,incmp_up)
if (l >= r) rt;
ll pivot = arr[l];
in lt = l;
in gt = r;
in i = l;
while (i <= gt)
{
in res = cmp(&arr[i], &pivot);
if (res < 0)
swap(&arr[i++], &arr[lt++]);
else if (res > 0)
swap(&arr[i], &arr[gt--]);
else
i++;
}
quick_csort_3w(arr, l, lt - 1, cmp);
quick_csort_3w(arr, gt + 1, r, cmp);
}
//对排序数组去重(src[0,srcSize-1]存入dest[0,*destSize-1])
vd remove_same(const ll src[], in srcSize, ll dest[], in* destSize)
{
if (srcSize == 0)
{
*destSize = 0;
rt;
}
dest[0] = src[0];
in count = 1;
for (in i = 1; i < srcSize; ++i)
{
if (src[i] != src[i - 1])
{
dest[count++] = src[i];
}
}
*destSize = count;
}
//辅助一维数组输出([0,n))(自动去除换行符号)
vd pr_arr1(ll arr[], in n)
{
for (in i = 0; i < n; i++)
{
pr("%lld%c ", arr[i], " \n"[i == n - 1]);
}
}
ll arr[1000005];
ll dest[1000005];
in main()
{
in n;
scin(n);
for (in i = 0; i < n; i++)
{
scll(arr[i]);
}
quick_csort_3w(arr, 0, n - 1, llcmp_up);
in s = 1000000;
in* size = &s;
remove_same(arr, n, dest, size);
pr_arr1(dest, *size);
}
最新发布