1.
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n;
ll a[500010];
ll al[500010],ar[500010];
ll bl[500010],br[500010];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
stack<ll >s1,s2;
s1.push(1);s2.push(1);
al[1]=bl[1]=0;
for(ll i=2;i<=n;i++)
{
while(!s1.empty()&&a[s1.top()]<=a[i])s1.pop();
while(!s2.empty()&&a[s2.top()]>=a[i])s2.pop();
if(s1.empty())al[i]=0;
else al[i]=s1.top();
if(s2.empty())bl[i]=0;
else bl[i]=s2.top();
s1.push(i);s2.push(i);
}
ar[n]=br[n]=n+1;
stack<ll >s3,s4;
s3.push(n);s4.push(n);
for(ll i=n-1;i>=1;i--)
{
while(!s3.empty()&&a[s3.top()]<a[i])s3.pop();
while(!s4.empty()&&a[s4.top()]>a[i])s4.pop();
if(s3.empty())ar[i]=n+1;
else ar[i]=s3.top();
if(s4.empty())br[i]=n+1;
else br[i]=s4.top();
s3.push(i);s4.push(i);
}
ll ans=0;
for(ll i=1;i<=n;i++)
{
ans+=(i-al[i])*(ar[i]-i)*a[i];
ans-=(i-bl[i])*(br[i]-i)*a[i];
}
cout<<ans<<"\n";
return 0;
}
2.
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int a[105][105];
int dp[105][105][105][105];
int Dp(int k,int l,int r,int cur)
{
if(dp[k][l][r][cur]==-1)
{
if(k==1)
{
dp[k][l][r][cur]=0;
return dp[k][l][r][cur];
}
else
{
dp[k][l][r][cur]=0x3f3f3f3f;
for(int i=1;i<=n;i++)
{
if(i==cur)continue;
if(i>l&&i<r&&a[cur][i]<0x3f3f3f3f)
{
int L=l,R=r;
if(i>cur)L=cur;
else R=cur;
dp[k][l][r][cur]=min(dp[k][l][r][cur],Dp(k-1,L,R,i)+a[cur][i]);
}
}
return dp[k][l][r][cur];
}
}
else return dp[k][l][r][cur];
}
int main()
{
cin>>n>>k>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i!=j)a[i][j]=0x3f3f3f3f;
}
}
for(int i=0;i<m;i++)
{
int x,y,w;
scanf("%d%d%d",&x,&y,&w);
a[x][y]=min(w,a[x][y]);
}
for(int i=0;i<=n+1;i++)
{
for(int j=0;j<=n+1;j++)
{
for(int w=0;w<=n+1;w++)
{
for(int q=0;q<=n+1;q++)
{
dp[i][j][w][q]=-1;
}
}
}
}
int output=0x3f3f3f3f;
for(int i=1;i<=n;i++)
{
output=min(output,Dp(k,0,n+1,i));
}
if(output==0x3f3f3f3f||output==-1)printf("-1\n");
else
printf("%d\n",output);
}
lca(最近公共祖先)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,m;
ll a[200010],b[200010],k[200010][20],d[200010];
vector<int >v[200010];
void dfs(int x)
{
for(int i=0;i<v[x].size();i++)
{
if(d[v[x][i]]==0)
{
d[v[x][i]]=d[x]+1;
k[v[x][i]][0]=x;
b[v[x][i]]=a[v[x][i]]^b[x];
int q=0,p=x;
while(k[p][q]>0)
{
k[v[x][i]][q+1]=k[p][q];
p=k[p][q++];
}
dfs(v[x][i]);
}
}
}
int lca(int a,int b)
{
if(d[a]<d[b])swap(a,b);
int q=log2(d[a])+1;
for(int i=q;i>=0;i--)
{
if(d[k[a][i]]>=d[b])a=k[a][i];
}
if(a==b)return a;
for(int i=q;i>=0;i--)
{
if(k[a][i]!=k[b][i])
{
a=k[a][i];
b=k[b][i];
}
}
if(k[a][0]==k[b][0])return k[a][0];
else return -1;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<n;i++)
{
int x,y;cin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
b[1]=a[1];
d[1]=1;
dfs(1);
while(m--)
{
int x,y;cin>>x>>y;
int z=lca(x,y);
if(z!=-1)
{
cout<<(b[x]^b[y]^a[z])<<"\n";
}
}
return 0;
}
4.
抽屉原理
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n;
int a[100010];
int b[100010];
vector<int> f[100010];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
int flag=-1;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[i]=(b[i-1]+a[i])%n;
f[b[i]%n].push_back(i);
if(f[b[i]%n].size()>=2)flag=b[i]%n;
if(f[0].size()>0)flag=0;
}
if(flag==-1)cout<<"-1\n";
else
{
if(flag==0)
{
cout<<f[0][0]<<"\n";
for(int i=1;i<=f[0][0];i++)cout<<i<<" ";
}
else
{
cout<<f[flag][1]-f[flag][0]<<"\n";
for(int i=f[flag][0]+1;i<=f[flag][1];i++)cout<<i<<" ";
}
}
return 0;
}
5.记得了解一下后缀最大值
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,q;
struct node
{
int id,x,y;
}a[1000010];
int b[1000010],c[1000010];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>q;
for(int i=1;i<=n;i++)cin>>b[i];
int maxn=-1;
vector<int >v;
for(int i=1;i<=q;i++)
{
cin>>a[i].id;
if(a[i].id==1)
{
cin>>a[i].x>>a[i].y;
c[a[i].x]=i;
}
else
{
cin>>a[i].x;
if(maxn==-1||a[maxn].x<a[i].x)
{
maxn=i;
v.clear();
}
else v.push_back(i);
}
}
int m=v.size();
vector<int>vm(m+1);
if(m!=0)
{
vm[m-1]=a[v[m-1]].x;
for(int i=m-2;i>=0;i--)
{
vm[i]=max(vm[i+1],a[v[i]].x);
}
}
for(int i=1;i<=n;i++)
{
if(maxn==-1)
{
if(c[i]==0)cout<<b[i];
else cout<<a[c[i]].y;
}
else
{
if(c[i]==0)
{
if(b[i]>a[maxn].x)cout<<b[i];
else cout<<a[maxn].x;
}
else
{
if(c[i]<maxn)
{
if(a[c[i]].y>a[maxn].x)cout<<a[c[i]].y;
else cout<<a[maxn].x;
}
else
{
if(a[c[i]].y>a[maxn].x)cout<<a[c[i]].y;
else
{
if(m==0)cout<<a[c[i]].y;
else
{
if(v[m-1]<c[i])cout<<a[c[i]].y;
else
{
int l=0,r=m-1;
while(l<r)
{
int mid=l+(r-l)/2;
if(v[mid]>c[i])r=mid;
else l=mid+1;
}
if(vm[l]>a[c[i]].y)cout<<vm[l];
else cout<<a[c[i]].y;
}
}
}
}
}
}
cout<<" ";
}
return 0;
}