#include<bits/stdc++.h>usingnamespace std;#define mod 1000000007typedeflonglong ll;constint N =2e5+5;int d[N],tot=0,in[N];int num[N],ans[N];
vector<int>point[N];voiddfs(int pos,int pre){
in[pos]=++tot;for(int i =0; i < point[pos].size(); i++){int tem = point[pos][i];if(tem!=pre)dfs(tem,pos);}}intcmp(int a,int b){return in[a]<= in[b];}intmain(){int n;scanf("%d",&n);int cnt =0,a,b;for(int i =1; i< n ; i++){scanf("%d %d",&a,&b);
d[a]++; d[b]++;
point[a].push_back(b);
point[b].push_back(a);}if(n==1)printf("0\n");elseif(n==2)printf("1 2\n");else{int root=0;for(int i =1; i <= n ; i++)if(d[i]==1) ans[++cnt]= i;else root = i;dfs(root,-1);sort(ans+1,ans+1+cnt,cmp);int x =(cnt+1)/2;printf("%d\n",x);for(int i =1; i<=x ; i++)printf("%d %d\n",ans[i],ans[i+cnt/2]);}return0;}
D 签到模拟
#include<bits/stdc++.h>usingnamespace std;#define pb push_back#define mp make_pair#define fi first#define se secondtypedeflonglong ll;typedefunsignedlonglong ull;typedef pair<int,int> PII;typedef pair<ll, ll> pll;constint mod =1e9+7;constint N =2e5+10;constint INF =0x3f3f3f3f;
ll qpow(ll base, ll n){ll ans =1;while(n){if(n &1) ans = ans * base % mod; base = base * base % mod; n >>=1;}return ans;}
ll gcd(ll a, ll b){return b ?gcd(b, a % b): a;}intmain(){int h, m, s;scanf("%d:%d:%d",&h,&m,&s);int x = h *60*60+ m *60+ s;scanf("%d:%d:%d",&h,&m,&s);int y = h *60*60+ m *60+ s;printf("%d\n",abs(x - y));return0;}
F 单调队列
#include<bits/stdc++.h>usingnamespace std;typedeflonglong ll;constint N =5010;int a[N][N],g[N][N];int q1[N], q2[N],mx[N][N];intmain(){int n, m, k;scanf("%d %d %d",&n,&m,&k);for(int i =1; i <= n; i ++)for(int j =1; j <= m; j ++){if(!a[i][j])for(int t =1; t * i <= n && t * j <= m; t ++)
a[t * i][t * j]= i * j * t;//printf("%d %d %d \n",i,j,a[i][j]);}///单调队列
ll ans =0;for(int i =1; i <= n; i++){int l =1, r =1;for(int j =1; j <= m; j++){while(l<r && a[i][q1[r-1]]< a[i][j]) r--;///保持单调while(l<r && q1[l]< j-k+1) l++;///不在范围内
q1[r++]= j;if(j>=k) mx[i][j-k+1]= a[i][q1[l]];///第i行j个数和他前面k-1个数的最大值// printf("%d %d %d %d--%d %d %d\n",l,r,q1[l],q1[r],i,j,mx[i][j-k+1]);}}for(int j =1; j <= m; j++){int l =1, r =1;for(int i =1;i<=n;i++){while(l<r && mx[q2[r-1]][j]< mx[i][j]) r--;///保持单调while(l<r && q2[l]< i-k+1) l++;///不在范围内
q2[r++]= i;if(i>=k){
mx[i-k+1][j]= mx[q2[l]][j];
ans+= mx[i-k+1][j];}///第j列i个数和他前面k-1个的最大值}}printf("%lld\n", ans);return0;}
J 数论置换
#include<bits/stdc++.h>usingnamespace std;typedeflonglong ll;constint maxn=1e5+5;int n,k,cnt;int a[maxn],p[maxn],num[maxn],ans[maxn];bool v[maxn];intmain(){scanf("%d%d",&n,&k);for(int i =1; i <= n ; i++)scanf("%d",&a[i]);for(int i=1;i<=n;i++){if(!v[i]){
cnt++;///环个数int j=i;while(!v[j]){///寻找一个环
p[num[cnt]++]=j;///环的排列
v[j]=1;
j=a[j];}int re=k%num[cnt];for(j=0;j<num[cnt];j++)///求inv iif((ll)re*j%num[cnt]==1)break;for(int o=0;o<num[cnt];o++){
ans[p[o]]=p[(o+j)%num[cnt]];}}}for(int i=1;i<=n;i++)printf("%d ",ans[i]);return0;}