A
题意: 找出最小值之间最小的标号差
#include <bits/stdc++.h>
#define ll long long
#define N 100005
#define INF 0x3f3f3f3f
using namespace std;
typedef struct node{
ll vul;int x;
friend bool operator <(node aa,node bb){
if(aa.vul==bb.vul) return aa.x<bb.x;
return aa.vul<bb.vul;
}
}node;
node a[N];
int main(){
ios::sync_with_stdio(false);
int n;cin>>n;
for(int i=1;i<=n;i++) {
cin>>a[i].vul;a[i].x=i;}
sort(a+1,a+n+1);
int minn=INF;
for(int i=2;i<=n;i++){
if(a[i].vul!=a[i-1].vul) break;
minn=min(minn,a[i].x-a[i-1].x);
}
cout<<minn<<endl;
return 0;
}
B
题意:给你两块蛋糕分成n份 问怎么分使所有人蛋糕的最小值最大 要求 同一个人来的蛋糕只能来自同一份
#include <bits/stdc++.h>
using namespace std;
int n,a,b;
bool check(int mid){
int t=a/mid;int tt=b/mid;
if(t==0||tt==0) return false;
if(t+tt>=n) return true;
else return false;
}
int main(){
ios::sync_with_stdio(false);
cin>>n>>a>>b;
int l=1;int r=max(a,b);
int ans;
while(l<=r){
int mid=(l+r)>>1;
if(check(mid)) {
ans=mid;l=mid+1;
}
else r=mid-1;
}
cout<<ans<<endl;
return 0;
}
C
题意:打表题 特判几种情况就行(证明可以通过数学归纳法证明
#include <bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
int t1,t2,t3;cin>>t1>>t2>>t3;
if(t1==1||t2==1||t3==1){
cout<<"YES"<<endl;
}
else if(t1==3&&t2==3&&t3==3) cout<<"YES"<<endl;
else{
int cnt=0;
if(t1==2) cnt++;
if(t2==2) cnt++;
if(t3==2) cnt++;
int cnt1=0;
if(t1==4) cnt1++;
if(t2==4) cnt1++;
if(t3==4) cnt1++;
if(cnt>=2||(cnt1==2&&cnt==1)) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
D
题意:问交换[l,r]区间的内的数后 整个区间的逆序对个数为奇数还是偶数
#include <bits/stdc++.h>
int a[1505];
using namespace std;
int main(){
ios::sync_with_stdio(false);
int n;cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
int cnt=0;
for(int i=1;i<=n;i++){
for(int j=1;j<i;j++){
if(a[j]>a[i]) cnt++;
}
}
bool flag;
if(cnt%2) flag=1;
else flag=0;
int m;cin>>m;
int l,r;
//cout<<flag<<endl;
for(int i=1;i<=m;i++){
cin>>l>>r;
int t=(r-l+1)/2;
if(t%2){
if(flag==1) flag=0;
else flag=1;
}
if(flag) cout<<"odd"<<endl;
else cout<<"even"<<endl;
}
return 0;
}
E
题意:按题意模拟即可
#include <bits/stdc++.h>
#define N 400005
using namespace std;
stack<int>s;
int a[N],n,m,ans[N],x,y,cnt;
bool vis[N];
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++) cin>>a[i];
for(int i=1;i<=m;i++) vis[a[i]]++;
for(int i=1;i<=m;i++){
while(s.empty()||s.top()>a[i]) s.push(a[i]),i++;
if(i<=m){
while(!s.empty()&&s.top()<a[i]){
if(s.top()!=cnt+1){printf("-1\n");return 0;}
ans[++cnt]=a[i];s.pop();
}
s.push(a[i]);
}
}
x=1;
cnt=m;
for(int i=1;i<=m;i++) ans[i]=a[i];
int flag=0;
while(cnt<n){
if(!s.empty()){
y=s.top();
for(int i=y;i>=x;i--) {
if(!vis[i])ans[++cnt]=i;}
x=y+1;s.pop();
}else{
for(int i=n;i>=x;i--) {
if(!vis[i])ans[++cnt]=i;}
if(cnt<n){printf("-1\n");flag=1;break;}
}
}
if(flag==0){
for(int i=1;i<n;i++) printf("%d ",ans[i]);
printf("%d\n",ans[n]);}
return 0;
}
F:
题解:构造一条直径(直径的构造 从任意一点出发找最远的点 然后从这个点找最远的点 这两个点就是直径的端点) 然后对于不在直径上点按照度进行删除即可
#include <bits/stdc++.h>
#define N 200005
#define ll long long
using namespace std;
int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return f*x;
}
vector<int>vec[N];
vector<pair<int,int> >v;
int tt,mx_tt,t1,t2,n;
bool vis[N];
int dis[N],dis1[N];int fa[N],fa1[N];
stack<int>s1;stack<int>s2;
int du[N];
void dfs(int u,int pre,int dep){
if(tt<dep){
tt=dep;mx_tt=u;
}
for(int i=0;i<vec[u].size();i++){
if(vec[u][i]!=pre){
dfs(vec[u][i],u,dep+1);
}
}
}
void bfs(int t){
queue<int>que;que.push(t);
fa[t]=-1;
memset(dis,0,sizeof(dis));
while(!que.empty()){
int p=que.front();que.pop();
for(int i=0;i<vec[p].size();i++){
if(vec[p][i]!=fa[p]){
fa[vec[p][i]]=p;
dis[vec[p][i]]=dis[p]+1;
que.push(vec[p][i]);
}
}
}
tt=-1;
for(int i=1;i<=n;i++){
if(tt<dis[i]){
tt=dis[i];t2=i;
}
}
int ttt=t2;
while(ttt!=-1){
vis[ttt]=1;
ttt=fa[ttt];
}
return ;
}
void bfs2(int t){
queue<int>que;que.push(t);
memset(dis1,0,sizeof(dis1));
fa1[t]=-1;
while(!que.empty()){
int p=que.front();que.pop();
for(int i=0;i<vec[p].size();i++){
if(vec[p][i]!=fa1[p]){
dis1[vec[p][i]]=dis1[p]+1;
fa1[vec[p][i]]=p;
que.push(vec[p][i]);
}
}
}
return ;
}
int main(){
//ios::sync_with_stdio(false);
n=read();
for(int i=1;i<n;i++){
t1=read();t2=read();
vec[t1].push_back(t2);
vec[t2].push_back(t1);
du[t1]++;du[t2]++;
}
tt=-1;
dfs(1,-1,1);
t1=mx_tt;
bfs(t1);
bfs2(t2);
queue<int>que;
for(int i=1;i<=n;i++){
if(vis[i]==0&&du[i]==1) que.push(i);
}
//cout<<t1<<" "<<t2<<endl;
ll ans=0;
while(!que.empty()){
int p=que.front();que.pop();
ans+=max(dis[p],dis1[p]);
if(dis[p]>=dis1[p]){
v.push_back(make_pair(t1,p));
}
else v.push_back(make_pair(t2,p));
for(int i=0;i<vec[p].size();i++){
du[vec[p][i]]--;
if(du[vec[p][i]]==1&&vis[vec[p][i]]==0) que.push(vec[p][i]);
}
}
int ttt=t2;
while(fa[ttt]!=-1){
ans+=dis[ttt];
v.push_back(make_pair(t1,ttt));
ttt=fa[ttt];
}
printf("%I64d\n",ans);
for(int i=0;i<v.size();i++){
//cout<<v[i].first<<" "<<v[i].second<<" "<<v[i].second<<endl;
printf("%d %d %d\n",v[i].first,v[i].second,v[i].second);
}
return 0;
}
G
#include <bits/stdc++.h>
#define N 200005
using namespace std;
typedef struct node{
int cnt[101];
}node;
node d[N*6];
int vis[N];
int n,m;
int t1,t2;
int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return f*x;
}
void push(int root){
for(int i=1;i<101;i++){
d[root<<1].cnt[i]=d[root].cnt[d[root<<1].cnt[i]];
d[root<<1|1].cnt[i]=d[root].cnt[d[root<<1|1].cnt[i]];
}
for(int i=1;i<101;i++) d[root].cnt[i]=i;
}
void built(int root,int l,int r){
push(root);
if(l==r){
return ;
}
int mid=(l+r)>>1;
built(root<<1,l,mid);
built(root<<1|1,mid+1,r);
}
void update(int root,int l,int r,int l1,int r1,int t,int e){
if(l<=l1&&r1<=r){
for(int i=1;i<101;i++){
if(d[root].cnt[i]==t) d[root].cnt[i]=e;
}
return ;
}
int mid=(l1+r1)>>1;
push(root);
if(l<=mid) update(root<<1,l,r,l1,mid,t,e);
if(r>mid) update(root<<1|1,l,r,mid+1,r1,t,e);
}
void querty2(int root,int l,int r){
if(l==r){
if(d[root].cnt[vis[l]]!=vis[l]) vis[l]=d[root].cnt[vis[l]];
return ;
}
int mid=(l+r)>>1;
push(root);
querty2(root<<1,l,mid);
querty2(root<<1|1,mid+1,r);
}
int main(){
n=read();
int ch,ch1;
for(int i=1;i<=n;i++){
ch=read();
vis[i]=ch;
}
built(1,1,n);int l,r;
m=read();
for(int i=1;i<=m;i++){
l=read();r=read();ch=read();ch1=read();
update(1,l,r,1,n,ch,ch1);
}
querty2(1,1,n);
for(int i=1;i<=n;i++){
if(i==1) printf("%d",vis[i]);
else printf(" %d",vis[i]);
}
// puts("");
return 0;
}