題目
3802,3803,3804.
失分小結
估分
100+20+80=200
實際分數
65+0+0=65
小C:你是打醬油的麼
我:我本來可以拿200的!
小C:騙誰啊
三題都炸,最爛的一次…
第一題內存開小…
第二題…本來也就只寫了P20然後還編譯錯誤…
第三題依舊編譯錯誤…我恨重載!!少加了個const
…以及ans沒開long long
題解
T1
P65
真的只是無聊給你們看看內存開小的後果
CODE
#include<cstdio>
#include<algorithm>
#define N 100005
int n,m;
int Q[N],Q2[N],l1=1,l2=1,r1,r2;
inline int top() {
int t1=-2e9,t2=-2e9;
if(l1<=r1)t1=Q[l1];
if(l2<=r2)t2=Q2[l2];
if(t1>=t2) {
l1++;
return t1;
}
l2++;
return t2;
}
bool cmp(int _,int __) {return _>__;}
int main() {
int i;
scanf("%d%d",&n,&m);
for(i=1; i<=n; i++)scanf("%d",&Q[i]);
std::sort(Q+1,Q+1+n,cmp);
r1=n;
i=0;
while(++i) {
int x=top();
if(x<i) {
--i;
break;
}
if(x==i)break;
Q2[++r2]=x-m+1;
}
printf("%d",i);
return 0;
}
P100
CODE
#include<cstdio>
#include<algorithm>
#define N 500005
int n,m;
int Q[N],Q2[N],l1=1,l2=1,r1,r2;
inline int top() {
int t1=-2e9,t2=-2e9;
if(l1<=r1)t1=Q[l1];
if(l2<=r2)t2=Q2[l2];
if(t1>=t2) {
l1++;
return t1;
}
l2++;
return t2;
}
bool cmp(int _,int __) {return _>__;}
int main() {
int i;
scanf("%d%d",&n,&m);
for(i=1; i<=n; i++)scanf("%d",&Q[i]);
std::sort(Q+1,Q+1+n,cmp);
r1=n;
i=0;
while(++i) {
int x=top();
if(x<i) {
--i;
break;
}
if(x==i)break;
Q2[++r2]=x-m+1;
}
printf("%d",i);
return 0;
}
T2
狀壓dp.
P100
CODE
#include<cstdio>
#include<cmath>
#include<memory.h>
#define M 20
#define reg register/*不要在意這些細節*/
typedef long long LL;
inline void rd(int &x) {
x=0;char c;
while(c=getchar(),c<48);
do x=(x<<3)+(x<<1)+(c&15);
while(c=getchar(),c>47);
}
int cnt[M],A[100005];
LL cost[1<<M][M];
LL dp[1<<M],val[M][M];
inline void Min(LL &a,LL b) {if(a>b)a=b;}
int main() {
int n,k;
rd(n),rd(k);
for(reg int i=1; i<=n; i++)rd(A[i]),A[i]--;
for(reg int i=n; i>=1; i--) {
for(reg int j=0; j<k; j++)
if(j!=A[i])
val[A[i]][j]+=cnt[j];
cnt[A[i]]++;
}
for(reg int i=0; i<k; i++)
for(reg int j=1; j<(1<<k); j++)
if(!(j&(1<<i))) {
reg int x=j&-j;
cost[j][i]=cost[j-x][i]+val[i][(int)log2(x)];
}
memset(dp,127,sizeof dp);
dp[0]=0;
for(reg int i=0; i<(1<<k); i++)
for(reg int j=0; j<k; j++)
if(!(i&(1<<j)))
Min(dp[i|(1<<j)],dp[i]+cost[i][j]);
printf("%lld\n",dp[(1<<k)-1]);
return 0;
}
T3
P80
CODE
#include<cstdio>
#include<memory.h>
#include<algorithm>
#define N 100005
using namespace std;
struct node2 {int to,nxt;}edge[N<<1];
int head[N],tot;
int dep[N],fa[N],sz[N],son[N],top[N];
struct node {
int a,b,lca;
bool operator<(const node _)const/*就是這個const!!!*/ {return dep[lca]>dep[_.lca];}
} A[N];
void dfs1(int x) {
sz[x]=1;
for(int i=head[x]; ~i; i=edge[i].nxt) {
node2 y=edge[i];
if(y.to==fa[x])continue;
fa[y.to]=x;
dep[y.to]=dep[x]+1;
dfs1(y.to);
sz[x]+=sz[y.to];
if(sz[son[x]]<sz[y.to])
son[x]=y.to;
}
}
void dfs2(int x,int tp) {
top[x]=tp;
if(son[x])dfs2(son[x],tp);
for(int i=head[x]; ~i; i=edge[i].nxt) {
int y=edge[i].to;
if(y==fa[x]||y==son[x])continue;
dfs2(y,y);
}
}
int LCA(int a,int b) {
while(top[a]!=top[b]) {
if(dep[top[a]]>dep[top[b]])a=fa[top[a]];
else b=fa[top[b]];
}
return dep[a]>dep[b]?b:a;
}
int du[N];
bool cmp(node a,node b) {return a.a<b.a;}
int main() {
int n,m,a,b;
scanf("%d %d",&n,&m);
memset(head,-1,sizeof head);
bool flag=1;
for(int i=1; i<n; i++) {
scanf("%d %d",&a,&b);
edge[tot]=(node2) {b,head[a]},head[a]=tot++;
edge[tot]=(node2) {a,head[b]},head[b]=tot++;
du[a]++;
du[b]++;
if(a!=b+1&&b!=a+1)flag=0;
}
dfs1(1);
dfs2(1,1);
for(int i=1; i<=m; i++) {
scanf("%d %d",&A[i].a,&A[i].b);
A[i].lca=LCA(A[i].a,A[i].b);
if(A[i].a>A[i].b) {
int t=A[i].a;
A[i].a=A[i].b;
A[i].b=t;
}
}
long long ans=0;
if(!flag) {//非鏈
sort(A+1,A+m+1);
for(int i=1; i<=m; i++) {
for(int j=i+1; j<=m; j++) {
int lcai=A[i].lca,lcaj=A[j].lca;
if(lcai!=lcaj&&lcai!=A[j].a&&lcai!=A[j].b) {
if(dep[lcai]==dep[lcaj])continue;
int cnt=0;
bool f=0;
if(dep[lcai]<=dep[A[j].a])cnt++;
if(dep[lcai]<=dep[A[j].b])f=1,cnt++;
if(cnt==0)continue;
else if(cnt==1) {
if(f&&LCA(lcai,A[j].b)==lcai)ans++;
else if(LCA(lcai,A[j].a)==lcai)ans++;
} else {
cnt=0;
if(LCA(lcai,A[j].a)!=lcai)cnt++;
if(LCA(lcai,A[j].b)!=lcai)cnt++;
if(cnt==1)ans++;
}
} else ans++;
}
}
} else {//鏈
sort(A+1,A+m+1,cmp);
for(int i=1; i<m; i++) {
int x=A[i].b,pos=i;
int L=i+1,R=m;
while(L<=R) {
int mid=(L+R)>>1;
if(A[mid].a<=x) {
L=mid+1;
pos=mid;
} else R=mid-1;
}
ans+=pos-i;
}
}
printf("%lld\n",ans);
return 0;
}
P100
CODE
#include<cstdio>
#include<memory.h>
#define N 100005
using namespace std;
inline void rd(int &x){
x=0;char c;
while(c=getchar(),c<48);
do x=(x<<1)+(x<<3)+(c&15);
while(c=getchar(),c>47);
}
struct node2 {int to,nxt;}edge[N<<1];
int head[N],tot;
int dep[N],fa[N],sz[N],son[N],top[N];
void dfs1(int x) {
sz[x]=1;
for(register int i=head[x]; ~i; i=edge[i].nxt) {
node2 y=edge[i];
if(y.to==fa[x])continue;
fa[y.to]=x;
dep[y.to]=dep[x]+1;
dfs1(y.to);
sz[x]+=sz[y.to];
if(sz[son[x]]<sz[y.to])
son[x]=y.to;
}
}
void dfs2(int x,int tp) {
top[x]=tp;
if(son[x])dfs2(son[x],tp);
for(register int i=head[x]; ~i; i=edge[i].nxt) {
register int y=edge[i].to;
if(y==fa[x]||y==son[x])continue;
dfs2(y,y);
}
}
int LCA(int a,int b) {
while(top[a]!=top[b]) {
if(dep[top[a]]>dep[top[b]])a=fa[top[a]];
else b=fa[top[b]];
}
return dep[a]>dep[b]?b:a;
}
int sum[N],cnt[N];
long long ans=0;
void DFS(int x) {
for(register int i=head[x]; ~i; i=edge[i].nxt) {
register int y=edge[i].to;
if(y==fa[x])continue;
DFS(y);
sum[x]+=sum[y];
}
ans+=1LL*cnt[x]*sum[x]+1LL*cnt[x]*(cnt[x]-1)/2;
}
int main() {
int n,m,a,b,lca;
rd(n),rd(m);
memset(head,-1,sizeof head);
for(register int i=1; i<n; i++) {
rd(a),rd(b);
edge[tot]=(node2) {b,head[a]},head[a]=tot++;
edge[tot]=(node2) {a,head[b]},head[b]=tot++;
}
dfs1(1);
dfs2(1,1);
for(register int i=1; i<=m; i++) {
rd(a),rd(b);
lca=LCA(a,b);
sum[a]++;sum[b]++;sum[lca]-=2;cnt[lca]++;
}
DFS(1);
printf("%lld\n",ans);
return 0;
}