A
直接做。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<ctime>
#include<cstdlib>
using namespace std;
#define mp make_pair
#define pb push_back
typedef pair<int,int> pii;
typedef long long ll;
typedef unsigned long long ull;
inline int read()
{
int x=0,f=1;char c=getchar();
while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
while(c>=‘0‘&&c<=‘9‘){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return x*f;
}
int main()
{
int n=read();
if(n<=125)puts("4");
else if(n<=211)puts("6");
else puts("8");
}
B
直接做。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<ctime>
#include<cstdlib>
using namespace std;
#define mp make_pair
#define pb push_back
typedef pair<int,int> pii;
typedef long long ll;
typedef unsigned long long ull;
inline int read()
{
int x=0,f=1;char c=getchar();
while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
while(c>=‘0‘&&c<=‘9‘){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return x*f;
}
int main()
{
int s=read(),t=read(),ans=0;
for(int i=0;i<=s;i++)
{
for(int j=0;j<=s-i;j++)
{
for(int k=0;k<=s-i-j;k++)
{
if(i*j*k<=t)ans++;
}
}
}
printf("%d",ans);
}
C
考虑从 \(T\) 最小的点转一圈,每个数的答案是前面的时间加上前面的 \(S\) 与 \(T\) 取 \(\min\)。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<ctime>
#include<cstdlib>
using namespace std;
#define int long long
#define mp make_pair
#define pb push_back
typedef pair<int,int> pii;
typedef long long ll;
typedef unsigned long long ull;
inline int read()
{
int x=0,f=1;char c=getchar();
while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
while(c>=‘0‘&&c<=‘9‘){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return x*f;
}
const int N=2e5+10;
int s[N],t[N],ans[N];
signed main()
{
int n=read();
for(int i=1;i<=n;i++)s[i]=read();
for(int i=1;i<=n;i++)t[i]=read();
int x=-1,mn=0x7fffffff;
for(int i=1;i<=n;i++)if(t[i]<mn)mn=t[i],x=i;
ans[x]=mn;
int sum=mn+s[x];
for(int i=1;i<n;i++)
{
int y=x+i;if(y>n)y-=n;
ans[y]=sum=min(sum,t[y]);
sum+=s[y];
}
for(int i=1;i<=n;i++)printf("%lld\n",ans[i]);
return 0;
}
D
考虑每条边的贡献,是去掉这条边之后的两个连通块大小的乘积,但仍然不好处理。考虑倒过来,那么就是加边操作,并查集维护 size 即可。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<ctime>
#include<cstdlib>
using namespace std;
#define mp make_pair
#define pb push_back
typedef pair<int,int> pii;
#define int long long
typedef long long ll;
typedef unsigned long long ull;
inline int read()
{
int x=0,f=1;char c=getchar();
while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
while(c>=‘0‘&&c<=‘9‘){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return x*f;
}
const int N=1e5+10;
int sz[N],f[N];
void init(int n){for(int i=1;i<=n;i++)f[i]=i,sz[i]=1;}
int getf(int x){return f[x]==x?x:f[x]=getf(f[x]);}
void merge(int x,int y)
{
int fx=getf(x),fy=getf(y);
sz[fx]+=sz[fy];
f[fy]=fx;
}
struct Edge{int u,v,w;}e[N];
bool cmp(Edge a,Edge b){return a.w<b.w;}
signed main()
{
int n=read();
for(int i=1;i<n;i++)e[i].u=read(),e[i].v=read(),e[i].w=read();
sort(e+1,e+n,cmp);
init(n);
int ans=0;
for(int i=1;i<n;i++)
{
int x=e[i].u,y=e[i].v,w=e[i].w;
int fx=getf(x),fy=getf(y);
ans+=sz[fx]*sz[fy]*w;
merge(x,y);
}
printf("%lld",ans);
}
E
bool cmp(node x,node y)
{
if(x.r!=y.r)return x.r<y.r;
else return x.l>y.l;
}
这样 sort 之后每次取最左边的空闲点即可。
AC之后就跑路了所以并不会证明正确性
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<ctime>
#include<cstdlib>
using namespace std;
#define mp make_pair
#define pb push_back
typedef pair<int,int> pii;
typedef long long ll;
typedef unsigned long long ull;
inline int read()
{
int x=0,f=1;char c=getchar();
while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
while(c>=‘0‘&&c<=‘9‘){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return x*f;
}
const int N=2e5+10;
struct node{int l,r;}a[N];
bool cmp(node x,node y)
{
// if(x.l!=y.l)return x.l<y.l;
// else return x.r<y.r;
if(x.r!=y.r)return x.r<y.r;
else return x.l>y.l;
}
int tot=0;
struct seg
{
int ls,rs,sum;
seg(){ls=rs=sum=0;}
}t[10000005];
void modify(int &p,int l,int r,int x)
{
if(!p)p=++tot;
if(l==r)
{
t[p].sum=1;
return;
}
int mid=(l+r)/2;
if(x<=mid)modify(t[p].ls,l,mid,x);
else modify(t[p].rs,mid+1,r,x);
t[p].sum=t[t[p].ls].sum+t[t[p].rs].sum;
}
int query(int p,int l,int r,int ql,int qr)
{
if(p==0)return 0;
if(ql<=l&&r<=qr)return t[p].sum;
int mid=(l+r)/2,sum=0;
if(ql<=mid)sum+=query(t[p].ls,l,mid,ql,qr);
if(qr>mid)sum+=query(t[p].rs,mid+1,r,ql,qr);
return sum;
}
void sol()
{
int n=read();
for(int i=1;i<=n;i++)a[i].l=read(),a[i].r=read();
sort(a+1,a+n+1,cmp);
for(int i=1;i<=tot;i++)t[i].ls=t[i].rs=t[i].sum=0;
tot=0;
int rt=0;
for(int i=1;i<=n;i++)
{
int l=a[i].l,r=a[i].r,pos=-1;
while(l<=r)
{
int mid=(l+r)/2;
if(query(rt,1,1000000000,l,mid)<mid-l+1)pos=mid,r=mid-1;
else l=mid+1;
}
if(pos==-1)return puts("No"),void();
modify(rt,1,1000000000,pos);
}
puts("Yes");
}
int main()
{
int T=read();
while(T--)sol();
return 0;
}
F
咕咕咕
G
咕咕咕
H
咕咕咕