社区讨论
QOJ上AC,luogu 29pts求条
P5208[WC2019] I 君的商店参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mje7rhvd
- 此快照首次捕获于
- 2025/12/20 19:27 3 个月前
- 此快照最后确认于
- 2025/12/22 21:20 3 个月前
CPP
//#include "shop.h"
#include<bits/stdc++.h>
int query(int *S, int nS, int *T, int nT);
int call(int *S,int nS,int *T,int nT){
for(int i = 0; i < nS; i ++)
S[i] --;
for(int i = 0; i < nT; i ++)
T[i] --;
return query(S,nS,T,nT);
}
void set_a(int x,int y,int *ans){
ans[x - 1] = y;
}
int a[5],b[5],ft[100009],cnt;
std :: queue<int>q;
void find_price(int task_id, int N, int K, int ans[]) {
if(task_id == 3){//task 3,monotonic sequence
a[0] = 1;
b[0] = N;
if(call(a,1,b,1)){
//puts("f0");
int l = 0,r = N;
while(l + 2 < r){
int mid = (l + r) >> 1;
a[0] = mid;
a[1] = mid + 1;
b[0] = N;
if(call(a,2,b,1))
l = mid;
else
r = mid + 1;
}
//printf("%d %d\n",l,r);
if(((N - r + 1) & 1) != K)
set_a(r - 1,1,ans);
else
set_a(r - 1,0,ans);
for(int i = 1; i <= l; i ++)
set_a(i,0,ans);
for(int i = r; i <= N; i ++)
set_a(i,1,ans);
}
else{
int l = 1,r = N + 1;
while(l + 2 < r){
int mid = (l + r) >> 1;
a[0] = mid;
a[1] = mid + 1;
b[0] = 1;
if(!call(a,2,b,1))
l = mid;
else
r = mid + 1;
}
if(((l) & 1) != K)
set_a(r - 1,1,ans);
else
set_a(r - 1,0,ans);
for(int i = 1; i <= l; i ++)
set_a(i,1,ans);
for(int i = r; i <= N; i ++)
set_a(i,0,ans);
}
}
else{
while(!q.empty())
q.pop();
for(int i = 2; i <= N; i ++){
q.push(i);
}
ft[cnt = 1] = 1;
while(!q.empty()){
int d = q.front();
q.pop();
if(!q.empty()){
int e = q.front();
q.pop();
a[0] = d;
a[1] = e;
b[0] = ft[cnt];
int x = call(a,2,b,1);
b[0] = e;
a[0] = d;
int y = call(a,1,b,1);
//printf("%d %d %d %d\n",d - 1,e - 1,x,y);
if(x && y){
set_a(d,0,ans);
q.push(e);
}
else if(x && (!y)){
set_a(e,0,ans);
q.push(d);
}
else if((!x) && y){
cnt ++;
ft[cnt] = e;
q.push(d);
}
else{
cnt ++;
ft[cnt] = d;
q.push(e);
}
}
else{
if(cnt != 1){
int e = ft[cnt - 1];
a[0] = d;
a[1] = e;
b[0] = ft[cnt];
int x = call(a,2,b,1);
b[0] = e;
a[0] = d;
int y = call(a,1,b,1);
//printf(" %d %d %d %d\n",d - 1,e - 1,x,y);
if(x && y){
set_a(d,0,ans);
}
else if(x && !y){
set_a(e,0,ans);
ft[cnt - 1] = d;
}
else if((!x) && (!y)){
cnt ++;
ft[cnt] = d;
}
else{
int l = 0,r = cnt - 1;
while(l + 1 < r){
int mid = (l + r) >> 1;
a[0] = ft[mid];
b[0] = d;
if(call(a,1,b,1))
l = mid;
else
r = mid;
}
for(int i = cnt; i >= r; i --)
ft[i + 1] = ft[i];
ft[r] = d;
cnt ++;
}
}
else{
a[0] = d;
b[0] = ft[cnt];
cnt ++;
ft[cnt] = ft[cnt - 1];
ft[1 + call(b,1,a,1)] = d;
}
}
}
int l = 0,r = cnt;
while(l + 2 < r){
int mid = (l + r) >> 1;
a[0] = ft[mid];
a[1] = ft[mid + 1];
b[0] = N;
if(call(a,2,b,1))
l = mid;
else
r = mid + 1;
}
if(((cnt - r + 1) & 1) != K)
set_a(ft[r - 1],1,ans);
else
set_a(ft[r - 1],0,ans);
for(int i = 1; i <= l; i ++)
set_a(ft[i],0,ans);
for(int i = r; i <= cnt; i ++)
set_a(ft[i],1,ans);
//for(int i = 1; i <= cnt; i ++){
// printf("%d\n",ft[i] - 1);
//}
}
}
/*
3 3
15 100
000000011111111
15 100
111111111110000
15 100
111111111111111
3 1
15 100
110101101100000
15 100
001010110011000
15 100
011011100011011
*/
回复
共 0 条回复,欢迎继续交流。
正在加载回复...