1. 程式人生 > 其它 >基於Windows系統搭建一個MQTT Broker

基於Windows系統搭建一個MQTT Broker

A
考慮無解的情況。顯然\(n\)為奇數無解,然後\()\)在開頭,\((\)在結尾無解。
然後似乎沒有其它反例了。
於是就過了。
code:

#include<bits/stdc++.h>
#define I inline
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define abs(x) ((x)>0?(x):-(x))
#define re register
#define ll long long
#define db double
#define N 100
#define M 200000
#define mod 998244353
#define eps (1e-7)
#define U unsigned int
#define IT set<ques>::iterator
#define Gc() getchar() 
#define Me(x,y) memset(x,y,sizeof(x))
using namespace std;
int n,T,flag;char s[N+5];
int main(){
	re int i,j;scanf("%d",&T);while(T--){
		scanf("%s",s+1);n=strlen(s+1);printf("%s\n",((n&1)||s[1]==')'||s[n]=='(')?"NO":"YES");
	}
}

B
\(f_{i,j}\)為第一個序列到了\(i\),第二個序列到了\(j\)的最大值,隨便轉移即可。複雜度\(O(Tn^2)\)
code:

#include<bits/stdc++.h>
#define I inline
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define abs(x) ((x)>0?(x):-(x))
#define re register
#define ll long long
#define db double
#define N 100
#define M 200000
#define mod 998244353
#define eps (1e-7)
#define U unsigned int
#define IT set<ques>::iterator
#define Gc() getchar() 
#define Me(x,y) memset(x,y,sizeof(x))
using namespace std;
int n,m,T,flag,A[N+5],B[N+5],dp[N+5][N+5];
int main(){
	freopen("1.in","r",stdin);
	re int i,j;scanf("%d",&T);while(T--){
		scanf("%d",&n);for(i=1;i<=n;i++) scanf("%d",&A[i]),A[i]+=A[i-1];scanf("%d",&m);for(i=1;i<=m;i++) scanf("%d",&B[i]),B[i]+=B[i-1];
		Me(dp,-0x3f);dp[0][0]=0;for(i=0;i<=n;i++){
			for(j=0;j<=m;j++) {
				i&&(dp[i][j]=max(dp[i][j],max(dp[i-1][j],A[i]+B[j])));
				j&&(dp[i][j]=max(dp[i][j],max(dp[i][j-1],A[i]+B[j])));
			}
		}printf("%d\n",dp[n][m]);
	}
}

C
cqy大佬寫的,沒看。
D
你會發現那個\(5\)很詭異,比\(log\)小那麼一點點。
我們考慮這樣一個naive方法,進行\(n-1\)\((i,i+1)\),那麼最後剩下\(n\)沒法弄。
我們考慮在\((i,i+1)\)過程中保留一些\(i\)不操作用來消去\(n\)
如果你做過花神遊歷各國那道題你大概記著\(10^9\)開根號到\(1\)\(6\)次。
然後\(2\times 10^5\)就差不多是\(5\)次。
於是每次找到根號那個不弄然後做下去即可。
code:

#include<bits/stdc++.h>
#define I inline
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define abs(x) ((x)>0?(x):-(x))
#define re register
#define ll long long
#define db double
#define N 300000
#define M 200000
#define mod 998244353
#define eps (1e-7)
#define U unsigned int
#define IT set<ques>::iterator
#define Gc() getchar() 
#define Me(x,y) memset(x,y,sizeof(x))
using namespace std;
int n,m,T,A[N+5],fl[N+5],now,x[N+5],y[N+5],cnt,pus;
I void insert(int u,int v){x[++cnt]=u;y[cnt]=v;}
int main(){
	freopen("1.in","r",stdin);
	re int i,j;scanf("%d",&T);while(T--){
		scanf("%d",&n);for(i=1;i<=n;i++) A[i]=i,fl[i]=0;cnt=0;now=n;fl[n]=1;while(now>2)pus=ceil(sqrt(now)),fl[pus]=1,now=pus;
		for(i=1;i<=n;i++)!fl[i]&&(insert(i,i+1),0);now=n;while(A[now]>2){
			pus=ceil(sqrt(A[now])),insert(now,pus),insert(now,pus);now=pus;
		}
		printf("%d\n",cnt);for(i=1;i<=cnt;i++) printf("%d %d\n",x[i],y[i]); 
	}
}

E
cqy大佬寫的,沒看。
F
毛子真的不會資料結構(
首先我們考慮一根鏈掛上去肯定是中間一折兩邊一邊一半。
然後掛鏈的順序肯定是從大到小因為如果小的掛上去可能會出現最後大的沒地方掛的處境。
最後掛鏈肯定是掛能掛的最上面。
然後每掛完一根鏈記錄一下答案,最後取\(min\)即可。
這個東西用線段樹很好維護。時間複雜度\(O(nlogn)\)
但是這道題有單調性可以\(O(n)\)
具體的排序用桶排。發現我們要找最淺的和第\(k\)淺的點,這些點都是單調的,用差分維護一下即可。
弄個指標維護一下就是\(O(n)\)的。
code(線段樹的):

#include<bits/stdc++.h>
#define I inline
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define abs(x) ((x)>0?(x):-(x))
#define re register
#define ll long long
#define db double
#define N 400000
#define W 400000
#define mod 998244353
#define eps (1e-7)
#define U unsigned int
#define IT set<ques>::iterator
#define Gc() getchar() 
#define Me(x,y) memset(x,y,sizeof(x))
using namespace std;
int n,k,A[N+5],ans=1e9,now,pus;ll F[N+5<<2],sum[N+5<<2];
I void pushF(int l,int r,int x){F[x]+=F[x>>1];sum[x]+=F[x>>1]*(r-l+1);}
I void push(int l,int r,int x){if(!F[x]) return;int m=l+r>>1;pushF(l,m,x<<1);pushF(m+1,r,x<<1|1);F[x]=0;}
I void get(int x,int y,int z,int l=0,int r=W,int now=1){
	if(x<=l&&r<=y){F[now]+=z;sum[now]+=z*(r-l+1);return;}int m=l+r>>1;push(l,r,now);
	x<=m&&(get(x,y,z,l,m,now<<1),0);y>m&&(get(x,y,z,m+1,r,now<<1|1),0);sum[now]=sum[now<<1]+sum[now<<1|1];
}
I int find(int z,int l=0,int r=W,int now=1){
	if(l==r) return l;int m=l+r>>1;push(l,r,now);/*printf("%d %d %d %d\n",l,r,sum[now],z);*/return sum[now<<1]>=z?find(z,l,m,now<<1):find(z-sum[now<<1],m+1,r,now<<1|1);
}
int main(){
	freopen("1.in","r",stdin);
	re int i;scanf("%d%d",&n,&k);for(i=1;i<=n;i++) scanf("%d",&A[i]);sort(A+1,A+n+1);
	get(0,0,1);for(i=n;i;i--){
		now=find(1);get(now,now,-1);/*printf("%d\n",find(2));*/(A[i]>2)&&(get(now+2,now+1+(A[i]-1)/2,1),0);A[i]>1&&(get(now+2,now+1+A[i]/2,1),0);
		if(sum[1]>=k)now=find(k),ans=min(ans,now);//printf("%d\n",ans);
	}
	printf("%d\n",(ans==1e9)?-1:ans); 
}