比赛时间:2018.10.17 选手:lrllrl 得分:100+50+0 用时:2小时
大模拟一下就行了。
#include<cstdio>
const int N=510;
struct exe{
char name[25];
int st,ed,pm;
}e[N];
int n,m;
int main()
{
//freopen("exercise.in","r",stdin);
//freopen("exercise.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
scanf("%s%d%d%d",e[i].name,&e[i].st,&e[i].ed,&e[i].pm);
for(int i=1;i<=m;i++)
{
e[i].pm--;n+=e[i].st-e[i-1].ed-1;
if(n-e[i].pm*(e[i].ed-e[i].st+1)>0)
{
n-=e[i].pm*(e[i].ed-e[i].st+1);continue;
}
else
{
int t=n/e[i].pm;if(t*e[i].pm<n)t++;
printf("Runtime Error\n%d\n",e[i].st+t-1);return 0;
}
}
n+=1440-e[m].ed;
printf("Accepted\n%d\n",n);
return 0;
}
打了个迭代深搜,TLE一半的点,交到codevs又是秒过的……后来把重量降序排序后过了学校的羊毛机。(气死了QAQ)
#include<cstdio>
#include<algorithm>
using namespace std;
int n,w,c[20],weight[20],Find;
int cmp(const int &a,const int &b){return a>b;}
void dfs(int now,int cnt,int lim)
{
if(Find)return;if(cnt>lim)return;
if(now==n+1){Find=1;return;}
for(int i=1;i<=cnt;i++)
if(weight[i]+c[now]<=w)
weight[i]+=c[now],dfs(now+1,cnt,lim),weight[i]-=c[now];
weight[cnt+1]=c[now];dfs(now+1,cnt+1,lim);weight[cnt+1]=0;
}
int main()
{
//freopen("catclimb.in","r",stdin);
//freopen("catclimb.out","w",stdout);
scanf("%d%d",&n,&w);
for(int i=1;i<=n;i++)
scanf("%d",&c[i]);
sort(c+1,c+n+1,cmp);
for(int i=1;i<=n;i++){dfs(1,1,i);if(Find){printf("%d\n",i);return 0;}}
}
这题一看裸的平衡树板子题,然后我背不到板子qwq
折腾半天splay样例都没过,后来发现是忘了排除-INF和INF的干扰qwq
结果后来提交还是不过,暴力也没了QAQ
写了个treap
#include<cstdio>
#include<cstdlib>
#define ls t[x].ch[0]
#define rs t[x].ch[1]
const int N=3e5+10;
struct treap{
int ch[2],val,size,cnt,rd;
}t[N];
int root,cnt,n,m,hp[N];
void up(int x){t[x].size=t[ls].size+t[rs].size+t[x].cnt;}
void Rotate(int &x,int d)//d==0左儿子旋,d==1右儿子旋
{
int son=t[x].ch[d];
t[x].ch[d]=t[son].ch[d^1];
t[son].ch[d^1]=x;up(x);up(x=son);
}
void Insert(int &x,int val)
{
if(!x)
{
x=++cnt;t[x].cnt=t[x].size=1;
t[x].val=val;t[x].rd=rand();
return;
}
t[x].size++;
if(t[x].val==val){t[x].cnt++;return;}
int d=t[x].val<val;Insert(t[x].ch[d],val);
if(t[x].rd>t[t[x].ch[d]].rd)Rotate(x,d);
}
void Erase(int &x,int val)
{
if(!x)return;//防止越界
if(t[x].val==val)
{
if(t[x].cnt>1){t[x].cnt--,t[x].size--;return;}//有相同的就直接--
bool d=t[ls].rd>t[rs].rd;
if(ls*rs==0)x=ls+rs;
else Rotate(x,d),Erase(x,val);
}
else t[x].size--,Erase(t[x].ch[t[x].val<val],val);
}
int kth(int root,int k)
{
int x=root;
while(1)
{
if(k<=t[ls].size)x=ls;
else if(k>t[ls].size+t[x].cnt)
k-=t[ls].size+t[x].cnt,x=rs;
else return t[x].val;
}
}
int main()
{
//freopen("in.txt","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&hp[i]),Insert(root,hp[i]);
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
char op[5];
int x,y;
scanf("%s",op);
if(*op=='A'){scanf("%d%d",&x,&y);Erase(root,hp[x]);hp[x]-=y;if(hp[x]>0)Insert(root,hp[x]);else n--;}
else if(*op=='C'){scanf("%d%d",&x,&y);Erase(root,hp[x]);hp[x]+=y;Insert(root,hp[x]);}
else
{
scanf("%d",&x);
if(x>n)puts("-1");
else printf("%d\n",kth(root,n-x+1));
}
}
printf("%d\n",n);
return 0;
}
赛后总结
打这套题的时候感觉很简单,于是就飘了。T2我还想着要不要排序,后来又想迭代深搜不该有问题的……T3在平衡树记不清板子的情况下头铁去写,生动形象地诠释了铁头娃的内涵。
最后rank倒数……老子认真了