专栏文章
题解:CF1974F Cutting Game
CF1974F题解参与者 2已保存评论 1
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @miqlifwt
- 此快照首次捕获于
- 2025/12/04 06:45 3 个月前
- 此快照最后确认于
- 2025/12/04 06:45 3 个月前
纯纯搞笑题。
把每一次操作后剩下的矩阵存下来( 左右端点, 左右端点),然后对每一个棋子计算它的贡献,显然可以二分出它最后出现在哪里,那么这个棋子就算当时删矩阵的那个人,即后面一个
CPPconst int N=2e5+5;
int x[N],y[N];
struct node{
int lx,rx,ly,ry;
}p[N];
bool check(int id,int num){
return x[id]<=p[num].rx&&x[id]>=p[num].lx&&y[id]<=p[num].ry&&y[id]>=p[num].ly;
}//是否在剩下的矩阵中
void sol(){
int a,b,n,m;
cin>>a>>b>>n>>m;
for (int i=1;i<=n;i++) cin>>x[i]>>y[i];
int lx=1,ly=1,rx=a,ry=b;
for (int i=1;i<=m;i++){
char c;
int k;
cin>>c>>k;
if (c=='U') lx+=k;
if (c=='D') rx-=k;
if (c=='L') ly+=k;
if (c=='R') ry-=k;
p[i]={lx,rx,ly,ry};//存下剩下的矩阵
}
int ans1=0,ans2=0;
for (int i=1;i<=n;i++){
int L=1,R=m,Ans=-1;
while (L<=R){
int mid=(L+R)>>1;
if (check(i,mid)) Ans=mid+1,/*一定要在这里 +1!!!*/L=mid+1;
else R=mid-1;
}
if (Ans!=m+1){
if (Ans&1) ans1++;
else ans2++;
}
}
cout<<ans1<<' '<<ans2<<endl;
}
二分时注意 要 ,原因上面已经解释了。
相关推荐
评论
共 1 条评论,欢迎与作者交流。
正在加载评论...