2017.10.25 模拟赛
分类:
IT文章
•
2022-02-28 15:57:57

题目链接
T1
贪心或二分答案
#include <algorithm>
#include <cstring>
#include <cctype>
#include <cstdio>
#define N 100005
using namespace std;
int n;
struct node
{
int Ti,Si;
bool operator<(node a)const
{
return Si<a.Si;
}
}Task[N];
int main()
{
freopen("manage.in","r",stdin);
freopen("manage.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d%d",&Task[i].Ti,&Task[i].Si);
sort(Task+1,Task+n+1);
bool flag=false;
int tim=0,ans=0x3f3f3f3f;
for(int i=1;i<=n;i++)
{
if(tim+Task[i].Ti>Task[i].Si)
{
flag=true;
break;
}
tim+=Task[i].Ti;
ans=min(ans,Task[i].Si-tim);
}
if(flag) puts("-1");
else printf("%d
",ans);
fclose(stdin); fclose(stdout);
return 0;
}
贪心
#include <algorithm>
#include <cstdio>
inline void read(int &x)
{
x=0; register char ch=getchar();
for(; ch>'9'||ch<'0'; ) ch=getchar();
for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0';
}
const int N(100005);
struct Work {
int t,s;
bool operator < (const Work&x)const
{
if(s==x.s) return t<x.t;
return s<x.s;
}
}job[N];
int ans=-1,L,R,Mid,n;
inline bool check(int x)
{
for(int i=1; i<=n; ++i)
{
if(x+job[i].t>job[i].s) return 0;
x+=job[i].t;
}
return 1;
}
int Presist()
{
freopen("manage.in","r",stdin);
freopen("manage.out","w",stdout);
read(n);
for(int t,i=1; i<=n; ++i)
read(job[i].t),read(job[i].s);
std::sort(job+1,job+n+1);
for(R=job[1].s-job[1].t+1; L<=R; )
{
Mid=L+R>>1;
if(check(Mid))
{
ans=Mid;
L=Mid+1;
}
else R=Mid-1;
}
printf("%d
",ans);
return 0;
}
int Aptal=Presist();
int main(int argc,char**argv){;}
二分
T2
sum[i]为前缀和,num[i]为i颜色的数量
那么i这种颜色对答案的贡献就是C(sum[i]-1,num[i]-1)%mod;
因为i的最后一个不能放到i+1最后一个的前面,所以要减一
分步乘法原理。
#include <cstdio>
#include <cctype>
#define Mod 998244353
#define N 1000070
typedef long long LL;
inline void read(LL &x)
{
bool f=0;register char ch=getchar();
for(x=0;!isdigit(ch);ch=getchar()) if(ch=='-') f=1;
for(;isdigit(ch);x=x*10+ch-'0',ch=getchar());
x=f?-x:x;
}
LL n,ans=1,num[N],sum[N],f[N],fac[N],inv[N];
void init()
{
f[0]=inv[0]=fac[0]=f[1]=inv[1]=fac[1]=1;
for(LL i=2;i<=N;++i)
{
fac[i]=(fac[i-1]%Mod*i%Mod)%Mod;
f[i]=(Mod-Mod/i)*f[Mod%i]%Mod;
inv[i]=(inv[i-1]%Mod*f[i]%Mod)%Mod;
}
}
LL C(LL m,LL n)
{
if(n>m) return 1;
return fac[m]%Mod*inv[n]%Mod*inv[m-n]%Mod;
}
void print(LL ans)
{
if(ans/10) print(ans/10);
putchar(ans%10+'0');
}
int main(int argc,char *argv[])
{
freopen("qiang.in","r",stdin);
freopen("qiang.out","w",stdout);
read(n);
for(LL i=1;i<=n;++i) read(num[i]),sum[i]=sum[i-1]+num[i];
init();
for(LL i=2;i<=n;++i) ans=(ans%Mod*C(sum[i]-1,num[i]-1)%Mod)%Mod;
print(ans);
fclose(stdin); fclose(stdout);
return 0;
}
std
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cctype>
#define N 100005
using namespace std;
typedef long long LL;
inline void read(LL &x)
{
bool f=0;register char ch=getchar();
for(x=0;!isdigit(ch);ch=getchar()) if(ch=='-') f=1;
for(;isdigit(ch);x=x*10+ch-'0',ch=getchar());
x=f?-x:x;
}
LL tag[N],val[N<<2|1];
int n,q,a[N],x[N],y[N],cnt[N<<2|1],mid[N<<2|1];
struct node
{
int x,y,id;
bool operator<(node a)const
{
if(x==a.x) return y<a.y;
else return x<a.x;
}
}b[N];
inline int lowbit(int &x) {return x&(-x);}
inline void add(int x,int y) {for(;x<=n;x+=lowbit(x)) tag[x]+=y;}
inline LL ask(int x)
{
LL ret=0;
for(;x;x-=lowbit(x)) ret+=tag[x];
return ret;
}
void build(int k,int l,int r)
{
if(l==r) {val[k]=ask(y[l])-ask(x[l]-1);return;}
mid[k]=(l+r)>>1;
build(k<<1,l,mid[k]);
build(k<<1|1,mid[k]+1,r);
val[k]=val[k<<1]+val[k<<1|1];
}
void modify(int k,int l,int r,int t)
{
if(l==r) {val[k]=ask(y[l])-ask(x[l]-1);return;}
if(t<=mid[k]) modify(k<<1,l,mid[k],t);
else modify(k<<1|1,mid[k]+1,r,t);
val[k]=val[k<<1]+val[k<<1|1];
}
LL query(int k,int l,int r,int x,int y)
{
if(l>=x&&r<=y) return val[k];
LL ret=0;
if(x<=mid[k]) ret+=query(k<<1,l,mid[k],x,y);
if(y>mid[k]) ret+=query(k<<1|1,mid[k]+1,r,x,y);
return ret;
}
int main(int argc,char *argv[])
{
freopen("sum.in","r",stdin);
freopen("sum.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&a[i]),add(i,a[i]);
for(int i=1;i<=n;++i)
{
scanf("%d%d",&x[i],&y[i]);
b[i].x=x[i];
b[i].y=y[i];
b[i].id=i;
}
build(1,1,n);
sort(b+1,b+1+n);
scanf("%d",&q);
for(int opt,l,r;q--;)
{
scanf("%d%d%d",&opt,&l,&r);
if(opt==1)
{
add(l,r-a[l]),a[l]=r;
for(int i=1;i<=n;++i)
{
if(b[i].x<=l) modify(1,1,n,b[i].id);
else break;
}
}
else cout<<query(1,1,n,l,r)<<"
";
}
fclose(stdin); fclose(stdout);
return 0;
}