题目:https://www.cometoj.com/contest/67/problem/A?problem_id=3799
A eon
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000010;
char s[maxn];
int main()
{
scanf("%s",s);
int mn=9;
int n=strlen(s);
for(int i=0;i<n;i++){
int tmp=s[i]-'0';
mn=min(mn,tmp);
}
int b=s[n-1]-'0';
printf("%d\n",(mn-b+10)%10);
return 0;
}
B usiness
#include<bits/stdc++.h>
using namespace std;
const int maxn=2010;
const int maxm=110;
int f[maxm][maxn],w[maxn];
int a[maxm],b[maxm];
int main()
{
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
memset(w,0,sizeof(w));
for(int i=0;i<=k;i++) scanf("%d",&w[i]);
for(int i=0;i<m;i++) scanf("%d%d",&a[i],&b[i]);
for(int i=0;i<=2000;i++) f[n+1][i]=i;
for(int i=n;i>=1;i--){
for(int j=0;j<=2000;j++){
f[i][j]=f[i+1][j+w[j]];
for(int p=0;p<m;p++){
if(j>=a[p]) f[i][j]=max(f[i][j],f[i][j-a[p]]+b[p]);
}
}
}
printf("%d\n",f[1][0]);
return 0;
}
C elebration
好题
用了树状数组的做法,用了快读才卡过去的
代码参考:https://www.cometoj.com/status/4a3caa6abfcc1b6a341b59dbafb18d30
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=4e6+5;
int n,a[maxn];
int l[maxn],r[maxn];
bool vis[maxn];
int ed,pos;
inline int read()
{
int res=0;
char ch;
while((ch=getchar())<'0'||ch>'9');
while(ch>='0'&&ch<='9') res=(res<<3)+(res<<1)+ch-'0',ch=getchar();
return res;
}
struct Tree{
const int mx=maxn-1;
ll val[maxn];
int lowbit(int x){
return x&(-x);
}
void Add(int x,int c){
for(;x<=mx;x+=lowbit(x)){
val[x]+=c;
}
}
ll Sum(int x){
ll res=0;
for(;x;x-=lowbit(x)){
res+=val[x];
}
return res;
}
}cnt,sum;
int main()
{
n=read();
for(int i=1;i<=n;i++) a[i]=read(),a[i+n]=a[i];
int li=(n-1)/2;//
ed=n*2-1;pos=ed;
for(int i=ed;i;i--){//计算r[]
while(vis[a[i]]) vis[a[pos--]]=0;
vis[a[i]]=1;
r[i]=min(pos,i+li-1);
}
for(int i=1;i<=n;i++) vis[a[i]]=0;
pos=1;
for(int i=1;i<=ed;i++){//计算l[]
while(vis[a[i]]) vis[a[pos++]]=0;
vis[a[i]]=1;
l[i]=max(pos,i-li+1);
}
ll ans=0;pos=1;
for(int i=1;i<=ed;i++){
while(pos<l[i]-1){//删点
cnt.Add(l[pos],-1);
sum.Add(l[pos],l[pos]-1);
pos++;
}
if(i>=n){
int p=i-n+1;
ans+=cnt.Sum(r[p]+1)*(r[p]+1)+sum.Sum(r[p]+1) ;
}
cnt.Add(l[i],1);//加点
sum.Add(l[i],-l[i]+1);
}
printf("%lld\n",ans/3);
return 0;
}
D isaster(kruscal重构树)
kruscal重构树:https://www.cnblogs.com/zwfymqz/p/9683523.html
参考代码:https://www.cometoj.com/status/dd47906d18d72c91c2076dc15668acb9
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=100010;
const int maxm=200010;
const int mod=998244353;
int n,m,q;
struct edge{
int v,nxt;
}e[maxm*2];
int head[maxn],tot,f[maxn];
struct edge2{
int u,v;
}e2[maxm];
bool cmp(const edge2 &x,const edge2 &y){//编号小的在前
return x.u==y.u?x.v<y.v:x.u<y.u;
}
void init()
{
tot=0;
memset(head,-1,sizeof(head));
for(int i=1;i<maxn;i++) f[i]=i;//
}
int find1(int x){
return x==f[x]?x:f[x]=find1(f[x]);
}
void addedge(int u,int v)
{
e[tot].v=v;e[tot].nxt=head[u];
head[u]=tot++;
}
int a[maxn],cnt;
int L[maxn],R[maxn],id[maxn];
int fa[maxn][22];
vector<int> G[maxn];
void dfs(int u,int p)
{
L[u]=++cnt;
id[cnt]=u;
fa[u][0]=p;
for(int i=1;i<20;i++) fa[u][i]=fa[fa[u][i-1]][i-1];
for(int i=head[u];~i;i=e[i].nxt){
int v=e[i].v;
if(v==p) continue;
dfs(v,u);
}
R[u]=cnt;
}
ll sum[maxn<<2];// T^T
void pushup(int rt){
sum[rt]=sum[rt<<1]*sum[rt<<1|1]%mod;
}
void build(int rt,int l,int r)
{
if(l==r){
sum[rt]=a[id[l]]%mod;
return;
}
int mid=(l+r)>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
pushup(rt);
}
void update(int rt,int l,int r,int pos,int v){
if(l==r){
sum[rt]=v%mod;
return;
}
int mid=(l+r)>>1;
if(pos<=mid) update(rt<<1,l,mid,pos,v);
else update(rt<<1|1,mid+1,r,pos,v);
pushup(rt);
}
ll query(int rt,int l,int r,int a,int b){
if(l>=a&&r<=b) return sum[rt];
ll res=1;
int mid=(l+r)>>1;
if(a<=mid) res=res*query(rt<<1,l,mid,a,b)%mod;
if(mid<b) res=res*query(rt<<1|1,mid+1,r,a,b)%mod;
return res;
}
ll query2(int x,int y){
if(x>y) return 0;
for(int i=19;i>=0;i--){
if(fa[x][i]&&fa[x][i]<=y)
x=fa[x][i];
}
return query(1,1,cnt,L[x],R[x]);
}
int main()
{
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int u,v,op;
for(int i=1;i<=m;i++){
scanf("%d%d",&u,&v);
if(u<v) swap(u,v);
e2[i].u=u;e2[i].v=v;
}
sort(e2+1,e2+m+1,cmp);
init();
for(int i=1;i<=m;i++){
u=find1(e2[i].u);
v=find1(e2[i].v);
if(u==v) continue;
if(u<v) swap(u,v);//important
addedge(u,v);
f[v]=u;
}
dfs(n,0);
build(1,1,n);
if(cnt!=n){
while(1);
}
for(int i=1;i<=q;i++){
scanf("%d%d%d",&op,&u,&v);
if(op==1){
printf("%lld\n",query2(u,v));
}else{
update(1,1,n,L[u],v);
}
}
}