叫小技巧的说

\(qwq\)

\(ZA\)

吉大附中 \(\text{OJ}\)$ \LaTeX $

张仰彪排序法的说 话说有人能证一下这个的时间复杂度吗qwq(\(\text{Done by jjdw}\))

\(\text{MiNa!}\)

然后有了一些小知识

\(\text{cout}\) 控制精度的高大上写法

叫做 \(\text{iomanip}\) 库里的函数的说

cout.precision(6); cout.setf(ios::fixed);

你看,这多么好事情...

\(\text{cout}\) 将整形变量以二进制形式输出

这个有点技术含量的说,不用自己画二进制了(尤其是相对难画的负数二进制)

\(\text{linux}\) 的自带计算器,,我不会用,不知道咋显示负数二进制

然后 c++er 就来了

实现用 \(\text{bieset}\)需要\(\text{#include}\) 一下 <\(\text{bitset}\)> 库

code
#include <iostream>
#include <iomanip>
#include <bitset>
#define GMY (520&1314)
#define char_phi signed
using namespace std;
int q;
void work(){
    cin >> q;
    cout << (bitset<32>)q << " " << q << endl;
    q = ~q;
    cout << (bitset<32>)q << " " << q << endl;
    q ^= 1;
    cout << (bitset<32>)q << " " << q << endl;
    q = ~q;
    cout << (bitset<32>)q << " " << q << endl;
    cout.precision(6); cout.setf(ios::fixed);
}
char_phi main(){
    freopen("a.in", "r", stdin);
    freopen("a.out", "w", stdout);
    work();
    return GMY;
}

这是我尝试用二进制实现减法的时候写的代码,然后没能实现。。。。。。不过发现了 \(\text{bitset}\) 的奇妙用法的说

\(\text{for}\) 循還內 \(/\) 外定義變量對效率的影響

原文(both證明)

總結

題庫編譯器高不高級..我覺得是挺高級的

但是有的時候編譯器是沒辦法決定要不要對你的在循環內定義進行優化..

當然了有的同學說會重複調用

應該指的是數組吧..

也許,我也不清楚,可能會對效率產生影響..

不過我也說不準,但是經常性地定義變量肯定是更慢的麼..

還有如果需要用到多次函數 \(\text{return}\) 的值,那你還是新建一個變量吧..

所以還是養成在循環外定義變量的好習慣吧~

\(\text{upd}\):使用次数多的时候就定义一个,一个是为了美观(比如前向星 e[i].v 定义成 v,一个是为了内存访问连续)

\(\text{sleep()}\)函数

衆所周知這玩意能起到暫停一小會的作用,怎麼應用我就不說了,,

  • \(\text{windows}\) 下是 Sleep(tim)

其中 tim 是以毫秒爲單位。比如 Sleep(1000) 就是暫停一秒鐘

該函數被包含在 <windows.h> 庫中

  • \(\text{linux}\) 下是 sleep(tim)// s!小写!!!

其中 tim 是以秒爲單位。比如 sleep(1) 就是暫停一秒鐘

該函數被包含在 <unistd.h> 庫中

随机化

\(\text{link}\) 感谢 \(\text{ckb}\) 大佬的馈赠

感觉随机化很好用 所以就特别想学 然而网上的随机化算法 \(\text{blog}\) 好少 还是只有模拟退火这么出名么

\(\text{Kaguya}\) 大佬魔改 \(\text{cin cout}\)

\(\text{Kaguya}\) 钛聚辣!\(\%\%\%\)

code
#include <iostream>
#include <iomanip>
#include <stdarg.h>
namespace kaguya
{
	void cin(int s, ...)
	{
		va_list vr;
		va_start(vr, s);
		for (int i = 0; i < s; i++)
			std::cin >> *va_arg(vr, int*);
		va_end(vr);
		return;
	}

	void cout(const char *s, ...)
	{
		int x = 0;
		va_list vr;
		for (int i = 0; s[i]; ++i)
			if (s[i] == '%' && s[i + 1] == 'd')
				++x;
		va_start(vr, x);
		for (int i = 0; s[i]; ++i)
			if (s[i] == '%')
			{
				if (s[i + 1] == 'd')
					std::cout << va_arg(vr, int);
				else if (s[i + 1] == '%')
					std::cout << '%';
				++i;
			}else
				std::cout << s[i];
		va_end(vr);
		return;
	}
}
int x, y;
signed main(){
    std::ios::sync_with_stdio(false), std::cin.tie(NULL), std::cout.tie(NULL);
    kaguya::cin(2, &x, &y);
    kaguya::cout("%d %d\n", x, y);
    return 0;
}

终端系统栈更改

虎哥讲的dsu

ulimit -s (内存大小,\(xMB × 1024\)),别写个乘号上去,算出来再写

这个就比如说本地系统栈不如评测环境系统栈多,所以本机递归可能炸掉

就比如今天下午 \(\text{SMTwy}\) 因为这玩意调了一下午

ulimit -s 是查看当前系统栈大小

任务管理器被极域控制而无法打开

\(\text{csp-s}\) 初赛前在楼下机房待着来着,然而任务管理器都不能开

好家伙,这能忍?

直接一波搞翻极域老窝

直接建一个 *.reg 文件(后缀是 .reg,名字无所谓),里边放上下面的代码,运行一下就 \(\text{OK}\)

注意下面代码第二行的空不能删

code
 Windows Registry Editor Version 5.00

 

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System]

"DisableTaskMgr"=dword:00

\(\text{luogu}\) 的大佬那里学来的新方

\(\text{cmd}\) 输入 taskkill /im studentmain.exe /f

还有一个长的,但好像写的比较生草,原理都是一样的(

this
#include<bits/stdc++.h>
#include <iostream>
#include <windows.h>
#include <string>
using namespace std;
void movexy(short x, short y){
    COORD position= {x, y};
    HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hOut, position);
}
int main(){
    movexy(50, 10);
    cout<<"反电子教室系统"<<endl;
    cout<<" <v1.3>"<<endl;
    cout<<endl;
    cout<<" By Deadpool123"<<endl;
    cout<<" 目前可以反击:"<<endl;
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED);
    cout<<" 红蜘蛛多媒体网络教室 - 输入 a即可反击"<<endl;
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 11);
    cout<<" 极域电子教室 - 输入 b即可反击"<<endl;
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12);
    cout<<" 伽卡他卡电子教室 - 输入 c即可反击"<<endl;
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 2);
    cout<<" 传奇电子教室 - 输入 d即可反击"<<endl;
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
    cout<<" 更多反击工具即将更新......"<<endl;
    cout<<" 如果在开启本程序后关闭本程序,"<<endl;
    cout<<" 本次反击将无效!"<<endl;
    cout<<" input >>> ";
    string s;
    cin>>s;
    if(s=="a"){
        system("cls");
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED);
        cout<<" 红蜘蛛反击系统启动成功"<<endl;
        Sleep(1000);
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
        while(1){
            system("taskkill /f /t /im REDAgent.exe");
            system("cls");
        }
    }
    else if(s=="b"){
        system("cls");
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 11);
        cout<<" 极域反击系统启动成功"<<endl;
        Sleep(1000);
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
        while(1){
            system("taskkill /f /t /im StudentMain.exe");
            system("cls");
        }
    }
    else if(s=="c"){
        system("cls");
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12);
        cout<<" 伽卡他卡反击系统启动成功"<<endl;
        Sleep(1000);
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
        while(1){
            system("taskkill /f /t /im Student.exe");
            system("cls");
        }
    }
    else if(s=="d"){
        system("cls");
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 2);
        cout<<" 传奇电子教室反击系统启动成功"<<endl;
        Sleep(1000);
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
        while(1){
            system("taskkill /f /t /im studentmain.exe");
            system("cls");
        }
    }
    return 0;
}

多个数的懒人 \(\text{max/min}\) 函数

比如这种情况:取 a, b, c, d, e, f, gmax

普通情况下咋写捏

普通情况下
a = MAX(MAX(MAX(a, b), MAX(MAX(c, d), MAX(e, f))), g)

然后 \(\text{Kagua}\) 大佬就整了一个同时取多个 max 的,只用写一遍 max 就行,注意传参第一个要传进去你这次想 max 多少个数,然后后边要取 \(\text{max/min}\) 的数的数据类型最好都一样(比如都是 int 类型)。

代码挺简单的。我把取 max 和取 min 的都放出来,这俩差不多

code
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
inline int Max(int cnt, ...){
	va_list tmp; va_start(tmp, cnt); int rtn = va_arg(tmp, int), res;
	for (re i = 1 ; i <= cnt-1 ; ++ i)
		res = va_arg(tmp, int), rtn = MAX(rtn, res);
	va_end(tmp);
	return rtn;
}
inline int Min(int cnt, ...){
	va_list tmp; va_start(tmp, int); int rtn = va_arg(tmp, int), res;
	for (re i = 1 ; i <= cnt-1 ; ++ i)
		res = va_arg(tmp, int), rtn = MIN(rtn, res);
	va_end(tmp);
	return rtn;
}

inline void work(){
	a = Max(7, a, b, c, d, e, f, g);
}

然后忽然发现一件事情:好像 \(\text{STL}\)max 就支持这玩意...a = max({a, b, c, d, e, f, g})

\(\text{pb_ds}\)

\(\text{MiNa!}\) 那里看到的

有关 \(\text{bitset}\) 的时间复杂度

\(\text{bitset}\) 的本质就是压位———\(\text{APJifengc}\)

\(\text{APJifengc}\) 大佬亲自指导:bitset 的与、或、异或、取反之类的实现基于 unsigned long long,故其时间复杂度为 \(\mathcal O(\frac{n}{w})\),其中 \(w = 64\)\(n\) 的大小并不会影响 \(w\),实测慢大概是因为代码本身常数。

posted @ 2022-06-29 17:28  char_phi  阅读(297)  评论(4编辑  收藏  举报