记一次雪崩的div2
A. Joysticks
这种pj-难度的题WA4次我的心好痛
果然要认真读题TAT
题意: 给你两个电池,每回合可以充电一个,电量+1,另外一个电量-2。
当一个电池的电量为0游戏结束,问你最大可能进行的回合。
每次给最小的充电= =
死于1 1这个数据,答案是0,全机房的人都被坑了= =,最后发现翻译的时候没注意一个条件TAT.
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define maxn 100001
int main()
{
int a,b,ans=0;
scanf("%d%d",&a,&b);
if(a<=1&&b<=1){printf("0");return 0;}
while(a>0&&b>0)
{
if(a<b)a++,b-=2;
else b++,a-=2;
ans++;
}
printf("%d",ans);
}
B.Beautiful Paintings
同样水题
pj难度
题意:如果有相邻两个元素a[i+1]>a[i],则优美度++.
求一种排列方式使这个数列的优美度最大.
排序+桶,for1000次,每次ans+=能-1的桶的个数-1,每个桶权值-1.
可能有更好的O(n).
当时感觉自己已经gg了要快点打题所以没有继续想O(n)了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define maxn 100001
int a[maxn],dog[maxn];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(1+a,1+a+n);
int cnt=0;
for(int i=1;i<=n;i++)
{
if(a[i]!=a[i-1])cnt++;
dog[cnt]++;
}
int anss=0;
for(int i=1;i<=1000;i++)
{
int ans=0;
for(int j=1;j<=cnt;j++)
if(dog[j])dog[j]--,ans++;
if(!ans)break;
else anss+=ans-1;
}
printf("%d",anss);
return 0;
}
C.Watchmen
tg难度吧= =
题意:给你一堆点问你有多少点对间曼哈顿距离=欧几里得距离
很简单= =就是问你在同一横坐标和同一纵坐标上的点对个数
大概是tg第二题的难度
map随意水过= =记得要减去相同的点的重复答案.
FST辣!死因:判相同的点的时候出了点bug导致把第0个点(0,0)也考虑了,第40多个点200000个0 0..
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
#define maxn 200001
struct edge{
int l,r;
}a[maxn];
bool cmp(const edge A,const edge B)
{
return (A.l<B.l)||(A.r<B.r&&A.l==B.l);
}
bool cmp1(const edge A,const edge B)
{
return A.r<B.r;
}
bool g[maxn];
map<int,int>L;
map<int,int>R;
int main()
{
int n,anss=1;
long long ans=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i].l,&a[i].r);
sort(1+a,1+a+n,cmp);
for(int i=1;i<=n;i++)
{
anss++;
if(a[i].l!=a[i-1].l||a[i-1].r!=a[i].r||i==1)anss=0;
else ans-=anss;
}
for(int i=1;i<=n;i++)
{
ans+=L[a[i].l]+R[a[i].r];
L[a[i].l]++,R[a[i].r]++;
}
printf("%I64d",ans);
return 0;
}
D.Image Preview
同样的tg难度= =
大概是第二题的难度
题意看题目吧= =
随意搞啊= =单调队列什么的都可以
我用的模拟,先找到一边最远然后用两个指针移一下找最大
FST again 没有扫两遍TAT
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define maxn 500001
char s[maxn],s1[maxn];
long long A[maxn],B[maxn];
int main()
{
int n,a,b,T,R;
scanf("%d%d%d%d",&n,&a,&b,&T);
scanf("%s",s);
A[0]=-a;
for(int i=1;i<=n;i++)
{
A[i]=A[i-1]+a+1+(s[i-1]=='h'?0:b);
if(A[i]>T){R=i-1;break;}
}
if(A[1]>T){printf("0");return 0;}
if(!R)R=n;
int ans=R,L=n;
long long L2=a*(R-1);
while(R!=0)
{
while(L2+A[R]+a+1+(s[L-1]=='h'?0:b)<=T&&R+n-L<n)
L2+=a+1+(s[L-1]=='h'?0:b),L--;
ans=max(ans,R+n-L);
if(ans>=n){printf("%d",ans);return 0;}
R--;L2-=a;
}
memset(A,0,sizeof(A));
memset(B,0,sizeof(B));
for(int i=1;i<n;i++)s1[i]=s[i];
for(int i=1;i<n;i++)s[i]=s1[n-i];
A[0]=-a;
for(int i=1;i<=n;i++)
{
A[i]=A[i-1]+a+1+(s[i-1]=='h'?0:b);
if(A[i]>T){R=i-1;break;}
}
if(A[1]>T){printf("0");return 0;}
if(!R)R=n;
L=n;
L2=a*(R-1);
while(R!=0)
{
while(L2+A[R]+a+1+(s[L-1]=='h'?0:b)<=T&&R+n-L<n)
L2+=a+1+(s[L-1]=='h'?0:b),L--;
ans=max(ans,R+n-L);
if(ans>=n){printf("%d",ans);return 0;}
R--;L2-=a;
}
printf("%d",ans);
}
最后FST后自己不想多打复制了一下导致代码很丑= =
E.Table Compression
大概是tg第三题或者tg第三题+吧= =
只看了题目大约意思是给你一个n*m的矩阵让你把它离散后使得每行每列的大小关系不变
要求矩阵中最大值最小
个人感觉跟topo图有关
反正没时间打了= =A题太狗血(还是自己太弱)
ENDING
FST了个爽咯
退役前应该上不了紫名了TAT