T1#include<bits/stdc++.h>using namespace std;using ll=long long;const int maxl=1e6+10;int n,m,tot,ans;int a[maxl];char s[maxl];inline void prework(){ cin>>n; for(int i=1;i<=n;i++) { int x;cin>>x; a[x]=i; } int x,y;cin>>x>>y; if(abs(a[x]-a[y])==1) puts("Yes"); else puts("No");}inline void mainwork(){ }inline void print(){ }int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); prework(); mainwork(); print(); return 0; }T2#include<bits/stdc++.h>using namespace std;using ll=long long;const int maxl=1e6+10;int n,m,tot;ll ans;ll a[maxl],sum[maxl];char s[maxl];inline void prework(){ cin>>n; for(int i=1;i<=n;i++) { cin>>a[i],sum[i]=sum[i-1]+a[i]; a[i+n]=a[i]; } for(int i=n+1;i<=2*n;i++) sum[i]=sum[i-1]+a[i]; int x,y; cin>>x>>y; if(x>y) swap(x,y); ll ans=min(sum[y-1]-sum[x-1],sum[x+n-1]-sum[y-1]); cout<<ans;}inline void mainwork(){ }inline void print(){ }int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); prework(); mainwork(); print(); return 0; }T3#include<bits/stdc++.h>using namespace std;using ll=long long;const int maxl=1e3+10;int n,m,tot;ll ans;int a[maxl][maxl];ll row[maxl],col[maxl];char s[maxl];inline void prework(){ cin>>n>>m; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { cin>>a[i][j]; row[i]+=a[i][j]; col[j]+=a[i][j]; }}inline void mainwork(){ ll you=0,xia=0,zuo=0,shang=0; for(int j=1;j<=m;j++) you+=col[j]; ans=you;xia=you; for(int j=1;j<m;j++) { you-=col[j]; zuo+=col[j]; ans=min(ans,abs(you-zuo)); } for(int i=1;i<n;i++) { shang+=row[i]; xia-=row[i]; ans=min(ans,abs(shang-xia)); }}inline void print(){ cout<<ans;}int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); prework(); mainwork(); print(); return 0; }T4 因为一定要整除,所以枚举所有因数就行了,然后构造完以后bfs或者dfs搞flood fill求连通块个数,O(nsqrt(n))#include<bits/stdc++.h>using namespace std;using ll=long long;const int maxl=1e6+10;int n,m,tot,ans;int a[maxl];string s;int tx[4]={0,1,0,-1};int ty[4]={1,0,-1,0};inline void prework(){ cin>>n; cin>>s;}inline void solv(int c){ vector<string> b;int nowid=0; int r=n/c; for(int i=1;i<=r;i++) { b.emplace_back(s.substr(nowid,c)); nowid+=c; } vector<vector<int>> vis(r,vector<int>(c,0)); auto bfs=[&](int ix,int iy) ->void { using pii=pair<int,int>; queue<pii> q; q.push({ix,iy});vis[ix][iy]=true; char ch=b[ix][iy]; while(q.size()) { pii d=q.front();q.pop(); for(int k=0;k<4;k++) { int x=d.first+tx[k],y=d.second+ty[k]; if(x<0 || x>=r || y<0 || y>=c || vis[x][y] || ch!=b[x][y]) continue; vis[x][y]=1; q.push({x,y}); } } }; int cnt=0; for(int i=0;i<r;i++) for(int j=0;j<c;j++) if(!vis[i][j]) { cnt++; bfs(i,j); } ans=min(ans,cnt);}inline void mainwork(){ ans=n;int up=sqrt(n); for(int i=1;i<=up;i++) if(n%i==0) solv(i),solv(n/i);}inline void print(){ cout<<ans;}int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); prework(); mainwork(); print(); return 0; }T5 设dp[u][1]表示u为染红点,某个子节点也染红,u子树最多的染色点个数,dp[u][0]则表示u不染色的子树最多个数。可以注意到dp[u][1]如果选择把a[u]和a[v]染红,那么转移的时候v只能选择dp[v][0],因为要求v之前不被染色#include<bits/stdc++.h>using namespace std;using ll=long long;const int maxl=1e6+10;int n,m,tot,ans;ll a[maxl];int dp[maxl][2];char s[maxl];vector<int> e[maxl];inline void prework(){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<n;i++) { int u,v;cin>>u>>v; e[u].emplace_back(v); e[v].emplace_back(u); }}inline bool x2(ll x,ll y){ ll d=sqrt(x*y); return d*d==x*y;}inline void dfs(int u,int fa){ for(int &v:e[u]) { if(v==fa) continue; dfs(v,u); dp[u][0]+=max(dp[v][1],dp[v][0]); } for(int &v:e[u]) { if(v==fa || !x2(a[u],a[v])) continue; dp[u][1]=max(dp[u][1],dp[u][0]-max(dp[v][0],dp[v][1])+2+dp[v][0]); }}inline void mainwork(){ dfs(1,0); ans=max(dp[1][0],dp[1][1]);}inline void print(){ cout<<ans;}int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); prework(); mainwork(); print(); return 0; }