1. 程式人生 > 其它 >【學習筆記】2022.1.24 - 清北學堂模擬賽

【學習筆記】2022.1.24 - 清北學堂模擬賽

T1 A

題面

思路

先離線。

然後方法就很多了,比如記憶化和帶權並查集

程式碼

//這是個記憶化搜尋
//吾日八省吾身:
//輸入多而不快讀乎?
//題目標註而不freopen乎?
//乘除並列先乘後除乎?
//不手撕樣例直接寫程式碼乎?
//不仔細讀題直接關頁面乎?
//1e9而不開long long乎?
//Ctrl+V而不改名稱乎?(papaw!!!)
//相信評測神機乎?
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<iomanip>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<algorithm>
#include<utility>
#include<deque>
#include<ctime>
#include<sstream>
#include<list>
#include<bitset>
using namespace std;
typedef long long ll;
const ll MAXN(1000233);
inline ll R(){
	ll x=0,f=1;char c='c';
	while(c>'9'||c<'0'){
		c=getchar();
		f=f*(c=='-'?-1:1);
	}
	while(c<='9'&&c>='0'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}
struct edge{
	ll to,nxt,val;	
}ed[MAXN];
ll head[MAXN],cnt,ans[MAXN],ces[MAXN],cece[MAXN],tot,pos[MAXN];
ll n,m,opt,a,x,y;
ll valv[MAXN];
ll rev[MAXN],tov[MAXN];
inline void add(ll fr,ll to,ll v){
	ed[++cnt].to=to;
	ed[cnt].val=v;
	ed[cnt].nxt=head[fr];
	head[fr]=cnt;
	return;
}
ll guagua;
ll DFS(ll now,ll ccccc){
	ll res=valv[now];
	if(tov[now]){
		res=rev[now];
		now=tov[now];
	}
	ll ha=valv[now];
	bool hava=true;
	for(ll i=head[now];i;i=ed[i].nxt)
		if(ccccc>=ed[i].val){
			ll uuuuu=DFS(ed[i].to,ccccc);
			res^=uuuuu,ha^=uuuuu,hava=false;
		}
	if(hava) guagua=now;
	rev[now]=ha;
	tov[now]=guagua;
	return res;
}
int main(){
	n=R();m=R();
	for(ll i=1;i<=n;++i){
		a=R();
		valv[i]=a;
	}
	for(ll i=1;i<=m;++i){
		opt=R();
		if(opt==1){
			x=R();y=R();
			add(x,y,i);
		}
		else{
			x=R();
			ces[++tot]=x;
			cece[tot]=i;
			pos[tot]=x;
		}
	}
	for(ll i=1;i<=tot;++i){
		ans[i]=DFS(ces[i],cece[i]);
		printf("%lld\n",ans[i]);
	}
	return 0;
}

T2 B

題面

思路

程式碼

T3 C

題面

思路

程式碼

T4 D

題面

思路

程式碼