版权声明:本文为博主原创文章,欢迎转载并注明来源。 https://blog.csdn.net/w_weilan/article/details/82054896
怒草评测姬
Buy and Resell
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Node
{
ll val,last;
bool operator<(const Node &u)const
{
return val!=u.val?val>u.val:last>u.last;
}
};
int t,n;
int main()
{
for(scanf("%d",&t); t--;)
{
scanf("%d",&n);
priority_queue<Node> q;
long long ans=0,cnt=0;
for(int i=0,w; i<n; ++i)
{
scanf("%d",&w);
if(q.empty())
{
q.push(Node {w,1});
continue;
}
Node u=q.top();
if(u.last>0)
{
if(w>u.val)
{
ans+=w-u.val;
cnt+=2;
q.pop();
q.push(Node {w,-1});
}
else
{
q.push(Node {w,1});
}
}
else
{
if(w<=u.val)q.push(Node {w,1});
else
{
q.pop();
ans+=w-u.val;
q.push(Node {u.val,1});
q.push(Node {w,-1});
}
}
}
printf("%lld %lld\n",ans,cnt);
}
}
Dream
#include<stdio.h>
int t,p;
int main()
{
for(scanf("%d",&t); t--;)
{
scanf("%d",&p);
for(int k=0; k<2; ++k)
for(int i=0; i<p; ++i,printf("\n"))
for(int j=0; j<p; ++j)
printf("%d ",i*j%p);
}
}
Find Integer
#include<bits/stdc++.h>
using namespace std;
int T,n,a;
int main()
{
scanf("%d",&T);
while (T--)
{
scanf("%d%d",&n,&a);
if (n==1) printf("%d %d\n",1,a+1);
if (n>2 || n==0) printf("-1 -1\n");
if (n==2)
{
int cnt=0;
while(a%2==0)++cnt,a>>=1;
int b=a*a/2,c=a*a/2+1;
while(cnt--)b<<=1,c<<=1;
printf("%d %d\n",b,c);
}
}
}
Tree and Permutation
#include<bits/stdc++.h>
#define mul(a,b,c) (1LL*(a)*(b)%(c))
#define inv(a,b) pow(a,(b)-2,b)
using namespace std;
int T,n,a;
const int M=1e9+7;
const int N=200010;
typedef int ll;
ll pow(ll a,ll b,ll m)
{
ll r=1;
for(a%=m; b; b>>=1,a=mul(a,a,m))
if(b&1)r=mul(r,a,m);
return r;
}
struct Factorial//预处理阶乘及对应的逆元
{
vector<ll> fac,ifac;
ll M;
Factorial(int N,ll M):fac(N,1),ifac(N,1),M(M)
{
for(int i=1; i<N; ++i)fac[i]=mul(fac[i-1],i,M);
ifac[N-1]=inv(fac[N-1],M);
for(int i=N-1; i; --i)ifac[i-1]=mul(ifac[i],i,M);
}
ll c(int n,int m)
{
return mul(mul(fac[n],ifac[m],M),ifac[n-m],M);
}
ll lucas(ll n,ll m)//卢卡斯定理求C(n,m)%M,适用于模数M小于N的情况,或者m较小的时候也可以暴力求
{
return !m?1:
n<m||n%M<m%M?0:
n<M&&m<M?c(n,m):
mul(lucas(n/M,m/M),lucas(n%M,m%M),M);
}
} f(N,M);
int edg[N],to[N],nex[N],head[N];
int tot;
void Insert(int x,int y,int z)
{
edg[++tot]=z;
to[tot]=y;
nex[tot]=head[x];
head[x]=tot;
}
int siz[N],fa[N];
int ans;
void build(int x)
{
siz[x]=1;
for (int i=head[x]; i; i=nex[i])
{
if (to[i]==fa[x]) continue;
fa[to[i]]=x;
build(to[i]);
siz[x]+=siz[to[i]];
}
}
void DFS(int x)
{
for (int i=head[x]; i; i=nex[i])
{
if (to[i]==fa[x]) continue;
ans=(ans+mul(mul(edg[i],siz[to[i]],M),n-siz[to[i]],M))%M;
DFS(to[i]);
}
}
int main()
{
while (~scanf("%d",&n))
{
if(n==1)
{
printf("0\n");
continue;
}
ans=0;
memset(siz,0,sizeof(siz));
memset(fa,0,sizeof(fa));
memset(head,0,sizeof(head));
tot=0;
for (int i=1; i<n; ++i)
{
int x,y,l;
scanf("%d%d%d",&x,&y,&l);
Insert(x,y,l);
Insert(y,x,l);
}
build(1);
DFS(1);
ans=mul(ans,mul(f.fac[2],f.fac[n-1],M),M);
printf("%d\n",ans);
}
}
YJJ’s Salesman
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=100000+10;
struct point
{
int x,y,v;
}p[maxn];
bool cmp(point a,point b){return a.x==b.x?a.y>b.y:a.x<b.x;}
struct node
{
int l,r,v;
}t[maxn*4];
int T,n,cnt,ans;
int tmp[maxn];
void build(int cur,int l,int r)
{
t[cur].l=l; t[cur].r=r; t[cur].v=0;
if (l==r) return ;
int mid=(l+r)/2;
build(cur*2,l,mid);
build(cur*2+1,mid+1,r);
}
int query(int cur,int l,int r)
{
if ((t[cur].l==l)&&(t[cur].r==r)) return t[cur].v;
int mid=(t[cur].l+t[cur].r)/2;
if (r<=mid) return query(cur*2,l,r);
else if (l>mid) return query(cur*2+1,l,r);
else return max(query(cur*2,l,mid),query(cur*2+1,mid+1,r));
}
void update(int cur,int pos,int val)
{
if (t[cur].l==t[cur].r)
{
t[cur].v=max(t[cur].v,val);
return ;
}
int mid=(t[cur].l+t[cur].r)/2;
if (pos<=mid) update(cur*2,pos,val);
else update(cur*2+1,pos,val);
t[cur].v=max(t[cur*2].v,t[cur*2+1].v);
}
int main()
{
scanf("%d",&T);
while (T--)
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].v);
tmp[i]=p[i].y;
}
sort(tmp+1,tmp+n+1);
cnt=unique(tmp+1,tmp+n+1)-tmp;
sort(p+1,p+n+1,cmp);
build(1,0,n);
ans=0;
for (int i=1;i<=n;i++)
{
int y=lower_bound(tmp+1,tmp+n+1,p[i].y)-tmp;
int val=query(1,0,y-1)+p[i].v;
ans=max(ans,val);
update(1,y,val);
}
printf("%d\n",ans);
}
return 0;
}